(???) !DOCTYPE html>
 (???) html lang="en">
 (???)  <head>
 (???)    <meta charset="utf-8">
 (???)    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 (???)    <title>TETRIS.COM</title>
 (???)    <link href="/black-no6.css" rel="stylesheet">
 (???)    <link rel="alternate" type="application/rss+xml" title="RSS Feed" href="https://joriszwart.nl/feed/rss.xml">
 (???)    <link rel="alternate" type="application/atom+xml" title="Atom Feed" href="https://joriszwart.nl/feed/atom.xml">
 (???)    <link rel="alternate" type="application/json" title="JSON Feed" href="https://joriszwart.nl/feed/feed.json">
 (???)    <meta property="og:title" content="TETRIS.COM">
 (???)    <meta property="og:description" content="TETRIS.COM">         
 (???)    <meta property="og:image" content="https://joriszwart.nl/games/tetris.com/tetris.com-1663.png">   
 (???)    <meta property="og:url" content="https://joriszwart.nl/games/tetris.com">
 (???)    
 (???)  </head>
 (???)  <body>
 (???)    <nav class="fixed-top sticky light">
 (???)      
 (???)      <ul>
 (???)        <li><a href="/articles">My articles</a></li>
 (???)        <li><a href="/games">My games</a></li>
 (???)        <li><a href="/projects">My projects</a></li>
 (???)        <li><a href="/talks">My talks</a></li>
 (???)        <li><a href="/contact">Contact</a></li>
 (???)      </ul>
 (???)    </nav>
 (???)    <header>
 (???)      
 (???)      <a href="/">
 (???)        
 (???)        <img src="/images/joriszwart-logo.png" alt="joriszwart.nl" width="577" height="74">
 (???)        <p class="uppercase">Tetris
 (???)  </p>
 (???)      </a>
 (???)    </header>
 (???)    <main>
 (???)    
 (???)      <article>
 (???)        <header>
 (???)          <div class="tags" aria-label="tags">
 (???)            <a href="/tags/100-assembly" rel="tag">100% assembly</a>
 (???)            <a href="/tags/80x86" rel="tag">80x86</a>
 (???)            <a href="/tags/a-language-a-year-keeps-the-doc-away" rel="tag">A language a year keeps the doc away</a>
 (???)            <a href="/tags/ipx" rel="tag">IPX</a>
 (???)            <a href="/tags/ms-dos%e2%84%a2" rel="tag">MS-DOS™</a>
 (???)            <a href="/tags/retro" rel="tag">Retro</a>
 (???)            <a href="/tags/tetris" rel="tag">Tetris</a>
 (???)            <a href="/tags/vga" rel="tag">VGA</a>
 (???)          </div>
 (???)        </header>
 (???)         <h1 id="tetriscom">TETRIS.COM</h1>
 (???) h2 id="introduction">Introduction</h2>
 (???) p>TETRIS.COM<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> is a game written using 80386 assembler in the so-called<abbr title="Video Graphics Array">VGA</abbr> mode 13h<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> for <a href="/tags/ms-dos%E2%84%A2">MS-DOS™</a>.</p>
 (???) p>Without much <a href="/tags/code-golf">code golfing</a> the result is a compressed<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> executable of 1663 bytes. This is less than
 (???) he size of the screenshot (68%, 2429 bytes optimized PNG)!</p>
 (???) figure>
 (???) p><img src="/games/tetris.com/tetris.com-1663.png" alt="tetris.com single player screenshot"></p>
 (???) figcaption>TETRIS.COM - single player</figcaption>
 (???) /figure>
 (???) h2 id="features">Features</h2>
 (???) ul>
 (???) li>single player</li>
 (???) li>two player over <abbr title="Internetwork Packet Exchange">IPX</abbr></li>
 (???) li>a font created by using the standard BIOS font, modify it with code which results in a (ugly) stencil-like look</li>
 (???) /ul>
 (???) h2 id="source-code">Source code</h2>
 (???) p>Probably on a 1.44″ floppy somewhere, but here are some disassembled snippets. Back by popular demand.</p>
 (???) p>The source code is 23 kB and approximately 1200 lines, including
 (???) he graphics. It is written in Borland&rsquo;s Turbo Assembler syntax.</p>
 (???) h3 id="the-build-script">The build script</h3>
 (???) p>The build script assembles the source using as many passes as needed (<code>-m</code>), then links using
 (???) he TINY memory model. To pack the file from ~8 kB to the mentioned 1663 bytes a
 (SND) o-called executable packer<sup id="fnref1:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> is used.</p>
 (???) pre class="BAT">
 (???) code id="l1"><span class="ident">tasm</span> <span class="ident">tetris</span>.<span class="ident">asm</span> -<span class="ident">m</span></code>
 (???) code id="l2"><span class="ident">tlink</span> <span class="ident">tetris</span> -<span class="ident">t</span></code>
 (???) code id="l3"><span class="ident">apack</span> <span class="ident">tetris</span>.<span class="ident">com</span> <span class="ident">tetris</span>.<span class="ident">com</span></code>
 (???) code id="l4"></code></pre><h3 id="initialization">Initialization</h3>
 (???) pre class="80x86">
 (???) code id="l1">        .<span class="ident">model</span> <span class="ident">tiny</span></code>
 (???) code id="l2">        .<span class="ident">code</span></code>
 (???) code id="l3">        <span class="float">.386</span></code>
 (???) code id="l4"></code>
 (???) code id="l5">        <span class="ident">include</span> <span class="ident">blocks</span>.<span class="ident">inc</span></code>
 (???) code id="l6">        <span class="ident">include</span> <span class="ident">font</span>.<span class="ident">inc</span></code>
 (???) code id="l7"></code>
 (???) code id="l8">;        <span class="ident">jumps</span></code>
 (???) code id="l9"></code>
 (???) code id="l10">        <span class="ident">org</span> <span class="int">100</span><span class="ident">h</span></code>
 (???) code id="l11"></code>
 (???) code id="l12"></code>
 (???) code id="l13"><span class="ident">start</span>:  <span class="ident">mov</span> <span class="ident">ax</span>,<span class="int">1</span><span class="ident">a00h</span></code>
 (???) code id="l14">        <span class="ident">int</span> <span class="int">10</span><span class="ident">h</span></code>
 (???) code id="l15">        <span class="ident">cmp</span> <span class="ident">al</span>,<span class="int">1</span><span class="ident">ah</span></code>
 (???) code id="l16">        <span class="ident">jne</span> <span class="ident">novga</span></code>
 (???) code id="l17">        <span class="ident">cmp</span> <span class="ident">bl</span>,<span class="int">7</span></code>
 (???) code id="l18">        <span class="ident">jb</span> <span class="ident">novga</span></code>
 (???) code id="l19">        <span class="ident">jmp</span> <span class="ident">ok</span></code>
 (???) code id="l20"><span class="ident">novga</span>:  <span class="ident">mov</span> <span class="ident">dx</span>,<span class="ident">offset</span> <span class="ident">errmsg</span></code>
 (???) code id="l21">        <span class="ident">mov</span> <span class="ident">ah</span>,<span class="int">9</span></code>
 (???) code id="l22">        <span class="ident">int</span> <span class="int">21</span><span class="ident">h</span></code>
 (???) code id="l23">        <span class="ident">ret</span></code>
 (???) code id="l24"></code>
 (???) code id="l25"><span class="ident">errmsg</span>  <span class="ident">db</span> <span class="char">&#39;No VGA detected&#39;</span>,<span class="int">13</span>,<span class="int">10</span>,<span class="char">&#39;$&#39;</span></code>
 (???) code id="l26"></code>
 (???) code id="l27"><span class="ident">ok</span>:     <span class="ident">xor</span> <span class="ident">bx</span>,<span class="ident">bx</span>      ;<span class="ident">set</span> <span class="ident">keyboard</span> <span class="ident">rate</span>&amp;<span class="ident">delay</span> <span class="ident">fast</span>!</code>
 (???) code id="l28">        <span class="ident">mov</span> <span class="ident">ax</span>,<span class="int">305</span><span class="ident">h</span></code>
 (???) code id="l29">        <span class="ident">int</span> <span class="int">16</span><span class="ident">h</span></code>
 (???) code id="l30">        <span class="ident">call</span> <span class="ident">init</span></code>
 (???) code id="l31">        <span class="ident">call</span> <span class="ident">drawbucket</span></code>
 (???) code id="l32">        ...</code>
 (???) code id="l33"></code></pre><h3 id="drawing-a-tetromino">Drawing a tetromino</h3>
 (???) pre class="80x86">
 (???) code id="l1"><span class="ident">putblock</span> <span class="ident">proc</span>        </code>
 (???) code id="l2">        <span class="ident">call</span> <span class="ident">calcpos</span></code>
 (???) code id="l3">        <span class="ident">mov</span> <span class="ident">dx</span>,<span class="int">4</span></code>
 (???) code id="l4"><span class="ident">copybrick</span>:</code>
 (???) code id="l5">        <span class="ident">mov</span> <span class="ident">bp</span>,<span class="ident">di</span></code>
 (???) code id="l6">        <span class="ident">add</span> <span class="ident">di</span>,<span class="ident">word</span> <span class="ident">ptr</span> [<span class="ident">offset</span> <span class="ident">data_147</span>+<span class="ident">bx</span>]</code>
 (???) code id="l7">        <span class="ident">mov</span> <span class="ident">cx</span>,<span class="int">8</span></code>
 (???) code id="l8"></code>
 (???) code id="l9"><span class="ident">copyrow</span>:</code>
 (???) code id="l10">        <span class="ident">movsw</span>          ; <span class="ident">copy</span> <span class="int">8</span> <span class="ident">bytes</span></code>
 (???) code id="l11">        <span class="ident">movsw</span></code>
 (???) code id="l12">        <span class="ident">movsw</span></code>
 (???) code id="l13">        <span class="ident">movsw</span></code>
 (???) code id="l14">        <span class="ident">add</span> <span class="ident">di</span>,<span class="int">320</span>-<span class="int">8</span></code>
 (???) code id="l15">        <span class="ident">loop</span> <span class="ident">copyrow</span></code>
 (???) code id="l16"></code>
 (???) code id="l17">        <span class="ident">mov</span> <span class="ident">di</span>,<span class="ident">bp</span></code>
 (???) code id="l18">        <span class="ident">add</span> <span class="ident">bx</span>,<span class="int">2</span></code>
 (???) code id="l19">        <span class="ident">dec</span> <span class="ident">dx</span></code>
 (???) code id="l20">        <span class="ident">jnz</span> <span class="ident">copybrick</span></code>
 (???) code id="l21">        <span class="ident">ret</span></code>
 (???) code id="l22"><span class="ident">putblock</span> <span class="ident">endp</span></code>
 (???) code id="l23"></code></pre><h3 id="calculate-position-of-a-tetromino">Calculate position of a tetromino</h3>
 (???) pre class="80x86">
 (???) code id="l1"><span class="ident">calcpos</span> <span class="ident">proc</span>        </code>
 (???) code id="l2">        <span class="ident">mov</span> <span class="ident">ax</span>,<span class="int">0</span><span class="ident">a000h</span></code>
 (???) code id="l3">        <span class="ident">mov</span> <span class="ident">es</span>,<span class="ident">ax</span></code>
 (???) code id="l4">        <span class="ident">mov</span> <span class="ident">cl</span>,<span class="int">5</span></code>
 (???) code id="l5">        <span class="ident">shl</span> <span class="ident">si</span>,<span class="ident">cl</span></code>
 (???) code id="l6">        <span class="ident">mov</span> <span class="ident">cl</span>,<span class="int">3</span></code>
 (???) code id="l7">        <span class="ident">shl</span> <span class="ident">di</span>,<span class="ident">cl</span></code>
 (???) code id="l8">        <span class="ident">mov</span> <span class="ident">dx</span>,<span class="ident">si</span></code>
 (???) code id="l9">        <span class="ident">add</span> <span class="ident">dx</span>,<span class="ident">di</span></code>
 (???) code id="l10">        <span class="ident">mov</span> <span class="ident">cl</span>,<span class="int">5</span></code>
 (???) code id="l11">        <span class="ident">shl</span> <span class="ident">si</span>,<span class="ident">cl</span></code>
 (???) code id="l12">        <span class="ident">add</span> <span class="ident">si</span>,<span class="ident">offset</span> <span class="ident">data_22</span></code>
 (???) code id="l13">        <span class="ident">mov</span> <span class="ident">cl</span>,<span class="int">5</span></code>
 (???) code id="l14">        <span class="ident">shl</span> <span class="ident">di</span>,<span class="ident">cl</span></code>
 (???) code id="l15">        <span class="ident">add</span> <span class="ident">si</span>,<span class="ident">di</span></code>
 (???) code id="l16">        <span class="ident">shl</span> <span class="ident">bx</span>,<span class="int">1</span></code>
 (???) code id="l17">        <span class="ident">shl</span> <span class="ident">bp</span>,<span class="int">1</span></code>
 (???) code id="l18">        <span class="ident">mov</span> <span class="ident">di</span>,[<span class="ident">bx</span>+<span class="ident">data_17</span>]</code>
 (???) code id="l19">        <span class="ident">add</span> <span class="ident">di</span>,[<span class="ident">bp</span>+<span class="ident">data_18</span>]</code>
 (???) code id="l20">        <span class="ident">mov</span> <span class="ident">bx</span>,<span class="ident">dx</span></code>
 (???) code id="l21">        <span class="ident">ret</span></code>
 (???) code id="l22"><span class="ident">calcpos</span> <span class="ident">endp</span></code>
 (???) code id="l23"></code></pre><h3 id="clear-full-lines">Clear full lines</h3>
 (???) pre class="80x86">
 (???) code id="l1"><span class="ident">clrlines</span> <span class="ident">proc</span>          ;<span class="ident">ds</span>=<span class="ident">source</span>, <span class="ident">es</span>=<span class="ident">dest</span></code>
 (???) code id="l2">        <span class="ident">xor</span> <span class="ident">di</span>,<span class="ident">di</span></code>
 (???) code id="l3">        <span class="ident">xor</span> <span class="ident">si</span>,<span class="ident">si</span></code>
 (???) code id="l4">        <span class="ident">xor</span> <span class="ident">bp</span>,<span class="ident">bp</span>      ;<span class="ident">linect</span></code>
 (???) code id="l5"></code>
 (???) code id="l6"><span class="ident">loc_23</span>: <span class="ident">mov</span> <span class="ident">bx</span>,<span class="int">72</span>      ;<span class="int">9</span>*<span class="int">8</span></code>
 (???) code id="l7"><span class="ident">loc_24</span>: <span class="ident">cmp</span> <span class="ident">byte</span> <span class="ident">ptr</span> <span class="ident">es</span>:[<span class="ident">bx</span>+<span class="ident">di</span>],<span class="int">0</span>  ; <span class="ident">full</span>?</code>
 (???) code id="l8">        <span class="ident">je</span> <span class="ident">loc_27</span></code>
 (???) code id="l9">        <span class="ident">sub</span> <span class="ident">bx</span>,<span class="int">8</span></code>
 (???) code id="l10">        <span class="ident">jnc</span> <span class="ident">loc_24</span></code>
 (???) code id="l11">        <span class="ident">inc</span> <span class="ident">bp</span>         ;<span class="ident">linect</span>++</code>
 (???) code id="l12">        <span class="ident">mov</span> <span class="ident">ax</span>,<span class="ident">di</span></code>
 (???) code id="l13">        <span class="ident">mov</span> <span class="ident">bx</span>,<span class="ident">si</span></code>
 (???) code id="l14"></code>
 (???) code id="l15"><span class="ident">loc_25</span>: <span class="ident">mov</span> <span class="ident">dx</span>,<span class="int">8</span></code>
 (???) code id="l16"><span class="ident">loc_26</span>: <span class="ident">mov</span> <span class="ident">cx</span>,<span class="int">40</span>      ; <span class="int">10</span> <span class="ident">columns</span> * <span class="int">8</span> <span class="ident">bytes</span> (= <span class="int">40</span> <span class="ident">words</span>)</code>
 (???) code id="l17">        <span class="ident">rep</span> <span class="ident">movsw</span></code>
 (???) code id="l18"></code>
 (???) code id="l19">        <span class="ident">add</span> <span class="ident">di</span>,<span class="int">320</span>-<span class="int">80</span></code>
 (???) code id="l20">        <span class="ident">add</span> <span class="ident">si</span>,<span class="int">320</span>-<span class="int">80</span></code>
 (???) code id="l21">        <span class="ident">dec</span> <span class="ident">dx</span></code>
 (???) code id="l22">        <span class="ident">jnz</span> <span class="ident">loc_26</span></code>
 (???) code id="l23">        <span class="ident">sub</span> <span class="ident">di</span>,<span class="int">16</span>*<span class="int">320</span></code>
 (???) code id="l24">        <span class="ident">sub</span> <span class="ident">si</span>,<span class="int">16</span>*<span class="int">320</span></code>
 (???) code id="l25">        <span class="ident">cmp</span> <span class="ident">si</span>,<span class="int">0</span><span class="ident">f600h</span></code>
 (???) code id="l26">        <span class="ident">jne</span> <span class="ident">loc_25</span></code>
 (???) code id="l27">        <span class="ident">mov</span> <span class="ident">si</span>,<span class="ident">bx</span></code>
 (???) code id="l28">        <span class="ident">mov</span> <span class="ident">di</span>,<span class="ident">ax</span></code>
 (???) code id="l29"></code>
 (???) code id="l30"><span class="ident">loc_27</span>: <span class="ident">add</span> <span class="ident">si</span>,<span class="int">8</span>*<span class="int">320</span></code>
 (???) code id="l31">        <span class="ident">add</span> <span class="ident">di</span>,<span class="int">8</span>*<span class="int">320</span></code>
 (???) code id="l32">        <span class="ident">cmp</span> <span class="ident">si</span>,<span class="int">23</span>*<span class="int">8</span>*<span class="int">320</span></code>
 (???) code id="l33">        <span class="ident">jne</span> <span class="ident">loc_23</span></code>
 (???) code id="l34">        <span class="ident">ret</span></code>
 (???) code id="l35"><span class="ident">clrlines</span> <span class="ident">endp</span></code>
 (???) code id="l36"></code></pre><h2 id="downloads">Downloads</h2>
 (???) table class="table">
 (???) thead>
 (???) tr>
 (???) th>Filename</th><th>Note</th><th>Type</th><th>Size</th></tr>
 (???) /thead>
 (???) tbody>
 (???) tr>
 (???) td><a href="/games/tetris.com/tetris.com?raw">tetris.com</a></td><td>Missing IPX</td><td>COM</td><td>1663 bytes</td></tr>
 (???) tr>
 (???) td><a href="/games/tetris.com/tetris.com-1663.png">tetris.png</a></td><td>-</td><td>PNG</td><td>2429 bytes</td></tr>
 (???) /tbody>
 (???) /table>
 (???) div class="footnotes" role="doc-endnotes">
 (???) hr>
 (???) ol>
 (???) li id="fn:1">
 (???) p>the name is not about the <abbr title="Top-level domain">TLD</abbr>, but about the ancient executable format.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
 (???) /li>
 (???) li id="fn:2">
 (???) p>320×200 pixels, 256 colors (palette).&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
 (???) /li>
 (???) li id="fn:3">
 (???) p><a href="https://ibsensoftware.com/products_aPACK.html">aPACK compressor for 16-bit DOS executables</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
 (???) /li>
 (???) /ol>
 (???) /div>
 (???)         
 (???)         <div>      
 (???)           <time datetime="1997-10-21 14:52:36 &#43;0000 &#43;0000">Tue, 21 Oct 1997 14:52:36 &#43;0000</time>
 (???)         </div>
 (???)         
 (???)      </article>
 (???)    <div class="prevnext" id="prevnext">
 (???)        <a href="/games/esnextris" rel="prev">
 (???)            <strong>previous</strong><br>
 (???)            ESNextTris
 (???)        </a>
 (???)        <a href="/games/javascript-tetris-1.5kb" rel="next">
 (???)            <strong>next</strong><br>
 (???)            JavaScript Tetris in 1.5 kB
 (???)        </a>
 (???)    </div>
 (???)      <section>
 (???)      
 (???)        <h2>Related</h2>
 (???)    <div class="gallery">
 (???)      <a href="/talks/tetris4life">
 (???)       <figure>
 (???)         <img src="/talks/tetris4life.svg" alt="Semi generic tetris logo inspired by the Elm logo" loading="lazy">
 (???)          <figcaption>[Talk] Tetris4life</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)      <a href="/math/fixed-point">
 (???)       <figure>
 (???)         <img src="/images/bits.svg" alt="Bits" loading="lazy">
 (???)          <figcaption>Fixed point explanatorial</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)      <a href="/c64/kasm">
 (???)       <figure>
 (???)         <img src="/img/fallback.svg" alt="" loading="lazy">        
 (???)          <figcaption>KASM</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)      <a href="/c64/tetris-inner-loop-6510">
 (???)       <figure>
 (???)         <img src="/articles/tetris-inner-loop-6510/tetris-innerloop.png" alt="Tetris Block" loading="lazy">
 (???)          <figcaption>Tetris inner loop MOS6510 / C=64</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)      <a href="/c64/c64js">
 (???)       <figure>
 (???)         <img src="/img/fallback.svg" alt="" loading="lazy">        
 (???)          <figcaption>Commodore 64 emulator</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)      <a href="/c64/octettenpletter">
 (???)       <figure>
 (???)         <img src="/img/fallback.svg" alt="" loading="lazy">        
 (???)          <figcaption>Octettenpletter</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)      <a href="/tetris">
 (???)       <figure>
 (???)         <img src="/img/fallback.svg" alt="" loading="lazy">        
 (???)          <figcaption>Tetris</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)      <a href="/games/delphi-tetris">
 (???)       <figure>
 (???)         <img src="/games/delphi-tetris/tetris.png" alt="Delphi Tetris" loading="lazy">
 (???)          <figcaption>Delphi Tetris</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)      <a href="/games/pytris">
 (???)       <figure>
 (???)         <img src="/img/fallback.svg" alt="" loading="lazy">        
 (???)          <figcaption>Pytris</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)      <a href="/games/blaztris">
 (???)       <figure>
 (???)         <img src="/img/fallback.svg" alt="" loading="lazy">        
 (???)          <figcaption>Blaztris</figcaption>
 (???)        </figure>
 (???)      </a>
 (???)    </div>
 (???)      </section>
 (???)    </main>
 (???)        <footer id="footer">
 (???)      <nav>
 (???)        <ul>
 (???)          
 (???)          <li><a href="/search">Search</a></li>
 (???)          <li><a href="/categories">Categories</a></li>
 (???)          <li><a href="/tags">Tags</a></li>
 (???)          
 (???)        </ul>
 (???)      </nav>
 (???)      <div>
 (???)        <a href="/"><img src="/images/joriszwart-logo.png" alt="" width="265" height="34"></a>
 (???)      </div>
 (???)    </footer>
 (???)  </body>
 (???) /html>