1967 lines
64 KiB
HTML
1967 lines
64 KiB
HTML
<!DOCTYPE html>
|
||
|
||
<html>
|
||
<head>
|
||
<title>nibbles.S</title>
|
||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||
<meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
|
||
<link rel="stylesheet" media="all" href="docco.css" />
|
||
</head>
|
||
<body>
|
||
<div id="container">
|
||
<div id="background"></div>
|
||
|
||
<ul id="jump_to">
|
||
<li>
|
||
<a class="large" href="javascript:void(0);">Jump To …</a>
|
||
<a class="small" href="javascript:void(0);">+</a>
|
||
<div id="jump_wrapper">
|
||
<div id="jump_page">
|
||
|
||
|
||
<a class="source" href="cnibbles.html">
|
||
cnibbles.c
|
||
</a>
|
||
|
||
|
||
<a class="source" href="nibbles.html">
|
||
nibbles.S
|
||
</a>
|
||
|
||
|
||
<a class="source" href="start.html">
|
||
start.S
|
||
</a>
|
||
|
||
</div>
|
||
</li>
|
||
</ul>
|
||
|
||
<ul class="sections">
|
||
|
||
<li id="title">
|
||
<div class="annotation">
|
||
<h1>nibbles.S</h1>
|
||
</div>
|
||
</li>
|
||
|
||
|
||
|
||
<li id="section-1">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-1">¶</a>
|
||
</div>
|
||
<p>by Simon Holmberg</p>
|
||
<p>This is a document generated by <a href="http://jashkenas.github.io/docco/">docco</a>.
|
||
My report is interleaved with the source code in the form of comments in
|
||
<a href="http://daringfireball.net/projects/markdown/">markdown</a> format.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>#define WIDTH <span class="hljs-number">60</span>
|
||
#define HEIGHT <span class="hljs-number">40</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-2">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-2">¶</a>
|
||
</div>
|
||
<h1 id="-bss">.bss</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-3">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-3">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-string">.bss</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-4">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-4">¶</a>
|
||
</div>
|
||
<p>Array of longs representing the game field</p>
|
||
<p><code>world</code> is an array of increasing time values. By having the snake head set
|
||
the time value to 0 at its current position, the actual <strong>snake</strong> will be
|
||
defined by the locations where the time value is lesser than the snake
|
||
length. This makes the tail of the snake automatically “move” visually, and
|
||
allows for a snake with an arbitrary length without complicated arrays of
|
||
coordinates!</p>
|
||
<p><strong>Apples</strong> are defined by negative time values which do not get incremented
|
||
each frame. If we wanted to, we could instead decrease this value and
|
||
compare it with a lifetime value, to conveniently make apples disappear
|
||
after a set amount of time.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-string">.align</span> <span class="hljs-number">4</span>
|
||
<span class="hljs-label">world:</span> <span class="hljs-string">.space</span> WIDTH*HEIGHT*<span class="hljs-number">4</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-5">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-5">¶</a>
|
||
</div>
|
||
<h1 id="-data">.data</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-6">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-6">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-string">.data</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-7">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-7">¶</a>
|
||
</div>
|
||
<p>Current length of the snake</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">snakeLength:</span> <span class="hljs-string">.long</span> <span class="hljs-number">0</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-8">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-8">¶</a>
|
||
</div>
|
||
<p>Snake position (starts in the middle of the field)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">snakePosX:</span> <span class="hljs-string">.long</span> WIDTH / <span class="hljs-number">2</span>
|
||
<span class="hljs-label">snakePosY:</span> <span class="hljs-string">.long</span> HEIGHT / <span class="hljs-number">2</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-9">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-9">¶</a>
|
||
</div>
|
||
<p>Snake direction (start moving to the right)</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">snakeDirX:</span> <span class="hljs-string">.long</span> <span class="hljs-number">1</span>
|
||
<span class="hljs-label">snakeDirY:</span> <span class="hljs-string">.long</span> <span class="hljs-number">0</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-10">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-10">¶</a>
|
||
</div>
|
||
<p>Number of apples</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">numApples:</span> <span class="hljs-string">.long</span> <span class="hljs-number">0</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-11">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-11">¶</a>
|
||
</div>
|
||
<p>Game over message</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">sgameover:</span> <span class="hljs-string">.string</span> <span class="hljs-string">" Game over! Score: %i "</span>
|
||
<span class="hljs-label">sgameover_end:</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-12">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-12">¶</a>
|
||
</div>
|
||
<p>Various utility strings mainly used for debugging</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">string1:</span> <span class="hljs-string">.string</span> <span class="hljs-string">"Started with snake length %i and %i apples!\n"</span>
|
||
<span class="hljs-label">string2:</span> <span class="hljs-string">.string</span> <span class="hljs-string">"Snake position: (%i, %i)\n"</span>
|
||
<span class="hljs-label">stringi:</span> <span class="hljs-string">.string</span> <span class="hljs-string">"%i\n"</span>
|
||
<span class="hljs-label">stringtest:</span> <span class="hljs-string">.string</span> <span class="hljs-string">"> %i %i %c\n"</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-13">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-13">¶</a>
|
||
</div>
|
||
<h1 id="-text">.text</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-14">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-14">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-string">.text</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-15">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-15">¶</a>
|
||
</div>
|
||
<h1 id="start_game">start_game</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-16">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-16">¶</a>
|
||
</div>
|
||
<p><code>start_game(int len, int n_apples)</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-string">.global</span> start_game
|
||
<span class="hljs-label">start_game:</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-17">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-17">¶</a>
|
||
</div>
|
||
<h2 id="initialization">Initialization</h2>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-18">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-18">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-19">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-19">¶</a>
|
||
</div>
|
||
<p>Save our function arguments for later</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-20">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-20">¶</a>
|
||
</div>
|
||
<p><code>snakeLength = len</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl <span class="hljs-number">4</span>(%<span class="hljs-literal">esp</span>), %<span class="hljs-number">eax</span>
|
||
movl %<span class="hljs-number">eax</span>, snakeLength</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-21">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-21">¶</a>
|
||
</div>
|
||
<p><code>numApples = n_apples</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl <span class="hljs-number">8</span>(%<span class="hljs-literal">esp</span>), %<span class="hljs-number">eax</span>
|
||
movl %<span class="hljs-number">eax</span>, numApples</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-22">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-22">¶</a>
|
||
</div>
|
||
<p>Store all registers so we can restore their state before we return later</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">pusha</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-23">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-23">¶</a>
|
||
</div>
|
||
<p>Call nib_init</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">call</span> nib_init</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-24">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-24">¶</a>
|
||
</div>
|
||
<p>Seed randomness by calling <code>srand</code> with a time value from <code>time</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl <span class="hljs-number">$0</span>
|
||
<span class="hljs-keyword">call</span> time
|
||
addl <span class="hljs-number">$4</span>, %<span class="hljs-literal">esp</span>
|
||
pushl %<span class="hljs-number">eax</span>
|
||
<span class="hljs-keyword">call</span> srand
|
||
addl <span class="hljs-number">$4</span>, %<span class="hljs-literal">esp</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-25">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-25">¶</a>
|
||
</div>
|
||
<p>Initialize the snake array by setting every cell to a time value greater
|
||
than <code>snakeLength</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl $world, %<span class="hljs-literal">edi</span>
|
||
movl snakeLength, %<span class="hljs-number">eax</span>
|
||
movl $WIDTH*HEIGHT, %<span class="hljs-number">ebx</span>
|
||
xorl %<span class="hljs-number">ecx</span>, %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-number">1</span>:
|
||
movl %<span class="hljs-number">eax</span>, (%<span class="hljs-literal">edi</span>, %<span class="hljs-number">ecx</span>, <span class="hljs-number">4</span>)
|
||
incl %<span class="hljs-number">ecx</span>
|
||
cmpl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-keyword">jl</span> <span class="hljs-number">1b</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-26">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-26">¶</a>
|
||
</div>
|
||
<p>Spawn initial apples</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl numApples, %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-number">1</span>:
|
||
pushl %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-keyword">call</span> spawnApple
|
||
popl %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-keyword">loop</span> <span class="hljs-number">1b</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-27">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-27">¶</a>
|
||
</div>
|
||
<h2 id="game-loop">Game loop</h2>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-28">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-28">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">loop:</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-29">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-29">¶</a>
|
||
</div>
|
||
<p>Sleep for a while using <code>usleep</code> so the snake doesn’t wiggle at the
|
||
speed of light!</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl <span class="hljs-number">$250</span>*<span class="hljs-number">1000</span>
|
||
<span class="hljs-keyword">call</span> usleep
|
||
addl <span class="hljs-number">$4</span>, %<span class="hljs-literal">esp</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-30">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-30">¶</a>
|
||
</div>
|
||
<p>Jump to <code>tick</code>, our updating function, which later chain-jumps to <code>draw</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">jmp</span> tick</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-31">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-31">¶</a>
|
||
</div>
|
||
<p>Restore all our registers as they were before <code>start_game</code> was called
|
||
and return</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">popa</span>
|
||
<span class="hljs-keyword">ret</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-32">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-32">¶</a>
|
||
</div>
|
||
<h1 id="tick">tick</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-33">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-33">¶</a>
|
||
</div>
|
||
<p>This is where we update the world.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">tick:</span>
|
||
movl $world, %<span class="hljs-literal">edi</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-34">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-34">¶</a>
|
||
</div>
|
||
<h2 id="increment-cell-times">Increment cell times</h2>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-35">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-35">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-36">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-36">¶</a>
|
||
</div>
|
||
<p>Loop</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl snakeLength, %<span class="hljs-number">ebx</span>
|
||
xorl %<span class="hljs-number">ecx</span>, %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-number">1</span>:
|
||
movl (%<span class="hljs-literal">edi</span>, %<span class="hljs-number">ecx</span>, <span class="hljs-number">4</span>), %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-37">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-37">¶</a>
|
||
</div>
|
||
<p>If the value is negative it’s an apple we don’t want to disappear</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">test</span> %<span class="hljs-number">eax</span>, %<span class="hljs-number">eax</span>
|
||
<span class="hljs-keyword">js</span> 2f</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-38">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-38">¶</a>
|
||
</div>
|
||
<p>No need to increment if it’s already greater than snakeLength</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> cmpl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">eax</span>
|
||
<span class="hljs-keyword">jg</span> 2f</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-39">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-39">¶</a>
|
||
</div>
|
||
<p>Increment the cell value</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> incl %<span class="hljs-number">eax</span>
|
||
movl %<span class="hljs-number">eax</span>, (%<span class="hljs-literal">edi</span>, %<span class="hljs-number">ecx</span>, <span class="hljs-number">4</span>)
|
||
<span class="hljs-number">2</span>: incl %<span class="hljs-number">ecx</span> // <span class="hljs-keyword">Loop</span> increment
|
||
cmpl $WIDTH*HEIGHT, %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-keyword">jne</span> <span class="hljs-number">1b</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-40">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-40">¶</a>
|
||
</div>
|
||
<h2 id="input">Input</h2>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-41">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-41">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-42">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-42">¶</a>
|
||
</div>
|
||
<p>Call nib_poll_kbd and check down, up, left and right in succession</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">call</span> nib_poll_kbd</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-43">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-43">¶</a>
|
||
</div>
|
||
<p>Down</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl <span class="hljs-number">$258</span>, %<span class="hljs-number">ebx</span>
|
||
cmpl %<span class="hljs-number">eax</span>, %<span class="hljs-number">ebx</span>
|
||
<span class="hljs-keyword">jne</span> 1f
|
||
movl <span class="hljs-number">$0</span>, snakeDirX
|
||
movl <span class="hljs-number">$1</span>, snakeDirY</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-44">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-44">¶</a>
|
||
</div>
|
||
<p>Up</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-number">1</span>: movl <span class="hljs-number">$259</span>, %<span class="hljs-number">ebx</span>
|
||
cmpl %<span class="hljs-number">eax</span>, %<span class="hljs-number">ebx</span>
|
||
<span class="hljs-keyword">jne</span> 1f
|
||
movl <span class="hljs-number">$0</span>, snakeDirX
|
||
movl $-<span class="hljs-number">1</span>, snakeDirY</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-45">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-45">¶</a>
|
||
</div>
|
||
<p>Left</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-number">1</span>: movl <span class="hljs-number">$260</span>, %<span class="hljs-number">ebx</span>
|
||
cmpl %<span class="hljs-number">eax</span>, %<span class="hljs-number">ebx</span>
|
||
<span class="hljs-keyword">jne</span> 1f
|
||
movl $-<span class="hljs-number">1</span>, snakeDirX
|
||
movl <span class="hljs-number">$0</span>, snakeDirY</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-46">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-46">¶</a>
|
||
</div>
|
||
<p>Right</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-number">1</span>: movl <span class="hljs-number">$261</span>, %<span class="hljs-number">ebx</span>
|
||
cmpl %<span class="hljs-number">eax</span>, %<span class="hljs-number">ebx</span>
|
||
<span class="hljs-keyword">jne</span> 1f
|
||
movl <span class="hljs-number">$1</span>, snakeDirX
|
||
movl <span class="hljs-number">$0</span>, snakeDirY
|
||
<span class="hljs-number">1</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-47">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-47">¶</a>
|
||
</div>
|
||
<h2 id="move-snake">Move snake</h2>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-48">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-48">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-49">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-49">¶</a>
|
||
</div>
|
||
<p><code>snakePosX = (snakePosX + snakeDirY + WIDTH) % WIDTH</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl snakePosX, %<span class="hljs-number">eax</span>
|
||
movl snakeDirX, %<span class="hljs-number">ebx</span>
|
||
addl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-50">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-50">¶</a>
|
||
</div>
|
||
<p>Add width for modulo wrap-around</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> addl $WIDTH, %<span class="hljs-number">eax</span>
|
||
xorl %<span class="hljs-number">edx</span>, %<span class="hljs-number">edx</span>
|
||
movl $WIDTH, %<span class="hljs-number">ecx</span>
|
||
divl %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-keyword">mov</span> %<span class="hljs-number">edx</span>, snakePosX</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-51">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-51">¶</a>
|
||
</div>
|
||
<p><code>snakePosY = (snakePosY + snakeDirY + HEIGHT) % HEIGHT</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl snakePosY, %<span class="hljs-number">eax</span>
|
||
movl snakeDirY, %<span class="hljs-number">ebx</span>
|
||
addl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-52">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-52">¶</a>
|
||
</div>
|
||
<p>Add height for modulo wrap-around</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> addl $HEIGHT, %<span class="hljs-number">eax</span>
|
||
xorl %<span class="hljs-number">edx</span>, %<span class="hljs-number">edx</span>
|
||
movl $HEIGHT, %<span class="hljs-number">ecx</span>
|
||
divl %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-keyword">mov</span> %<span class="hljs-number">edx</span>, snakePosY</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-53">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-53">¶</a>
|
||
</div>
|
||
<h2 id="collision">Collision</h2>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-54">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-54">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-55">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-55">¶</a>
|
||
</div>
|
||
<p>Get value at head position</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl snakePosY, %<span class="hljs-number">eax</span>
|
||
movl $WIDTH, %<span class="hljs-number">edx</span>
|
||
mull %<span class="hljs-number">edx</span>
|
||
addl snakePosX, %<span class="hljs-number">eax</span>
|
||
movl (%<span class="hljs-literal">edi</span>, %<span class="hljs-number">eax</span>, <span class="hljs-number">4</span>), %<span class="hljs-number">edx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-56">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-56">¶</a>
|
||
</div>
|
||
<p>Collision with apple if negative</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">test</span> %<span class="hljs-number">edx</span>, %<span class="hljs-number">edx</span>
|
||
<span class="hljs-keyword">js</span> 1f</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-57">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-57">¶</a>
|
||
</div>
|
||
<p>Compare value with <code>snakeLength</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl snakeLength, %<span class="hljs-number">ebx</span>
|
||
cmpl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">edx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-58">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-58">¶</a>
|
||
</div>
|
||
<p>End the game if the snake collides with itself, i.e. <code>%edx < snakeLength</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">jge</span> 2f
|
||
<span class="hljs-keyword">jmp</span> gameOver</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-59">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-59">¶</a>
|
||
</div>
|
||
<p>Spawn a new apple and extend the snake!</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-number">1</span>: pushl %<span class="hljs-literal">edi</span>
|
||
pushl %<span class="hljs-number">eax</span>
|
||
<span class="hljs-keyword">call</span> spawnApple
|
||
popl %<span class="hljs-number">eax</span>
|
||
popl %<span class="hljs-literal">edi</span>
|
||
incl snakeLength
|
||
<span class="hljs-number">2</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-60">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-60">¶</a>
|
||
</div>
|
||
<h2 id="update-world">Update world</h2>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-61">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-61">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-62">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-62">¶</a>
|
||
</div>
|
||
<p>Set time value to 0 at snake head position</p>
|
||
<p><code>i = x + y * WIDTH</code></p>
|
||
<p><code>%edi = %ebx + %ecx * $WIDTH</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl <span class="hljs-number">$0</span>, (%<span class="hljs-literal">edi</span>, %<span class="hljs-number">eax</span>, <span class="hljs-number">4</span>)</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-63">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-63">¶</a>
|
||
</div>
|
||
<p>Proceed to <code>draw</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">jmp</span> draw</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-64">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-64">¶</a>
|
||
</div>
|
||
<p>jmp debug_draw</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-65">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-65">¶</a>
|
||
</div>
|
||
<h1 id="draw">draw</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-66">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-66">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">draw:</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-67">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-67">¶</a>
|
||
</div>
|
||
<p>Loop on Y-axis</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl $HEIGHT, %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-number">1</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-68">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-68">¶</a>
|
||
</div>
|
||
<p>Loop on X-axis</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl $WIDTH, %<span class="hljs-number">ebx</span>
|
||
<span class="hljs-number">2</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-69">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-69">¶</a>
|
||
</div>
|
||
<p>Save loop registers</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl %<span class="hljs-number">ecx</span>
|
||
pushl %<span class="hljs-number">ebx</span>
|
||
subl <span class="hljs-number">$1</span>, %<span class="hljs-number">ecx</span>
|
||
subl <span class="hljs-number">$1</span>, %<span class="hljs-number">ebx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-70">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-70">¶</a>
|
||
</div>
|
||
<p>Call <code>nib_put_scr</code> depending of the value in a cell</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-71">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-71">¶</a>
|
||
</div>
|
||
<p><code>i = x + y * WIDTH</code></p>
|
||
<p><code>%eax = %ebx + %ecx * $WIDTH</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl %<span class="hljs-number">ecx</span>, %<span class="hljs-number">eax</span>
|
||
movl $WIDTH, %<span class="hljs-number">edx</span>
|
||
mull %<span class="hljs-number">edx</span>
|
||
addl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-72">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-72">¶</a>
|
||
</div>
|
||
<p>Fetch the value of the cell</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl $world, %<span class="hljs-literal">edi</span>
|
||
movl (%<span class="hljs-literal">edi</span>, %<span class="hljs-number">eax</span>, <span class="hljs-number">4</span>), %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-73">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-73">¶</a>
|
||
</div>
|
||
<p>Compare with the snake length</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> cmpl snakeLength, %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-74">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-74">¶</a>
|
||
</div>
|
||
<p>If the value is negative, it’s an apple</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">test</span> %<span class="hljs-number">eax</span>, %<span class="hljs-number">eax</span>
|
||
<span class="hljs-keyword">js</span> 4f</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-75">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-75">¶</a>
|
||
</div>
|
||
<p>If it’s greater or equal to snakeLength, it’s empty</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> cmpl snakeLength, %<span class="hljs-number">eax</span>
|
||
<span class="hljs-keyword">jge</span> 3f</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-76">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-76">¶</a>
|
||
</div>
|
||
<p>Else, it’s part of the snake</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl $<span class="hljs-string">'@'</span>
|
||
<span class="hljs-keyword">jmp</span> 5f
|
||
<span class="hljs-number">3</span>: pushl $<span class="hljs-string">' '</span>
|
||
<span class="hljs-keyword">jmp</span> 5f
|
||
<span class="hljs-number">4</span>: pushl $<span class="hljs-string">'o'</span>
|
||
<span class="hljs-number">5</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-77">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-77">¶</a>
|
||
</div>
|
||
<p>Push Y-coordinate</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl %<span class="hljs-number">ecx</span>, %<span class="hljs-number">eax</span>
|
||
pushl %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-78">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-78">¶</a>
|
||
</div>
|
||
<p>Push X-coordinate</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">eax</span>
|
||
pushl %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-79">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-79">¶</a>
|
||
</div>
|
||
<p><code>nib_put_scr(int x, int y, int c)</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">call</span> nib_put_scr
|
||
addl <span class="hljs-number">$4</span>*<span class="hljs-number">3</span>, %<span class="hljs-literal">esp</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-80">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-80">¶</a>
|
||
</div>
|
||
<p>Restore loop registers</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> popl %<span class="hljs-number">ebx</span>
|
||
popl %<span class="hljs-number">ecx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-81">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-81">¶</a>
|
||
</div>
|
||
<p>Decrement X</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> decl %<span class="hljs-number">ebx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-82">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-82">¶</a>
|
||
</div>
|
||
<p>End of X-loop</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">jnz</span> 2b</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-83">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-83">¶</a>
|
||
</div>
|
||
<p>End of Y-loop</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">loop</span> <span class="hljs-number">1b</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-84">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-84">¶</a>
|
||
</div>
|
||
<p>Jump back to the start of our game loop!</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">jmp</span> <span class="hljs-keyword">loop</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-85">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-85">¶</a>
|
||
</div>
|
||
<h1 id="gameover">gameOver</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-86">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-86">¶</a>
|
||
</div>
|
||
<p>Called when the game ends. It displays a game over message
|
||
and score, and quits after <strong>3 seconds</strong>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">gameOver:</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-87">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-87">¶</a>
|
||
</div>
|
||
<h2 id="calculate-message-position">Calculate message position</h2>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-88">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-88">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-89">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-89">¶</a>
|
||
</div>
|
||
<p>Calculate string length</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl $sgameover_end, %<span class="hljs-number">eax</span>
|
||
subl $sgameover, %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-90">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-90">¶</a>
|
||
</div>
|
||
<p>Discout null terminator</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> subl <span class="hljs-number">$1</span>, %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-91">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-91">¶</a>
|
||
</div>
|
||
<p>Calculate X-pos in the middle of the screen</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl <span class="hljs-number">$2</span>, %<span class="hljs-number">ebx</span>
|
||
xorl %<span class="hljs-number">edx</span>, %<span class="hljs-number">edx</span>
|
||
divl %<span class="hljs-number">ebx</span>
|
||
negl %<span class="hljs-number">eax</span>
|
||
addl $WIDTH/<span class="hljs-number">2</span>, %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-92">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-92">¶</a>
|
||
</div>
|
||
<h2 id="print-game-over-message">Print game over message</h2>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-93">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-93">¶</a>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-94">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-94">¶</a>
|
||
</div>
|
||
<p>Push <code>snakeLength</code> as score</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl snakeLength</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-95">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-95">¶</a>
|
||
</div>
|
||
<p>Push printf-string</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl $sgameover</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-96">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-96">¶</a>
|
||
</div>
|
||
<p>Push X-coordinate</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-97">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-97">¶</a>
|
||
</div>
|
||
<p>Push Y-coordinate</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl $HEIGHT/<span class="hljs-number">2</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-98">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-98">¶</a>
|
||
</div>
|
||
<p><code>mvprintw(int y, int x, const char *fmt, ...)</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">call</span> mvprintw
|
||
<span class="hljs-keyword">add</span> <span class="hljs-number">$4</span>*<span class="hljs-number">3</span>, %<span class="hljs-literal">esp</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-99">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-99">¶</a>
|
||
</div>
|
||
<p>Call <code>refresh</code> to refresh the screen </p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">call</span> refresh</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-100">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-100">¶</a>
|
||
</div>
|
||
<p>Sleep for 3 seconds before calling <code>nib_end</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl <span class="hljs-number">$3000</span>*<span class="hljs-number">1000</span>
|
||
<span class="hljs-keyword">call</span> usleep
|
||
addl <span class="hljs-number">$4</span>, %<span class="hljs-literal">esp</span>
|
||
<span class="hljs-keyword">call</span> nib_end</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-101">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-101">¶</a>
|
||
</div>
|
||
<h1 id="spawnapple">spawnApple</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-102">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-102">¶</a>
|
||
</div>
|
||
<p>Spawns an <strong>apple</strong> in a random location in the <code>world</code>.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">spawnApple:</span>
|
||
pushl %<span class="hljs-number">ebx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-103">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-103">¶</a>
|
||
</div>
|
||
<p><code>%ecx = rand() % HEIGHT</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">call</span> rand
|
||
xorl %<span class="hljs-number">edx</span>, %<span class="hljs-number">edx</span>
|
||
movl $HEIGHT, %<span class="hljs-number">ebx</span>
|
||
divl %<span class="hljs-number">ebx</span>
|
||
movl %<span class="hljs-number">edx</span>, %<span class="hljs-number">ecx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-104">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-104">¶</a>
|
||
</div>
|
||
<p><code>%ebx = rand() % WIDTH</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-keyword">call</span> rand
|
||
xorl %<span class="hljs-number">edx</span>, %<span class="hljs-number">edx</span>
|
||
movl $WIDTH, %<span class="hljs-number">ebx</span>
|
||
divl %<span class="hljs-number">ebx</span>
|
||
movl %<span class="hljs-number">edx</span>, %<span class="hljs-number">ebx</span>
|
||
popl %<span class="hljs-number">ecx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-105">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-105">¶</a>
|
||
</div>
|
||
<p><code>i = x + y * WIDTH</code></p>
|
||
<p><code>%eax = %ebx + %ecx * $WIDTH</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl %<span class="hljs-number">ecx</span>, %<span class="hljs-number">eax</span>
|
||
movl $WIDTH, %<span class="hljs-number">edx</span>
|
||
mull %<span class="hljs-number">edx</span>
|
||
addl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-106">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-106">¶</a>
|
||
</div>
|
||
<p>Set the cell negative to represent an apple</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl $world, %<span class="hljs-number">ecx</span>
|
||
movl $-<span class="hljs-number">1</span>, %<span class="hljs-number">edx</span>
|
||
movl %<span class="hljs-number">edx</span>, (%<span class="hljs-number">ecx</span>, %<span class="hljs-number">eax</span>, <span class="hljs-number">4</span>)
|
||
|
||
popl %<span class="hljs-number">ebx</span>
|
||
<span class="hljs-keyword">ret</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-107">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-107">¶</a>
|
||
</div>
|
||
<h1 id="debug_draw">debug_draw</h1>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-108">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-108">¶</a>
|
||
</div>
|
||
<p>This is basically the same as <code>draw</code>, except it draws the actual ASCII-value
|
||
of the world for debugging purposes.</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre><span class="hljs-label">debug_draw:</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-109">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-109">¶</a>
|
||
</div>
|
||
<p>Loop Y</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl $HEIGHT, %<span class="hljs-number">ecx</span>
|
||
<span class="hljs-number">1</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-110">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-110">¶</a>
|
||
</div>
|
||
<p>Loop X</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl $WIDTH, %<span class="hljs-number">ebx</span>
|
||
<span class="hljs-number">2</span>:</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-111">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-111">¶</a>
|
||
</div>
|
||
<p>Save loop registers</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> pushl %<span class="hljs-number">ecx</span>
|
||
pushl %<span class="hljs-number">ebx</span>
|
||
subl <span class="hljs-number">$1</span>, %<span class="hljs-number">ecx</span>
|
||
subl <span class="hljs-number">$1</span>, %<span class="hljs-number">ebx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-112">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-112">¶</a>
|
||
</div>
|
||
<p>Call nib_put_scr</p>
|
||
|
||
</div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-113">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-113">¶</a>
|
||
</div>
|
||
<p><code>i = x + y * WIDTH</code></p>
|
||
<p><code>%edi = %ebx + %ecx * $WIDTH</code></p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl %<span class="hljs-number">ecx</span>, %<span class="hljs-number">eax</span>
|
||
movl $WIDTH, %<span class="hljs-number">edx</span>
|
||
mull %<span class="hljs-number">edx</span>
|
||
addl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-114">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-114">¶</a>
|
||
</div>
|
||
<p>Fetch the value of the cell</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl $world, %<span class="hljs-literal">edi</span>
|
||
movl (%<span class="hljs-literal">edi</span>, %<span class="hljs-number">eax</span>, <span class="hljs-number">4</span>), %<span class="hljs-number">eax</span>
|
||
pushl %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-115">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-115">¶</a>
|
||
</div>
|
||
<p>Y coordinate</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl %<span class="hljs-number">ecx</span>, %<span class="hljs-number">eax</span>
|
||
pushl %<span class="hljs-number">eax</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-116">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-116">¶</a>
|
||
</div>
|
||
<p>X coordinate</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> movl %<span class="hljs-number">ebx</span>, %<span class="hljs-number">eax</span>
|
||
pushl %<span class="hljs-number">eax</span>
|
||
|
||
<span class="hljs-keyword">call</span> nib_put_scr
|
||
addl <span class="hljs-number">$4</span>*<span class="hljs-number">3</span>, %<span class="hljs-literal">esp</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-117">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-117">¶</a>
|
||
</div>
|
||
<p>Restore loop registers</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> popl %<span class="hljs-number">ebx</span>
|
||
popl %<span class="hljs-number">ecx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-118">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-118">¶</a>
|
||
</div>
|
||
<p>Decrement X</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> decl %<span class="hljs-number">ebx</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-119">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-119">¶</a>
|
||
</div>
|
||
<p>End of X-loop</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">jnz</span> 2b</pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-120">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-120">¶</a>
|
||
</div>
|
||
<p>End of Y-loop</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre> <span class="hljs-keyword">loop</span> <span class="hljs-number">1b</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
|
||
<li id="section-121">
|
||
<div class="annotation">
|
||
|
||
<div class="pilwrap ">
|
||
<a class="pilcrow" href="#section-121">¶</a>
|
||
</div>
|
||
<p>Jump back to the start of our game loop!</p>
|
||
|
||
</div>
|
||
|
||
<div class="content"><div class='highlight'><pre>
|
||
<span class="hljs-keyword">jmp</span> <span class="hljs-keyword">loop</span></pre></div></div>
|
||
|
||
</li>
|
||
|
||
</ul>
|
||
</div>
|
||
</body>
|
||
</html>
|