<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://www.hybrix.dev/news</id>
    <title>Hybrix News</title>
    <updated>2026-08-01T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.hybrix.dev/news"/>
    <subtitle>New features, fixes, and demos for Hybrix</subtitle>
    <rights>Copyright © 2026 Write 'n' Run LLC</rights>
    <entry>
        <title type="html"><![CDATA[August 2026]]></title>
        <id>https://www.hybrix.dev/news/2026-08</id>
        <link href="https://www.hybrix.dev/news/2026-08"/>
        <updated>2026-08-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[The framework and the VS Code extension move to GitHub, and Chombit Chess arrives in the gallery.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="github">The framework and the VS Code extension are on GitHub<a href="https://www.hybrix.dev/news/2026-08#github" class="hash-link" aria-label="Direct link to The framework and the VS Code extension are on GitHub" title="Direct link to The framework and the VS Code extension are on GitHub" translate="no">​</a></h2>
<p><em>August 5</em> <code>framework</code></p>
<p><a href="https://github.com/writenrun/hybrix-framework" target="_blank" rel="noopener noreferrer" class="">writenrun/hybrix-framework</a> and <a href="https://github.com/writenrun/hybrix-vscode-extension" target="_blank" rel="noopener noreferrer" class="">writenrun/hybrix-vscode-extension</a> have moved from GitLab to GitHub. Soon we'll create an open source repository for the chess source code.</p>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="august-fixes">Backlog fixes<a href="https://www.hybrix.dev/news/2026-08#august-fixes" class="hash-link" aria-label="Direct link to Backlog fixes" title="Direct link to Backlog fixes" translate="no">​</a></h2>
<p><em>August 6</em> <code>language</code> <code>designer</code></p>
<p>A collection of small fixes from the backlog:</p>
<ul>
<li class="">Fixed a small memory leak in <code>list&lt;t&gt;.clear()</code>.</li>
<li class="">Pretty-printer improvements for: array elements, comma alignment when a line wraps, and new <code>const</code> scenarios.</li>
<li class="">Designer fixes for: renaming of sounds, the "Sort Clips" button, and validation errors updating your user nickname</li>
<li class="">A subclass may now redeclare a constant declared by its base class.</li>
</ul>
<p>This last bullet is a consequence of a rule that was already documented but not fully implemented: constants are <a class="" href="https://www.hybrix.dev/docs/compiler/language/name_rules#name-scopes">namespace members</a>, so unlike member variables and member functions, they are not inherited. Internally the compiler had been storing them alongside the inherited members, which meant a subclass could not declare a constant whose name was already used by its base class.</p>
<p>What's it useful for? We're considering to change <code>chess_engine::name</code> to be a constant, so that engine names can go into a <code>data</code> table without having to create an instance of each class. For example:</p>
<div class="language-hybrix codeBlockContainer_eFLh theme-code-block"><div class="codeBlockContent_FOzd"><pre tabindex="0" class="prism-code language-hybrix codeBlock_LdAJ thin-scrollbar"><code class="codeBlockLines_I81b"><div class="token-line"><span class="token keyword">class</span><span class="token plain"> my_chess_engine </span><span class="token keyword">extends</span><span class="token plain"> chess_engine</span><br></div><div class="token-line"><span class="token plain">  </span><span class="token keyword">const</span><span class="token plain"> name </span><span class="token keyword">is</span><span class="token plain"> </span><span class="token string">"My Chess Engine 1.0"</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token keyword">end</span><span class="token plain"> </span><span class="token keyword">class</span><br></div></code></pre></div></div>
<p>...but if you extend <code>better_chess_engine</code> from <code>my_chess_engine</code>, then <code>better_chess_engine::name</code> should be a different string.</p>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="chombit-chess">Chombit Chess<a href="https://www.hybrix.dev/news/2026-08#chombit-chess" class="hash-link" aria-label="Direct link to Chombit Chess" title="Direct link to Chombit Chess" translate="no">​</a></h2>
<p><em>August 8</em> <code>chess</code> <code>roms</code></p>
<p>We've posted the initial release of <a class="" href="https://www.hybrix.dev/docs/learn/demos/chombit_chess">Chombit Chess</a> in the gallery!</p>
<div class="FlexColDiv_WXJj card_R7em"><a href="https://www.hybrix.dev/roms/chombit-chess-ymtw9393hy2k" target="_top" rel="noopener noreferrer" class="thumbLink_YiuP"><img src="https://www.hybrix.dev/content/releases/83bbk3tk2cq4-thumb.webp" width="320" height="224"></a><div class="cardAdmonition_G9VS">Click to see it run!</div></div>
<p>We've also created a new GitHub repo <a href="https://github.com/writenrun/hybrix-chess" target="_blank" rel="noopener noreferrer" class="">writenrun/hybrix-chess</a> with source code for the game and <code>chess_engine</code> API. The computer "robot" plays using Micro-Max 3.2, whose fully explanation can be found on H.G. Muller's <a href="https://home.hccnet.nl/h.g.muller/max-src2.html" target="_blank" rel="noopener noreferrer" class="">chess pages</a>. The sprite artwork was created by <a href="https://zanipixels.itch.io/" target="_blank" rel="noopener noreferrer" class="">ZaniPixels</a>.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[July 2026]]></title>
        <id>https://www.hybrix.dev/news/2026-07</id>
        <link href="https://www.hybrix.dev/news/2026-07"/>
        <updated>2026-07-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[A chess engine contract, out parameters, constant folding, a linear frame buffer, and the Mandelbrot set.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="chess-engine-api">A plug-in contract for chess engines<a href="https://www.hybrix.dev/news/2026-07#chess-engine-api" class="hash-link" aria-label="Direct link to A plug-in contract for chess engines" title="Direct link to A plug-in contract for chess engines" translate="no">​</a></h2>
<p><em>July 10</em> <code>chess</code></p>
<p>More progress in the <a href="https://talkchess.com/viewtopic.php?t=86409" target="_blank" rel="noopener noreferrer" class="">TalkChess discussion</a>: an initial draft of a Hybrix interface <a href="https://github.com/writenrun/hybrix-chess/blob/main/engine-api/chess_engine.hyb" target="_blank" rel="noopener noreferrer" class="">chess_engine.hyb</a> that allows different algorithms (e.g. Micro-Max) to be used interchangeably by a front end such as a chess game or perhaps one day a simple harness for community tournaments. The reference implementation subclass allows testing of the upcoming "Chombit Chess" ROM while the Micro-Max port is still in progress. In the future, if someone wants to implement a better computer chess algorithm using this interface, it can be easily loaded by any chess game.</p>
<p>The contract is split into four features, each optional to implement:</p>
<ul>
<li class=""><code>load_position()</code>: ability to support loading/saving of board states</li>
<li class=""><code>undo_move()</code>: ability to undo one or more moves</li>
<li class=""><code>collect_moves()</code>: ability for a GUI to highlight possible next moves</li>
<li class=""><code>find_move()</code>: ability to search for a move for computer play</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="chess-console">Chess Console<a href="https://www.hybrix.dev/news/2026-07#chess-console" class="hash-link" aria-label="Direct link to Chess Console" title="Direct link to Chess Console" translate="no">​</a></h2>
<p><em>July 13</em> <code>chess</code> <code>roms</code></p>
<p>New in the gallery: "Chess Console", a <a href="https://www.hybrix.dev/docs/machine/sheets/hascii" target="_blank" rel="noopener noreferrer" class="">HASCII</a> text chess game for testing <code>chess_engine</code> subclasses. Type a move like <code>e2e4</code> and press ENTER, press ENTER alone to make the computer move, or ESC to interrupt its thinking. Each computer move reports its node count and elapsed milliseconds.</p>
<div class="FlexColDiv_WXJj card_R7em"><a href="https://www.hybrix.dev/roms/chess-console-5wtx5t5x4bxt" target="_top" rel="noopener noreferrer" class="thumbLink_YiuP"><img src="https://www.hybrix.dev/content/releases/dy8kdd9674m5-thumb.webp" width="320" height="224"></a><div class="cardAdmonition_G9VS">Click to see it run!</div></div>
<p>In other news, our artist <a href="https://zanipixels.itch.io/" target="_blank" rel="noopener noreferrer" class="">ZaniPixels</a> finished the sprites for the upcoming "Chombit Chess" graphical game:</p>
<p><img decoding="async" loading="lazy" alt="Sprites for chess game" src="https://www.hybrix.dev/assets/images/chess-sprites-a06feba1210e060be56dfdc3e1d3248b.png" width="1243" height="705" class="img_JZhv"></p>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="framework-updates">Framework updates<a href="https://www.hybrix.dev/news/2026-07#framework-updates" class="hash-link" aria-label="Direct link to Framework updates" title="Direct link to Framework updates" translate="no">​</a></h2>
<p><em>July 16</em> <code>framework</code></p>
<p>Three recent improvements for the <a href="https://github.com/writenrun/hybrix-framework" target="_blank" rel="noopener noreferrer" class="">Hybrix framework</a>:</p>
<ul>
<li class="">
<p>The <code>engine::wait_for_paint()</code> API now supports <a class="" href="https://www.hybrix.dev/docs/machine/architecture/timing#gpu-paint-timing">unbuffered mode</a>. In the original design, unbuffered mode was accomplished by skipping the call to this function, but now it works correctly for both modes. As part of this change, <code>engine::init()</code> now initializes with buffered mode.</p>
</li>
<li class="">
<p>A new field <code>s_actor_spot.starting_frame_index</code> allows an actor to specify its starting animation. In the screenshot above, the kinds of chess pieces (pawn, knight, bishop, etc.) are represented as animation frames with infinite delay, to avoid having to define separate clips for each one.</p>
</li>
<li class="">
<p>The FAIL <a class="" href="https://www.hybrix.dev/docs/assembler/cpu/event_handlers">event handler</a> now uses a <a class="" href="https://www.hybrix.dev/docs/assembler/opcodes/sleep">SLEEP</a> instruction instead of an infinite loop, which avoids wasting battery when a program finishes or crashes.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="out-parameters">Out parameters<a href="https://www.hybrix.dev/news/2026-07#out-parameters" class="hash-link" aria-label="Direct link to Out parameters" title="Direct link to Out parameters" translate="no">​</a></h2>
<p><em>July 18</em> <code>language</code></p>
<p>The Hybrix language now supports <a class="" href="https://www.hybrix.dev/docs/compiler/language/functions#out-parameters">out parameters</a> that allow a function call to return multiple values. This simplified the chess program code, for example:</p>
<p><a href="https://github.com/writenrun/hybrix-chess/blob/171a05d6c943b398e7a296feacacf0fab9323642/chombit-chess/gameboard.hyb#L501" target="_blank" rel="noopener noreferrer" class="">gameboard.hyb</a>:</p>
<div class="language-hybrix codeBlockContainer_eFLh theme-code-block"><div class="codeBlockContent_FOzd"><pre tabindex="0" class="prism-code language-hybrix codeBlock_LdAJ thin-scrollbar"><code class="codeBlockLines_I81b"><div class="token-line"><span class="token comment"># ---------------------------------------------------------------------------</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token comment"># A rank or file line counts as part of the square below or to the right of</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token comment"># it.  The extruded front edge belongs to no square.</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token keyword">func</span><span class="token plain"> try_get_col_row</span><span class="token punctuation">(</span><span class="token plain">x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword">int</span><span class="token operator">,</span><span class="token plain"> y</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword">int</span><span class="token operator">,</span><span class="token plain"> </span><span class="token keyword">out</span><span class="token plain"> col</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword">int</span><span class="token operator">,</span><span class="token plain"> </span><span class="token keyword">out</span><span class="token plain"> row</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword">bool</span><br></div></code></pre></div></div>
<p><a href="https://github.com/writenrun/hybrix-chess/blob/171a05d6c943b398e7a296feacacf0fab9323642/chombit-chess/wand_actor.hyb#L95" target="_blank" rel="noopener noreferrer" class="">wand_actor.hyb</a></p>
<div class="language-hybrix codeBlockContainer_eFLh theme-code-block"><div class="codeBlockContent_FOzd"><pre tabindex="0" class="prism-code language-hybrix codeBlock_LdAJ thin-scrollbar"><code class="codeBlockLines_I81b"><div class="token-line"><span class="token keyword">var</span><span class="token plain"> col</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword">int</span><span class="token operator">,</span><span class="token plain"> row</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword">int</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token keyword">if</span><span class="token plain"> gameboard</span><span class="token operator">::</span><span class="token plain">try_get_col_row</span><span class="token punctuation">(</span><span class="token plain">x </span><span class="token operator">+</span><span class="token plain"> wand_actor</span><span class="token operator">::</span><span class="token plain">tip_x</span><span class="token operator">,</span><span class="token plain"> y </span><span class="token operator">+</span><span class="token plain"> wand_actor</span><span class="token operator">::</span><span class="token plain">tip_y</span><span class="token operator">,</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token pipe">|</span><span class="token plain"> </span><span class="token keyword">out</span><span class="token plain"> col</span><span class="token operator">,</span><span class="token plain"> </span><span class="token keyword">out</span><span class="token plain"> row</span><span class="token punctuation">)</span><span class="token plain"> </span><span class="token keyword">then</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">  </span><span class="token operator">.</span><span class="token plain">square </span><span class="token operator">&lt;-</span><span class="token plain"> gameboard</span><span class="token operator">::</span><span class="token plain">get_square</span><span class="token punctuation">(</span><span class="token plain">col</span><span class="token operator">,</span><span class="token plain"> row</span><span class="token punctuation">)</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token keyword">else</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">  </span><span class="token operator">.</span><span class="token plain">square </span><span class="token operator">&lt;-</span><span class="token plain"> square</span><span class="token operator">::</span><span class="token plain">none</span><br></div><div class="token-line"><span class="token plain"></span><span class="token keyword">end</span><span class="token plain"> </span><span class="token keyword">if</span><br></div></code></pre></div></div>
<p>To keep the <a class="" href="https://www.hybrix.dev/docs/compiler/abi/calling_convention">calling convention</a> simple, Hybrix <code>out</code> works by copying: the function has its own <code>col</code> and <code>row</code> variables, and when it returns, their values are assigned to the caller's <code>col</code> and <code>row</code>. This differs from C#, where an <code>out</code> parameter is a hidden <a href="https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference" target="_blank" rel="noopener noreferrer" class="">reference</a> to the caller's variable. Golang avoids parameters entirely, instead using <code>return col, row, ok</code> and then <code>col, row, ok := try_get_col_row(x, y)</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="constant-folding">Constant expressions and folding<a href="https://www.hybrix.dev/news/2026-07#constant-folding" class="hash-link" aria-label="Direct link to Constant expressions and folding" title="Direct link to Constant expressions and folding" translate="no">​</a></h2>
<p><em>July 24</em> <code>language</code></p>
<p>The compiler now implements <strong>constant folding</strong>, which means reducing arithmetic when the answer can be determined at compile time. For example, <code>x &lt;- 1 + 2</code> now emits <code>move i:0, 3</code> in the disassembly pane.</p>
<p>By design, constant folding simulates what the CPU would do, including imprecisions and overflow. For example, <code>x &lt;- 1 / 3</code> reduces to <code>x &lt;- 0</code>, because the <a class="" href="https://www.hybrix.dev/docs/assembler/opcodes/divide">DIVIDE</a> instruction truncates. The expression <code>math::shift_left(1, 40)</code> reduces to <code>256</code> because the <a class="" href="https://www.hybrix.dev/docs/assembler/opcodes/shift">SHIFT</a> instruction applies a mask to its shift count. Where the machine would set the overflow or carry flag, the compiler reports an error instead:</p>
<div class="language-hybrix codeBlockContainer_eFLh theme-code-block"><div class="codeBlockContent_FOzd"><pre tabindex="0" class="prism-code language-hybrix codeBlock_LdAJ thin-scrollbar"><code class="codeBlockLines_I81b"><div class="token-line"><span class="token keyword">var</span><span class="token plain"> x</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword">int</span><span class="token operator">,</span><span class="token plain"> b</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword">byte</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">x </span><span class="token operator">&lt;-</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain">      </span><span class="token comment"># compiles to x &lt;- 3</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">x </span><span class="token operator">&lt;-</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">/</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain">      </span><span class="token comment"># compiles to x &lt;- 0</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">b </span><span class="token operator">&lt;-</span><span class="token plain"> </span><span class="token number">100</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">200</span><span class="token plain">  </span><span class="token comment"># ERROR: in the past, this would compute 44</span><br></div></code></pre></div></div>
<p>The folding rules have a similar spirit to C#, whose <code>checked()</code> and <code>unchecked()</code> operators determine whether to report an overflow or silently accept the rolled-over value. These operators will be added to the Hybrix language eventually, which is why Chombit provides efficient <a class="" href="https://www.hybrix.dev/docs/assembler/opcodes/fail">FAIL</a> tests for <code>fail if overflow</code> and <code>fail if carry</code>.</p>
<p>Constant folding eligibility also determines whether an expression can be supported in a <a class="" href="https://www.hybrix.dev/docs/compiler/language/constants">const</a> declaration. With this update, <code>const</code> now allows more complicated expressions including references to other constants:</p>
<div class="language-hybrix codeBlockContainer_eFLh theme-code-block"><div class="codeBlockContent_FOzd"><pre tabindex="0" class="prism-code language-hybrix codeBlock_LdAJ thin-scrollbar"><code class="codeBlockLines_I81b"><div class="token-line"><span class="token keyword">module</span><span class="token plain"> m</span><br></div><div class="token-line"><span class="token plain">  </span><span class="token keyword">const</span><span class="token plain"> c </span><span class="token keyword">is</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">  </span><span class="token keyword">const</span><span class="token plain"> d </span><span class="token keyword">is</span><span class="token plain"> c</span><br></div><div class="token-line"><span class="token plain"></span><span class="token keyword">end</span><span class="token plain"> </span><span class="token keyword">module</span><br></div></code></pre></div></div>
<p>We found that these compiler improvements had relatively few breaking changes for existing code.</p>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="mandelbrot">Mandelbrot sample program<a href="https://www.hybrix.dev/news/2026-07#mandelbrot" class="hash-link" aria-label="Direct link to Mandelbrot sample program" title="Direct link to Mandelbrot sample program" translate="no">​</a></h2>
<p><em>July 29</em> <code>language</code> <code>roms</code> <code>tutorials</code></p>
<p>We've added a <a class="" href="https://www.hybrix.dev/docs/learn/samples/mandelbrot">Mandelbrot sample</a> that illustrates how to use <code>io_tilemap::tile_pitch</code> to make a <a class="" href="https://www.hybrix.dev/docs/machine/io/tiles#tile-pitch">linear frame buffer</a>.</p>
<p>It also showcases a new Hybrix language feature, the <a class="" href="https://www.hybrix.dev/docs/compiler/language/data#repeat-of-initializer">repeat-of initializer</a>. You can now write <code>repeat 100 of 0</code> to avoid duplication of array elements. For example, the Mandelbrot program uses it to avoid writing 176 zeros on each row of this tileset definition:</p>
<div class="language-hybrix codeBlockContainer_eFLh theme-code-block"><div class="codeBlockContent_FOzd"><pre tabindex="0" class="prism-code language-hybrix codeBlock_LdAJ thin-scrollbar"><code class="codeBlockLines_I81b"><div class="token-line"><span class="token comment"># The 16x16 border brick tile</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token keyword">data</span><span class="token plain"> main</span><span class="token operator">::</span><span class="token plain">brick_pixels</span><br></div><div class="token-line"><span class="token plain"></span><span class="token punctuation">[</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">  </span><span class="token comment"># Appending 176 zeros to each line gives us tile_pitch=192</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">   </span><span class="token number">2</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain">  </span><span class="token number">2</span><span class="token operator">,</span><span class="token plain"> </span><span class="token repeat-of repeat-keyword keyword">repeat</span><span class="token repeat-of"> </span><span class="token repeat-of number">176</span><span class="token repeat-of"> </span><span class="token repeat-of repeat-keyword keyword">of</span><span class="token plain"> </span><span class="token number">0</span><span class="token operator">,</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">  </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">42</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token repeat-of repeat-keyword keyword">repeat</span><span class="token repeat-of"> </span><span class="token repeat-of number">176</span><span class="token repeat-of"> </span><span class="token repeat-of repeat-keyword keyword">of</span><span class="token plain"> </span><span class="token number">0</span><span class="token operator">,</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">  </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">42</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">42</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">41</span><span class="token operator">,</span><span class="token plain"> </span><span class="token number">43</span><span class="token operator">,</span><span class="token plain"> </span><span class="token repeat-of repeat-keyword keyword">repeat</span><span class="token repeat-of"> </span><span class="token repeat-of number">176</span><span class="token repeat-of"> </span><span class="token repeat-of repeat-keyword keyword">of</span><span class="token plain"> </span><span class="token number">0</span><span class="token operator">,</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain">  </span><span class="token operator">.</span><span class="token plain"> </span><span class="token operator">.</span><span class="token plain"> </span><span class="token operator">.</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token punctuation">]</span><span class="token plain"></span><br></div><div class="token-line"><span class="token plain"></span><span class="token keyword">end</span><span class="token plain"> </span><span class="token keyword">data</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="theme-color-indexes">Theme color indexes<a href="https://www.hybrix.dev/news/2026-07#theme-color-indexes" class="hash-link" aria-label="Direct link to Theme color indexes" title="Direct link to Theme color indexes" translate="no">​</a></h2>
<p><em>July 30</em> <code>machine</code></p>
<p>While improving the documentation for <a class="" href="https://www.hybrix.dev/docs/machine/io/tiles#tile-pitch">tile_pitch</a>, we've introduced more rigorous terminology for three closely related concepts:</p>
<ul>
<li class="">A <strong>system palette index</strong> (0 – 44) selects one of Palix's fixed hardware colors.</li>
<li class="">A <strong>theme color index</strong> is what a sprite or tile pixel byte contains. It indexes <code>io_theme.color_map[]</code>, which produces a system palette index.</li>
<li class="">A <strong>theme index</strong> (0 – 31) selects which entry of <code>io::themes[]</code> performs that mapping.</li>
</ul>
<p>Note that <code>io::background_color</code> and <code>io::matte_color</code> are the exceptions, specifying system palette indexes directly.</p>
<p>What happens when a pixel byte is larger than 63? The docs said it renders as black, whereas the emulator rendered it as clear. Thinking about this more deeply, real hardware would simply mask the value to 6 bits, since <code>color_map[]</code> has only 64 entries, which has a practical benefit: bits 6 and 7 of every pixel byte could be repurposed to store other data such as collision maps. This small Palix adjustment shouldn't break any correct programs today, but it provides an interesting possibility for advanced programs in the future.</p>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="jamdac">Jamdac core, and what triggering means<a href="https://www.hybrix.dev/news/2026-07#jamdac" class="hash-link" aria-label="Direct link to Jamdac core, and what triggering means" title="Direct link to Jamdac core, and what triggering means" translate="no">​</a></h2>
<p><em>July 31</em> <code>jamdac</code></p>
<p>The <a class="" href="https://www.hybrix.dev/docs/compiler/framework/jamdac">jamdac.hyb</a> comments previously marked certain features as "Jamdac Plus". It sounded like a paid add-on, so we've renamed these markers to <code>[non-core]</code>, with the distinction explained in a new <a class="" href="https://www.hybrix.dev/docs/jamdac/architecture#jamdac-core">subsection</a>.</p>
<p>What qualifies as "core"? A key principle is that it's self-contained: each channel's sound depends only on that channel's own events, and each note is fully determined at the moment it is triggered. Formalizing this uncovered an edge case where it wasn't true: if the channel effect used a delay line, triggering an instrument did not reset the delay line, so an echo tail from the previous note could bleed into the next one. It wasn't observable in practice, since the framework tracker frequently reloads instruments which also resets the delay line.</p>
<p>The docs now provide a precise specification for <a class="" href="https://www.hybrix.dev/docs/jamdac/events/instrument">triggering</a>, and the synthesizer now implements it. As part of this work, a small bug was fixed for <code>RELEASE GLOBAL ENVELOPE</code>, which had been overlooked because the framework tracker currently doesn't use this event.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[June 2026]]></title>
        <id>https://www.hybrix.dev/news/2026-06</id>
        <link href="https://www.hybrix.dev/news/2026-06"/>
        <updated>2026-06-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Work begins on a chess game, matte colors arrive in the tile editor, and memory segments become memory regions.]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="chess-game">A chess game<a href="https://www.hybrix.dev/news/2026-06#chess-game" class="hash-link" aria-label="Direct link to A chess game" title="Direct link to A chess game" translate="no">​</a></h2>
<p><em>June 12</em> <code>chess</code></p>
<p>Computer chess could provide an interactive illustration of how the Hybrix language handles nontrivial algorithms, however it's a lot of work to design a chess algorithm that is compact enough to understand, while still playing reasonably well. <a href="https://home.hccnet.nl/h.g.muller/max-src2.html" target="_blank" rel="noopener noreferrer" class="">Micro-Max</a> gained popularity in the chess community as a <a href="https://en.wikipedia.org/wiki/Code_golf" target="_blank" rel="noopener noreferrer" class="">"code golf"</a> sample with detailed documentation explaining how it works. After <a href="https://talkchess.com/viewtopic.php?t=86409" target="_blank" rel="noopener noreferrer" class="">some discussion</a> with its creator H.G. Muller, we've decided to port Micro-Max to the Hybrix language (but rewritten as readable code instead of character minimization). A full chess game ROM will be coming soon as well!</p>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="two-fixes">Two fixes<a href="https://www.hybrix.dev/news/2026-06#two-fixes" class="hash-link" aria-label="Direct link to Two fixes" title="Direct link to Two fixes" translate="no">​</a></h2>
<p><em>June 22</em> <code>machine</code></p>
<p>The emulator's <a class="" href="https://www.hybrix.dev/docs/machine/io/gamepads">virtual gamepad</a> incorrectly reported an axis range of ±1,024 instead of ±1,023. Why 1,023? Thinking about the spec, an analog stick would typically use an <a href="https://en.wikipedia.org/wiki/Analog-to-digital_converter" target="_blank" rel="noopener noreferrer" class="">analog-to-digital converter</a> (ADC) that produces an 11-bit unsigned number in the range 0 to 2,047. Our MMIO logic adjusts that to a more friendly -1,024 to 1,023, with "0" in the resting middle position (requiring some calibration to eliminate drift due to wear). Suppose our X axis had only 2 bits (-2, -1, 0, 1): it seems awkward for the leftmost extreme to be -2 whereas the rightmost extreme is +1. For a more friendly design, the adjustment can discard the -2 or -1,024 value to provide a more balanced range.</p>
<p>The <a class="" href="https://www.hybrix.dev/docs/assembler/opcodes/with">WITH</a> instruction can be written as <code>with carry</code> or <code>with euclid</code> to reflect its intended effect, which depends on the subsequent instruction. The disassembler now supports this, by looking ahead at the subsequent opcode. For irrelevant opcodes, the disassembly shows <code>with ???</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_QzDa" id="matte-colors">Matte colors in the tile editor<a href="https://www.hybrix.dev/news/2026-06#matte-colors" class="hash-link" aria-label="Direct link to Matte colors in the tile editor" title="Direct link to Matte colors in the tile editor" translate="no">​</a></h2>
<p><em>June 26</em> <code>designer</code></p>
<p><a class="" href="https://www.hybrix.dev/docs/machine/io/tiles#rendering">Matte coloring</a> causes a tilemap cell's transparent pixels to be replaced by a solid color. Its main usage is adding a solid background behind console text (HASCII <code>{mat}</code>), so originally it didn't seem important to expose in the tilemap editor. However, since you only get one global <code>io::matte_color</code>, planning its usage in a scene can require some experimentation. To make that easier, the boards system and tilemap editor have been improved to support this:</p>
<ul>
<li class="">Matte color can be previewed while you are editing</li>
<li class="">The full 16-bit <a class="" href="https://www.hybrix.dev/docs/machine/io/tiles#rendering">tile code</a> is now displayed</li>
<li class="">Clear pixels are painted as a checkerboard instead of a flat color, so a clear pixel and a pixel that merely matches the background no longer look identical.</li>
<li class="">The boards system features a new <a class="" href="https://www.hybrix.dev/docs/guide/boards_system/fields_figure#figure-matte-color-field">figure-based field</a> for the symbol's matte color</li>
</ul>
<p><img decoding="async" loading="lazy" alt="Matte color in the tilemap editor" src="https://www.hybrix.dev/assets/images/matte-2219acca7849c916cf4fa0b4b7c9c351.png" width="1111" height="622" class="img_JZhv"></p>]]></content>
    </entry>
</feed>