(???) !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’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">'No VGA detected'</span>,<span class="int">13</span>,<span class="int">10</span>,<span class="char">'$'</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>&<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. <a href="#fnref:1" class="footnote-backref" role="doc-backlink">↩︎</a></p> (???) /li> (???) li id="fn:2"> (???) p>320×200 pixels, 256 colors (palette). <a href="#fnref:2" class="footnote-backref" role="doc-backlink">↩︎</a></p> (???) /li> (???) li id="fn:3"> (???) p><a href="https://ibsensoftware.com/products_aPACK.html">aPACK compressor for 16-bit DOS executables</a> <a href="#fnref:3" class="footnote-backref" role="doc-backlink">↩︎</a> <a href="#fnref1:3" class="footnote-backref" role="doc-backlink">↩︎</a></p> (???) /li> (???) /ol> (???) /div> (???) (???) <div> (???) <time datetime="1997-10-21 14:52:36 +0000 +0000">Tue, 21 Oct 1997 14:52:36 +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>