tag:github.com,2008:https://github.com/gbdev/rgbds/releasesRelease notes from rgbds2026-01-01T05:43:43Ztag:github.com,2008:Repository/304743/v1.0.12026-01-01T06:11:12Zv1.0.1<p>Happy New Year! ๐ ๐</p>
<p>As promised, we use <a href="https://semver.org/" rel="nofollow">semantic versioning</a> now, so 1.0.1 being a "patch" release means that it's fully backwards compatble with 1.0.0. All that's changed is fixing various bugs (and typos, internal refactorings, etc).</p>
<p>(Many of these bugs were found with the "<a href="https://en.wikipedia.org/wiki/Fuzzing" rel="nofollow">fuzzing</a>" tool <a href="https://github.com/AFLplusplus/AFLplusplus/">AFL++</a>, so they involve unrealistic inputs which would be unlikely or impossible in normal usage of RGBDS. Still, even specifically-crafted garbage inputs should give sensible error messages and not crash, so we try to find and fix these.)</p>
<p><strong>RGBASM:</strong></p>
<ul>
<li>Symbol names of just three or more periods ("<code>...</code>", "<code>....</code>", etc) were mistakenly allowed</li>
<li><code>SECTION UNION</code> was mistakenly allowed for ROM sections (when there was no second <code>SECTION UNION</code> of the same name)</li>
<li><code>-MG</code> and <code>-MC</code> were not accounting for <code>-P/--preinclude</code> files</li>
<li>Non-UTF-8 "garbage" characters at the end of a file could hang in an infinite loop</li>
</ul>
<p><strong>RGBLINK:</strong></p>
<ul>
<li>Undefined symbols could cause extra warning messages about meaningless values in expressions</li>
<li>Various invalid object files (which RGBASM would not output in the first place) could print misleading error messages or outright crash</li>
</ul>
<p><strong>RGBGFX:</strong></p>
<ul>
<li>Input images with ambiguous alpha channel values (neither transparent nor opaque) could crash due to an assertion failure</li>
<li>Clarify documentation of <code>rgbgfx -C/--color-curve</code></li>
<li>Improve some error messages</li>
</ul>
<p><strong>All programs:</strong></p>
<ul>
<li>Some errors with command-line options could be incorrectly reported (due to inaccurate <code>errno</code> values)</li>
<li>For RGBASM and RGBLINK, very long error location backtraces could crash with a stack overflow (only ever observed during fuzzing)</li>
</ul>github-actions[bot]tag:github.com,2008:Repository/304743/v1.0.02025-11-01T00:48:54Zv1.0.0<p>Happy Halloween! ๐</p>
<p>We've finally hit a big milestone: the first major version increment, from 0.x to 1.0.0! ๐ฅณ</p>
<p>From now on RGBDS will adhere to <a href="https://semver.org/" rel="nofollow">semantic versioning</a> ("semver"), meaning that you can rely on meaningful version numbers. Breaking changes will be reserved for new major versions; new features will require a minor version update; and bugfixes, internal refactorings, or other small tweaks will be patch-level version updates.</p>
<h2>Removed</h2>
<ul>
<li>Treating multi-value strings as numbers, and the <code>rgbasm -Wnumeric-string</code> warning about doing so</li>
<li><code>ldio [c], a</code>/<code>ldio a, [c]</code>, and <code>ld [c], a</code>/<code>ld a, [c]</code> (use <code>ldh [c], a</code>/<code>ldh a, [c]</code> instead)</li>
<li><code>ldh [$xx], a</code>/<code>ldh a, [$xx]</code> (use <code>ldh [$FFxx], a</code>/<code>ldh a, [$FFxx]</code> instead)</li>
</ul>
<h2>Deprecated</h2>
<p>You can pass <code>-Wno-obsolete</code> to silence warnings about these deprecations for now, but they will eventually be removed.</p>
<ul>
<li>Treating single-value strings as numbers (use <code>'c'</code>haracter constants or the <code>CHARVAL</code> function instead)</li>
<li>1-indexed string functions <code>STRIN</code>, <code>STRRIN</code>, <code>STRSUB</code>, and <code>CHARSUB</code> (use 0-indexed <code>STRFIND</code>, <code>STRRFIND</code>, <code>STRSLICE</code>, and <code>STRCHAR</code> instead)</li>
<li><code>rgbfix -O/--overwrite</code> (use the <code>-Wno-overwrite</code> diagnostic flag instead)</li>
</ul>
<h2>Added</h2>
<ul>
<li>Error/warning output is <span title="colorful"><math-renderer class="js-inline-math" style="display: inline-block" data-run-id="03bd747402f6237e6fb07af7df836034">$\normalsize{\textsf{\color{#ff0000}c\color{#ff8000}o\color{#cccc00}l\color{#00aa00}o\color{#00aaaa}r\color{#4444ff}f\color{#6600cc}u\color{#ff00aa}l}}$</math-renderer></span> by default when sent to a terminal; control it with <code>--color always/never/auto</code>, or the <a href="https://no-color.org/" rel="nofollow"><code>NO_COLOR</code></a> or <a href="https://force-color.org/" rel="nofollow"><code>FORCE_COLOR</code></a> environment variables</li>
<li>Add a question mark after <code>macro?</code>, <code>rept?</code>, <code>for?</code>, <code>include?</code> or macro invocations like <code>my_mac?</code>, to "silence" them, excluding them from error/warning location backtraces</li>
<li>
<code>===</code> and <code>!==</code> operators for string comparison, as an alternative to <code>STRCMP</code>
</li>
<li>
<code>::</code> can join <code>db</code>/<code>dw</code>/<code>dl</code>/<code>ds</code> directives as well as instructions onto one line</li>
<li>
<code>__SCOPE__</code> is an empty string "", "<code>.</code>", or "<code>..</code>", according to the current innermost label scope level</li>
<li>
<code>CHARVAL(str)</code>, without an index argument, gets the numeric value of a single-character string</li>
<li>
<code>OPT</code> allows an optional dash before flags to be more like the CLI (e.g. <code>OPT -Wno-obsolete</code>)</li>
<li>
<code>CHARMAP</code> accepts character literals as well as strings (there is no difference in effect)</li>
<li>
<code>-B/--backtrace</code> configures location backtraces for error/warning messages in RGBASM and RGBLINK</li>
<li>
<code>-v/--verbose</code> has multiple levels for RGBASM and RGBLINK too, not just RGBGFX<br>
<sub>(RGBFIX's functionality is too simple to need verbose debug output, and it uses the <code>-v</code> flag for something else already)</sub>
</li>
<li>
<code>rgbasm -Wexport-undefined</code> warns when you <code>EXPORT</code> an undefined symbol (enabled by <code>-Wall</code>)</li>
<li>
<code>rgblink -Wtruncation</code> supports warning levels <code>=0</code>, <code>=1</code>, or <code>=2</code>, same as <code>rgbasm -Wtruncation</code>
</li>
<li>
<code>rgbgfx -c auto</code> explicitly specifies to use the automatic palette generation algorithm</li>
<li>
<code>rgbgfx -c dmg</code> is short for <code>rgbgfx -c dmg=e4</code>
</li>
<li>
<code>rgbgfx -O</code> without <code>-o</code> or without any of <code>-A -P -Q -T</code> prints a warning</li>
<li>Numeric command-line arguments and <code>OPT</code> arguments can use any base prefix: <code>0x</code> or <code>$</code> for hex, <code>0b</code> or <code>%</code> for binary, <code>0o</code> or <code>&</code> for octal, or nothing for decimal</li>
<li>
<code>rgbasm</code>, <code>rgblink</code>, and <code>rgbfix</code>, as well as <code>rgbgfx</code> already, support <code>@args.flags</code> to read more CLI arguments from an <code>args.flags</code> "at-file"</li>
</ul>
<h2>Changed</h2>
<ul>
<li>Underscores in integer constants can go after the base prefix, between digits, or before the fixed-point <code>q</code> suffix, but cannot be multiple in a row or trailing</li>
<li>Too-large integer constants get evaluated as 0</li>
<li><code>OPT p</code> argument is decimal by default, and requires <code>0x</code> prefix for hexadecimal (like <code>OPT Q</code>, <code>OPT r</code>, and CLI <code>-p/--pad-value</code>)</li>
<li>Leading spaces are stripped from all <code>OPT</code> arguments, not just <code>OPT r</code></li>
<li>Spaces are consistently stripped from the beginning and end of macro arguments, even with a block comment in the middle of the spaces</li>
<li><code>rgbasm -Wlarge-constant</code> is enabled by default instead of by <code>-Wall</code></li>
<li><code>rgbasm -Wpurge</code> default level is increased from 1 to 2</li>
<li><code>rgbasm -Wtruncation</code> and <code>rgblink -Wtruncation</code> default level is reduced from 2 to 1</li>
<li>RGBLINK .map files will only print <code>; Next fragment</code> or <code>; Next union</code> comments when they also have subsequent labels to print</li>
<li>Reformatted and rephrased some error messages; in particular, location traces are now indented and have one file location per line</li>
</ul>
<h2>Fixed</h2>
<ul>
<li><code>bit</code>/<code>res</code>/<code>set</code> with an unknown bit index could segfault</li>
<li>Division and modulo were off by one for very large negative numbers</li>
<li>Exporting an undefined symbol is now an error</li>
<li>A local label after a keyword (e.g. <code>call.local</code>) is now an error</li>
<li>Labels were allowed before <code>ENDC</code>, which could lead to inconsistent lexing and parsing</li>
<li>Line numbers after using "nested" macros were incorrect<br>
<sub>Macros can be "nested" by defining the inner macro within an <code>EQUS</code> and expanding it</sub></li>
<li>Interpolation would fail after an empty string literal (<code>""{example}</code>)</li>
<li><code>q</code> could be repeated in fixed-point format specs (e.g. <code>STRFMT("%qqq16f", 3.14q16)</code>)</li>
<li>Formatting very long fixed-point numbers could cut off the end (e.g. <code>STRFMT("%#.255q1f", 1073741823.5q1)</code>)</li>
<li>Character literals would be misread after invalid "garbage" characters</li>
<li>"while expanding symbol" error backtrace was printing the symbol's contents instead of its name</li>
<li>Too-large integer constants would print a <code>-Wlarge-constant</code> error for every subsequent digit</li>
<li>Section-related error messages could be inaccurate/misleading after use of <code>[[ fragment literals ]]</code></li>
<li>RGBASM's Bash completion script supports <code>-MC</code></li>
<li>RGBLINK supports .rel object files generated by SDCC 4.4.0 and later (<code>XL4</code> instead of <code>XL3</code>)</li>
<li>RGBGFX could output incorrect attrmap data for bank 1 when bank 0 contained 256 duplicatable tiles (i.e. <code>-N 256,256</code> without <code>-u</code>)</li>
</ul>
<p>Thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Rangi42/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Rangi42">@Rangi42</a>, <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ISSOtm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ISSOtm">@ISSOtm</a>, and <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ReiquelApplegate/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ReiquelApplegate">@ReiquelApplegate</a> for the work done for this release.</p>github-actions[bot]tag:github.com,2008:Repository/304743/v1.0.0-rc22025-09-30T23:35:29Zv1.0.0-rc2<p>RGBDS's major version number is finally going to increment from 0 to 1! As of this release, we'll stick to <a href="https://semver.org/" rel="nofollow">semantic versioning</a>, so that any future breaking changes will require a major version update, new features will be a minor version, and bug fixes will be a patch version. That should make it easier to manage RGBDS version compatibility for assembly projects. (And if a "version 2.0" does eventually come after this one, it might be <a href="https://codeberg.org/ISSOtm/rsgbds" rel="nofollow">rewritten in Rust</a>.)</p>
<p>This is a release <em>candidate</em> to help people test it out early, and make sure we won't need to release a 1.0.1 bugfix immediately afterwards.</p>
<h2>What's different from v1.0.0-rc1?</h2>
<ul>
<li><strong>Added:</strong> <code>===</code> and <code>!==</code> operators for string comparison, as an alternative to <code>STRCMP</code></li>
<li><strong>Added:</strong> <code>CHARMAP</code> accepts character literals as well as strings (there is no difference in effect)</li>
<li><strong>Changed:</strong> <code>rgbgfx -O</code> without <code>-o</code> or without any of <code>-A -P -Q -T</code> prints a warning</li>
<li><strong>Changed:</strong> Numeric command-line arguments and <code>OPT</code> arguments can use any base prefix: <code>0x</code> or <code>$</code> for hex, <code>0b</code> or <code>%</code> for binary, <code>0o</code> or <code>&</code> for octal, or nothing for decimal</li>
<li><strong>Changed:</strong> <code>OPT p</code> argument is decimal by default, and requires <code>0x</code> prefix for hexadecimal (like <code>OPT Q</code>, <code>OPT r</code>, and CLI <code>-p/--pad-value</code>)</li>
<li><strong>Changed:</strong> Leading spaces are stripped from all <code>OPT</code> arguments, not just <code>OPT r</code></li>
<li><strong>Changed:</strong> Spaces are consistently stripped from the beginning and end of macro arguments, even with a block comment in the middle of the spaces</li>
<li><strong>Changed:</strong> RGBLINK .map files will only print <code>; Next fragment</code> or <code>; Next union</code> comments when they also have subsequent labels to print</li>
<li><strong>Changed:</strong> RGBGFX accurately rounds 8-bit to 5-bit color conversion (and vice-versa for <code>-r/--reverse</code>)</li>
<li><strong>Fixed:</strong> <code>bit</code>/<code>res</code>/<code>set</code> with an unknown bit index could segfault</li>
<li><strong>Fixed:</strong> Formatting very long fixed-point numbers could cut off the end (e.g. <code>STRFMT("%#.255q1f", 1073741823.5q1)</code>)</li>
<li><strong>Fixed:</strong> Section-related error messages could be inaccurate/misleading after use of <code>[[ fragment literals ]]</code></li>
</ul>
<p>Thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Rangi42/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Rangi42">@Rangi42</a>, <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ISSOtm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ISSOtm">@ISSOtm</a>, and <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ReiquelApplegate/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ReiquelApplegate">@ReiquelApplegate</a> for the work done for this release.</p>github-actions[bot]tag:github.com,2008:Repository/304743/v1.0.0-rc12025-09-01T22:40:46Zv1.0.0-rc1<p>RGBDS's major version number is finally going to increment from 0 to 1! As of this release, we'll stick to <a href="https://semver.org/" rel="nofollow">semantic versioning</a>, so that any future breaking changes will require a major version update, new features will be a minor version, and bug fixes will be a patch version. That should make it easier to manage RGBDS version compatibility for assembly projects. (And if a "version 2.0" does eventually come after this one, it might be <a href="https://github.com/ISSOtm/rsgbds">rewritten in Rust</a>.)</p>
<p>This is a release <em>candidate</em> to help people test it out early, and make sure we won't need to release a 1.0.1 bugfix immediately afterwards.</p>
<h2>Removed</h2>
<ul>
<li>Treating multi-value strings as numbers, and the <code>rgbasm -Wnumeric-string</code> warning about doing so</li>
<li><code>ldio [c], a</code>/<code>ldio a, [c]</code>, and <code>ld [c], a</code>/<code>ld a, [c]</code> (use <code>ldh [c], a</code>/<code>ldh a, [c]</code> instead)</li>
<li><code>ldh [$xx], a</code>/<code>ldh a, [$xx]</code> (use <code>ldh [$FFxx], a</code>/<code>ldh a, [$FFxx]</code> instead)</li>
</ul>
<h2>Deprecated</h2>
<ul>
<li>Treating single-value strings as numbers (use <code>'c'</code>haracter constants or the <code>CHARVAL</code> function instead)</li>
<li>1-indexed string functions <code>STRIN</code>, <code>STRRIN</code>, <code>STRSUB</code>, and <code>CHARSUB</code> (use 0-indexed <code>STRFIND</code>, <code>STRRFIND</code>, <code>STRSLICE</code>, and <code>STRCHAR</code> instead)</li>
<li><code>rgbfix -O/--overwrite</code> (use the <code>-Wno-overwrite</code> diagnostic flag instead)</li>
</ul>
<h2>Added</h2>
<ul>
<li>Error/warning output is <span title="colorful"><math-renderer class="js-inline-math" style="display: inline-block" data-run-id="d471e7e24140fd96fb4577761f2d1a5c">$\normalsize{\textsf{\color{#ff0000}c\color{#ff8000}o\color{#cccc00}l\color{#00aa00}o\color{#00aaaa}r\color{#4444ff}f\color{#6600cc}u\color{#ff00aa}l}}$</math-renderer></span> by default when sent to a terminal; control it with <code>--color always/never/auto</code>, or the <a href="https://no-color.org/" rel="nofollow"><code>NO_COLOR</code></a> or <a href="https://force-color.org/" rel="nofollow"><code>FORCE_COLOR</code></a> environment variables</li>
<li>Add a question mark after <code>macro?</code>, <code>rept?</code>, <code>for?</code>, <code>include?</code> or macro invocations like <code>my_mac?</code>, to "silence" them, excluding them from error/warning location backtraces</li>
<li>
<code>::</code> can join <code>db</code>/<code>dw</code>/<code>dl</code>/<code>ds</code> directives as well as instructions onto one line</li>
<li>
<code>CHARVAL(str)</code>, without an index argument, gets the numeric value of a single-character string</li>
<li>
<code>OPT</code> allows an optional dash before flags to be more like the CLI (e.g. <code>OPT -Wno-obsolete</code>)</li>
<li>
<code>-B/--backtrace</code> configures location backtraces for error/warning messages in RGBASM and RGBLINK</li>
<li>
<code>-v/--verbose</code> has multiple levels for RGBASM and RGBLINK too, not just RGBGFX<br>
<sub>(RGBFIX's functionality is too simple to need verbose debug output, and it uses the <code>-v</code> flag for something else already)</sub>
</li>
<li>
<code>rgbasm -Wexport-undefined</code> warns when you <code>EXPORT</code> an undefined symbol (enabled by <code>-Wall</code>)</li>
<li>
<code>rgblink -Wtruncation</code> supports warning levels <code>=0</code>, <code>=1</code>, or <code>=2</code>, same as <code>rgbasm -Wtruncation</code>
</li>
<li>
<code>rgbgfx -c auto</code> explicitly specifies to use the automatic palette generation algorithm</li>
<li>
<code>rgbgfx -c dmg</code> is short for <code>rgbgfx -c dmg=e4</code>
</li>
</ul>
<h2>Changed</h2>
<ul>
<li>Underscores in integer constants can go after the base prefix, between digits, or before the fixed-point <code>q</code> suffix, but cannot be multiple in a row or trailing</li>
<li>Too-large integer constants get evaluated as 0</li>
<li><code>rgbasm -Wlarge-constant</code> is enabled by default instead of by <code>-Wall</code></li>
<li>Reformatted and rephrased some error messages; in particular, location traces are now indented and have one file location per line</li>
</ul>
<h2>Fixed</h2>
<ul>
<li>Division and modulo were off by one for very large negative numbers</li>
<li>Exporting an undefined symbol is now an error</li>
<li>Line numbers after using "nested" macros were incorrect<br>
<sub>Macros can be "nested" by defining the inner macro within an <code>EQUS</code> and expanding it</sub></li>
<li>Interpolation would fail after an empty string literal (<code>""{example}</code>)</li>
<li><code>q</code> could be repeated in fixed-point format specs (e.g. <code>STRFMT("%qqq16f", 3.14q16)</code>)</li>
<li>Character literals would be misread after invalid "garbage" characters</li>
<li>"while expanding symbol" error backtrace was printing the symbol's contents instead of its name</li>
<li>Too-large integer constants would print a <code>-Wlarge-constant</code> error for every subsequent digit</li>
<li>RGBASM's Bash completion script supports <code>-MC</code></li>
<li>RGBLINK supports .rel object files generated by SDCC 4.4.0 and later (<code>XL4</code> instead of <code>XL3</code>)</li>
</ul>
<p>Thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Rangi42/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Rangi42">@Rangi42</a> and <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ISSOtm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ISSOtm">@ISSOtm</a> for the work done for this release.</p>github-actions[bot]tag:github.com,2008:Repository/304743/v0.9.42025-07-31T12:14:14Zv0.9.4<p>We're still not following <a href="https://semver.org/" rel="nofollow">SemVer</a> <a href="https://github.com/gbdev/rgbds/issues/1610" data-hovercard-type="issue" data-hovercard-url="/gbdev/rgbds/issues/1610/hovercard"><em>yet</em></a>, so this release has a lot in it even though it's "only" a patch-level update -- comparable to v0.3.9, v0.4.2, v0.5.2...</p>
<h2>Added</h2>
<ul>
<li>Inline <code>[[ fragment literals ]]</code> can be used instead of labels for one-off data</li>
<li><code>'character'</code> constants are now preferred to single-character <code>"strings"</code> for getting the numeric value of a character</li>
<li><code>READFILE(name[, maxlen])</code> returns the contents of a file as a string</li>
<li><code>BYTELEN(str)</code> returns the number of bytes in a <em>str</em>ing</li>
<li><code>STRBYTE(str, idx)</code> returns the <em>idx</em>th byte in a <em>str</em>ing</li>
<li><code>SIZEOF</code> applies to 8-and 16-bit registers, evaluating to their 1- or 2-byte size</li>
<li><code>-W</code> warning diagnostics for RGBLINK, RGBFIX, and RGBGFX</li>
<li><code>rgbasm -MC</code> flag which continues assembling even after a missing dependency (unlike <code>-MG</code>, which exits to let the dependency be generated before continuing)</li>
<li><code>rgbasm -P</code> can be specified multiple times to pre-include multiple files</li>
<li>Linkerscripts support <code>0x</code>/<code>0b</code>/<code>0o</code>/<code>&</code> numeric prefixes, <code>_</code> numeric separators, and <code>"\0"</code> characters, same as assembly</li>
<li><code>rgbgfx -c/--colors</code> supports <code>png:</code> for PNG images as palette spec inputs</li>
<li><code>rgbgfx -l/--base-palette</code> sets a base palette ID, like <code>-b/--base-tiles</code> does for tilemap IDs</li>
<li><code>rgbfix -m list</code> does the same thing as <code>rgbfix -m help</code> (lists supported MBCs)</li>
<li>Documented some more historical deprecations/removals which had been left out of <a href="https://rgbds.gbdev.io/docs/master/rgbasm-old.5" rel="nofollow">rgbasm-old(5)</a></li>
</ul>
<h2>Changed</h2>
<ul>
<li>Error message for <code>ALIGN</code> failure tells you what the actual alignment is</li>
<li>Invalid <code>rgblink -S/--scramble</code> or <code>rgbfix -f/--fix-spec</code> arguments are a fatal error, not a warning</li>
</ul>
<h2>Fixed</h2>
<ul>
<li>Aligning a section first to one size and then to a greater size could fail even when the new alignment is compatible</li>
<li>Some string functions treated <code>\0</code> characters in strings as the end of the string</li>
<li>Overflowing exponent operator <code>**</code> could cause undefined behavior</li>
<li>Invalid warning flag parameters could be silently accepted, e.g. <code>rgbasm -Wtruncation=256</code> acting like <code>=0</code></li>
<li>Unterminated strings in linkerscripts would break subsequent parsing</li>
<li>Invalid <code>rgblink -S/--scramble</code> spec could crash</li>
<li>Out-of-bounds <code>rgbgfx -L/--slice</code> coordinates could crash</li>
<li>RGBGFX was skipping a step of its palette generation algorithm</li>
<li><code>rgbfix -m</code> with unlisted numeric values could crash</li>
<li>The <code>rgbds:latest</code> Docker tag is correctly updated</li>
</ul>
<p>Thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Rangi42/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Rangi42">@Rangi42</a> and <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/avivace/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/avivace">@avivace</a> for the work done for this release.</p>github-actions[bot]tag:github.com,2008:Repository/304743/v0.9.32025-06-30T19:31:16Zv0.9.3<p>Happy Pride month! ๐ณ๏ธโ๐</p>
<h2>Added</h2>
<ul>
<li><code>CHARVAL</code> function gets individual values from a multi-value charmap entry</li>
<li><code>++</code> operator for string concatenation, as an alternative to <code>STRCAT</code></li>
<li><code>rgbgfx -c</code> can take a <code>dmg=XX</code> DMG grayscale palette specification (works like <a href="https://gbdev.io/pandocs/Palettes.html#ff47--bgp-non-cgb-mode-only-bg-palette-data" rel="nofollow"><code>rBGP</code></a>)</li>
</ul>
<h2>Changed</h2>
<ul>
<li>Restrict custom binary and graphics digits to digits, letters, <code>.</code>, <code>#</code>, or <code>@</code></li>
<li>Recover from syntax errors even inside <code>REPT</code>/<code>FOR</code> loops</li>
<li>Hint to <code>{interpolate}</code> names when <code>EQUS</code> expanding does not occur</li>
<li>.sym file sorting accounts for local labels' parents' addresses and names</li>
<li><code>rgbgfx -r</code> encodes reversed PNG images as grayscale or indexed colors when possible</li>
<li>Omit the version number from distributed release archive filenames</li>
</ul>
<h2>Fixed</h2>
<ul>
<li><code>STRSLICE</code> with two arguments assumed an off-by-one stop index</li>
<li><code>rgbasm -MP</code> would generate phony dependencies even for files that don't exist</li>
<li>Handle missing newline at EOF for linkerscript <code>INCLUDE</code>d files</li>
<li>The Dockerfile was building but not installing RGBDS in its environment</li>
<li>Building with Bison versions 3.x below 3.5 could fail over "<code>parse.lac=full</code>"</li>
<li>A second <code>rgbgfx -c</code> argument might not completely override the previous one</li>
</ul>
<p>Thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Rangi42/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Rangi42">@Rangi42</a> and <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ISSOtm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ISSOtm">@ISSOtm</a> for the work done for this release.</p>github-actions[bot]tag:github.com,2008:Repository/304743/v0.9.22025-05-04T14:25:50Zv0.9.2<p>May the 4th be with you! โญ ๐พ</p>
<h2>Added</h2>
<ul>
<li>New 0-indexed string functions (we plan to eventually deprecate the old 1-indexed ones):
<ul>
<li><code>STRFIND</code> and <code>STRRFIND</code>: like <code>STRIN</code> and <code>STRRIN</code></li>
<li><code>STRCHAR</code>: like <code>CHARSUB</code></li>
<li><code>STRSLICE</code>: like <code>STRSUB</code>, but taking start and stop indexes, instead of a start position and length</li>
</ul>
</li>
<li><code>CHARCMP</code>: compares two strings by their charmap value sequences</li>
<li><code>CHARSIZE</code>: counts how many charmap values a single character would map to</li>
<li><code>REVCHAR</code>: reverse-maps a value sequence to its charmap string (the values must have one unique corresponding charmap)</li>
<li>Allow macro <code>\<arg></code> to take negative values to count arguments from the end (e.g. <code>\<-2></code> is the penultimate arg)</li>
<li>Allow the index of <code>bit/res/set</code> instructions to be determined at link time</li>
<li><code>rgbgfx -B/--background</code> specifies a "background" color; tiles entirely of that color will be skipped in the graphic output</li>
<li><code>rgbfix -o/--output</code> can write its output to a different file than its input (must have one input file); thanks <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/jmillikin/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/jmillikin">@jmillikin</a>!</li>
</ul>
<h2>Changed</h2>
<ul>
<li>Raw symbols do not undergo <code>EQUS</code> expansion (so <code>#symbol</code> can be used instead of <code>"{symbol}"</code>)</li>
<li>Some invalid instructions have more specific error messages than just "syntax error"</li>
<li>Terser RGBASM output for sequences of unknown characters</li>
<li>contrib/gbdiff.bash does not need a .sym file to be sorted</li>
</ul>
<h2>Fixed</h2>
<ul>
<li>Macro names could be used as numeric symbols with value 0</li>
<li>Map files were listing anonymous labels (as Unicode escape syntax)</li>
<li>RGBGFX could segfault with transparent colors in <code>embedded</code> palettes</li>
<li>RGBGFX could segfault or give incorrect output for grayscale images with transparent colors</li>
<li>RGBFIX expects nonzero <code>-r/--ram-size</code> for <code>-m MBC6</code> (the one game that uses MBC6 has <code>-r 3</code>)</li>
<li><code>CMAKE_CXX_FLAGS_DEBUG</code> can be user-specified</li>
</ul>
<p>Thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Rangi42/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Rangi42">@Rangi42</a> and <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ISSOtm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ISSOtm">@ISSOtm</a> for the work done for this release.</p>github-actions[bot]tag:github.com,2008:Repository/304743/v0.9.12025-02-02T20:07:02Zv0.9.1<p>Happy (belated) New Year! ๐ ๐</p>
<p>Our GitHub Actions CI now tests RGBDS in Cygwin x64 and FreeBSD 15.0, verifying that it can build and run correctly on those platforms.</p>
<h2>Added</h2>
<ul>
<li>All programs now support <code>-h</code> or <code>--help</code> arguments to print usage information</li>
</ul>
<h2>Changed</h2>
<ul>
<li><code>ld [$ff00+c], a</code> and <code>ld a, [$ff00+c]</code> instruction syntax is <em><strong>not</strong> deprecated</em> any more!
<ul>
<li>The 0.9.0 release deprecated <code>ld [c], a</code> and <code>ld a, [c]</code> (since <code>ldh [c], a</code> and <code>ldh a, [c]</code> are more appropriate), but also deprecated the <code>[$ff00+c]</code> syntax, which this release undoes</li>
</ul>
</li>
<li>The undocumented 99,999-argument limit for macros was removed</li>
<li>Floating sections may be output in a different order</li>
</ul>
<h2>Fixed</h2>
<ul>
<li>Fix undefined behavior with backslash at EOF in macro arguments</li>
<li>Avoid errors after missing <code>INCLUDE</code> with <code>-MG</code></li>
<li>Object files used the <code>MACRO</code> node type for <code>FILE</code> nodes since 0.8.0</li>
<li><code>STRLEN</code> and <code>STRSUB</code> would cut off early on incomplete UTF-8 strings</li>
<li><code>CHARLEN</code> and <code>CHARSUB</code> would cut off early on invalid UTF-8 strings</li>
<li>RGBGFX <code>-u</code> deduplication would fail without an input or output tileset (e.g. only an output tilemap+attrmap)</li>
<li>RGBFIX could output an incorrect ROM if a <code>write</code> syscall did not write all the bytes given to it</li>
<li>Correct the gbz80(7) documentation for the <code>DAA</code> instruction</li>
</ul>
<p>Thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Rangi42/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Rangi42">@Rangi42</a> and <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ISSOtm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ISSOtm">@ISSOtm</a> , <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/robbi-blechdose/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/robbi-blechdose">@robbi-blechdose</a> , <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/avivace/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/avivace">@avivace</a> for the work done for this release.</p>github-actions[bot]tag:github.com,2008:Repository/304743/v0.9.02024-12-25T23:00:29Zv0.9.0<p>Merry Christmas everyone! ๐ ๐</p>
<div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title"><svg class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>Tip</p><p>Starting with this release, we publish universal ("fat") binaries for macOS, so they'll support x86-64 <em>and</em> newer ARM (โApple Siliconโ) CPUs!</p>
</div>
<h2><g-emoji class="g-emoji" alias="warning">โ ๏ธ</g-emoji> Deprecated</h2>
<ul>
<li>Treating multi-character strings as numbers (you can use a single 32-bit character mapping instead)</li>
<li><code>ldio</code> (use <code>ldh</code> instead)</li>
<li><code>ld [c]</code> (use <code>ldh</code> instead)</li>
<li><code>ldh [$xx]</code> (use <code>ldh [$FFxx]</code> instead)</li>
</ul>
<p>We now document RGBDS's history of deprecated and removed/replaced features in <a href="https://rgbds.gbdev.io/docs/v0.9.0/rgbasm-old.5" rel="nofollow">rgbasm-old.5</a>.</p>
<h2>Added</h2>
<ul>
<li>The <a href="https://github.com/gbdev/rgbds/blob/v0.9.0/contrib/view_palettes.sh">contrib/view_palettes.sh</a> script lets you render a GBC <code>.pal</code> file as an image</li>
<li>RGBASM <code>-s</code> outputs a "state file", listing the values of (non-label) symbols when finished assembling</li>
<li>RGBASM <code>-Wpurge</code> warns when purging exported symbols or labels</li>
<li>RGBASM <code>-Wunmatched-directive</code> warns when <code>PUSHC</code>, <code>PUSHO</code>, or <code>PUSHS</code> lacks a <code>POPC</code>, <code>POPO</code>, or <code>POPS</code></li>
<li>Symbols can have non-leading <code>$</code> characters (so an interpolated <code>prefix{numeric}</code> symbol works)</li>
<li>Symbols can have the same names as reserved keywords by prefixing them with a <code>#</code></li>
<li><code>CHARMAP</code> can map characters to sequences of multiple values, with values not limited to 8 bits</li>
<li>A string constant <code>.</code> (period) which expands to the current global label scope</li>
<li>A string constant <code>..</code> (two periods) which expands to the current fully-qualified local label scope (e.g. <code>Global.local</code>)</li>
<li><code>0x</code>, <code>0b</code>, and <code>0o</code> prefixes for hex, binary, and octal numbers (in addition to <code>$</code>, <code>%</code>, and <code>&</code>)</li>
<li><code>LOAD FRAGMENT</code> (removed in 0.5.1 due to bugs; we're not <em>totally</em> certain that all bugs are fixed, <strong>testing is appreciated!</strong>)</li>
<li><code>BITWIDTH(n)</code> returns the number of bits necessary to represent <em>n</em></li>
<li><code>TZCOUNT(n)</code> returns the count of trailing zero bits of <em>n</em></li>
<li><code>EXPORT DEF</code> defines and exports a numeric symbol in a single line</li>
<li><code>PUSHC name</code> acts like <code>PUSHC</code> followed by <code>SETCHARMAP name</code></li>
<li><code>PUSHS ...</code> acts like <code>PUSHS</code> followed by <code>SECTION ...</code></li>
<li><code>PUSHO ...</code> acts like <code>PUSHO</code> followed by <code>OPT ...</code></li>
<li><code>ENDL</code> is explicitly optional, but with an opt-in <code>-Wunterminated-load</code> warning about it</li>
<li><code>cpl</code> can also be written as <code>cpl a</code></li>
<li>Allow a <code>no-</code> prefix to negate "meta" warnings (<code>-Wno-all</code>, <code>-Wno-extra</code>, <code>-Wno-everything</code>)</li>
<li>Allow <code>-Wno-error=...</code> to override <code>-Werror</code> (including for "meta" warnings)</li>
<li>RGBLINK supports e.g. <code>ROMX FLOATING</code> in linker scripts, which allows assigning a section to no particular bank (this is generally only useful with SDCC object files)</li>
<li>RGBLINK's <code>.sym</code> file now includes exported numeric constants (if this breaks your tools, please check <a href="https://rgbds.gbdev.io/sym/" rel="nofollow">the <code>.sym</code> specification</a>!)</li>
<li>RGBGFX <code>-i/--input-tileset</code> uses a given tileset instead of generating all the tiles itself</li>
<li>RGBGFX <code>-r 0</code> infers a valid width for the reversed image</li>
<li>RGBGFX <code>-X</code> or <code>-Y</code> only mirror tiles horizontally or vertically (<code>-X -Y</code> acts like <code>-m</code>)</li>
</ul>
<h2>Changed</h2>
<ul>
<li>Macro invocations can be at column 1, the very start of a line</li>
<li><code>**</code> exponent operator is right-associative (so <code>p ** q ** r == p ** (q ** r)</code>)</li>
<li><code>LOW(Label)</code> can be constant if <code>Label</code> is aligned to 8 or more bits</li>
<li><code>!expr</code> can be constant 0 if <code>expr</code> has any non-zero bits</li>
<li>Error messages for undefined symbols mention if the symbol was previously purged</li>
<li>Sections that grew too big are reported after the whole assembly file has been processed</li>
<li>When RGBLINK encounters an unknown symbol, it lists the potential un-exported symbols by that name</li>
<li>RGBLINK reports source locations for conflicts between object files</li>
<li>Escape characters in section names in map files, and format empty sections more consistently too</li>
<li>RGBGFX <code>-r</code> gives a detailed warning if <code>-c</code> and <code>-p</code> mismatch; improved several other error messages too</li>
<li><code>LOW()</code> and <code>HIGH()</code> have their own RPN operators in the object file (this should lead to nicer output from <a href="https://crates.io/crate/rgbobj" rel="nofollow"><code>rgbobj</code></a>)</li>
<li>Clarified a lot of documentation, including for <a href="https://rgbds.gbdev.io/docs/v0.9.0/rgbasm.5#Fixed-point_expressions" rel="nofollow">fixed-point numbers</a>, <a href="https://rgbds.gbdev.io/docs/v0.9.0/rgbasm.5#THE_MACRO_LANGUAGE" rel="nofollow">macros</a>, and <a href="https://rgbds.gbdev.io/docs/v0.9.0/gbz80.7#DAA" rel="nofollow"><code>DAA</code></a></li>
<li>Explicitly document that <code>FMOD</code> behaves differently than <code>%</code></li>
<li>Increment object file revision number to 11</li>
<li>Tests can be run with CTest if you use CMake</li>
</ul>
<h2>Fixed</h2>
<ul>
<li><code>Label & CONSTANT</code> was not actually doing the <code>&</code> operation!</li>
<li>Some nonsensical uses of empty local labels (<code>Global.</code>) were ignored</li>
<li>Many bugs prevented SDCC object files from being processed correctly (special thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/RubenZwietering/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/RubenZwietering">@RubenZwietering</a> for helping with bugfixing and testing!)</li>
<li>Crash when assembling a nonexistent file</li>
<li>Crash when <code>INCLUDE</code>ing an unbounded-size file (e.g. <code>/dev/urandom</code>)</li>
<li>Crash when passing an object file with invalid patch offsets to RGBLINK</li>
<li>Crash when specifying palette files within RGBGFX at-files</li>
<li>Crash when reversing an image if the tilemap referred to nonexistent tiles</li>
<li>Multiple bugs with parsing text palette files (GPL, HEX, and PSP)</li>
<li>Reversing a 1bpp image had incorrect tile data</li>
<li>Palette generation was suboptimal, potentially failing to fit within 8 palettes</li>
<li>Palette generation was also inconsistent between platforms</li>
<li>Tiles with too many colors were being detected incorrectly</li>
<li>Maximum number of palettes wrapped around after 255</li>
<li>Allow text palette files to have the maximum number of colors</li>
<li>Allow tab character after backslash for line continuation</li>
<li>Syntax errors at the beginning of a line do not abort assembly</li>
<li><code>-Wall</code> did not enable <code>-Wcharmap-redef</code></li>
<li><code>-Wnested-comment</code> was undocumented</li>
<li>Building works on BSD systems</li>
<li>Building works on systems with bison 3.8.0</li>
</ul>
<p>Thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/Rangi42/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/Rangi42">@Rangi42</a> and <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/ISSOtm/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/ISSOtm">@ISSOtm</a> , <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/JL2210/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/JL2210">@JL2210</a> , <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/avivace/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/avivace">@avivace</a> , <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/sukus21/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/sukus21">@sukus21</a> for the work done for this release.</p>github-actions[bot]tag:github.com,2008:Repository/304743/v0.9.0-rc22024-10-22T03:14:02Zv0.9.0-rc2<div class="markdown-alert markdown-alert-tip"><p class="markdown-alert-title"><svg class="octicon octicon-light-bulb mr-2" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path d="M8 1.5c-2.363 0-4 1.69-4 3.75 0 .984.424 1.625.984 2.304l.214.253c.223.264.47.556.673.848.284.411.537.896.621 1.49a.75.75 0 0 1-1.484.211c-.04-.282-.163-.547-.37-.847a8.456 8.456 0 0 0-.542-.68c-.084-.1-.173-.205-.268-.32C3.201 7.75 2.5 6.766 2.5 5.25 2.5 2.31 4.863 0 8 0s5.5 2.31 5.5 5.25c0 1.516-.701 2.5-1.328 3.259-.095.115-.184.22-.268.319-.207.245-.383.453-.541.681-.208.3-.33.565-.37.847a.751.751 0 0 1-1.485-.212c.084-.593.337-1.078.621-1.489.203-.292.45-.584.673-.848.075-.088.147-.173.213-.253.561-.679.985-1.32.985-2.304 0-2.06-1.637-3.75-4-3.75ZM5.75 12h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5ZM6 15.25a.75.75 0 0 1 .75-.75h2.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1-.75-.75Z"></path></svg>Tip</p><p>Starting with this release, we publish universal ("fat") binaries for macOS, so they'll support x86-64 <em>and</em> newer ARM (โApple Siliconโ) CPUs!</p>
</div>
<h2><g-emoji class="g-emoji" alias="warning">โ ๏ธ</g-emoji> Deprecated</h2>
<ul>
<li>Treating multi-character strings as numbers (you can use a single 32-bit character mapping instead)</li>
</ul>
<h2>Added</h2>
<ul>
<li>RGBASM <code>-s</code> outputs a "state file", listing the values of (non-label) symbols when finished assembling</li>
<li>RGBASM <code>-Wpurge</code> warns when purging exported symbols or labels</li>
<li>Symbols can have non-leading <code>$</code> characters (so an interpolated <code>prefix{numeric}</code> symbol works)</li>
<li>Symbols can have the same names as reserved keywords by prefixing them with a <code>#</code></li>
<li><code>CHARMAP</code> can map characters to sequences of multiple values, with values not limited to 8 bits</li>
<li>A string constant <code>.</code> (period) which expands to the current global label scope</li>
<li>A string constant <code>..</code> (two periods) which expands to the current fully-qualified local label scope (e.g. <code>Global.local</code>)</li>
<li><code>0x</code>, <code>0b</code>, and <code>0o</code> prefixes for hex, binary, and octal numbers (in addition to <code>$</code>, <code>%</code>, and <code>&</code>)</li>
<li><code>BITWIDTH(n)</code> returns the number of bits necessary to represent <em>n</em></li>
<li><code>TZCOUNT(n)</code> returns the count of trailing zero bits of <em>n</em></li>
<li><code>EXPORT DEF</code> defines and exports a numeric symbol in a single line</li>
<li><code>PUSHC name</code> acts like <code>PUSHC</code> followed by <code>SETCHARMAP name</code></li>
<li><code>PUSHS ...</code> acts like <code>PUSHS</code> followed by <code>SECTION ...</code></li>
<li><code>PUSHO ...</code> acts like <code>PUSHO</code> followed by <code>OPT ...</code></li>
<li><code>ENDL</code> is explicitly optional, but with an opt-in <code>-Wunterminated-load</code> warning about it</li>
<li><code>cpl</code> can also be written as <code>cpl a</code></li>
<li>Allow a <code>no-</code> prefix to negate "meta" warnings (<code>-Wno-all</code>, <code>-Wno-extra</code>, <code>-Wno-everything</code>)</li>
<li>Allow <code>-Wno-error=...</code> to override <code>-Werror</code> (including for "meta" warnings)</li>
<li>RGBLINK supports e.g. <code>ROMX FLOATING</code> in linker scripts, which allows assigning a section to no particular bank (this is generally only useful with SDCC object files)</li>
<li>RGBLINK's <code>.sym</code> file now includes exported numeric constants (if this breaks your tools, please check <a href="https://rgbds.gbdev.io/sym/" rel="nofollow">the <code>.sym</code> specification</a>!)</li>
<li>RGBGFX <code>-i/--input-tileset</code> uses a given tileset instead of generating all the tiles itself</li>
<li>RGBGFX <code>-r 0</code> infers a valid width for the reversed image</li>
<li>RGBGFX <code>-X</code> or <code>-Y</code> only mirror tiles horizontally or vertically (<code>-X -Y</code> acts like <code>-m</code>)</li>
<li>The <a href="https://github.com/gbdev/rgbds/blob/v0.9.0/contrib/view_palettes.sh">contrib/view_palettes.sh</a> script lets you render a GBC <code>.pal</code> file as an image</li>
</ul>
<h2>Changed</h2>
<ul>
<li>Macro invocations can be at column 1, the very start of a line</li>
<li><code>LOW(Label)</code> can be constant if <code>Label</code> is aligned to 8 or more bits</li>
<li><code>!expr</code> can be constant 0 if <code>expr</code> has any non-zero bits</li>
<li>Error messages for undefined symbols mention if the symbol was previously purged</li>
<li>Sections that grew too big are reported after the whole assembly file has been processed</li>
<li>When RGBLINK encounters an unknown symbol, it lists the potential un-exported symbols by that name</li>
<li>RGBLINK reports source locations for conflicts between object files</li>
<li>RGBGFX <code>-r</code> gives a detailed warning if <code>-c</code> and <code>-p</code> mismatch; improved several other error messages too</li>
<li><code>LOW()</code> and <code>HIGH()</code> have their own RPN operators in the object file (this should lead to nicer output from <a href="https://crates.io/crate/rgbobj" rel="nofollow"><code>rgbobj</code></a>)</li>
<li>Clarified a lot of documentation, including for <a href="https://rgbds.gbdev.io/docs/v0.9.0/rgbasm.5#Fixed-point_expressions" rel="nofollow">fixed-point numbers</a> and <a href="https://rgbds.gbdev.io/docs/v0.9.0/rgbasm.5#THE_MACRO_LANGUAGE" rel="nofollow">macros</a></li>
<li>Explicitly document that <code>FMOD</code> behaves differently than <code>%</code></li>
<li>Increment object file revision number to 11</li>
<li>Tests can be run with CTest if you use CMake</li>
</ul>
<h2>Fixed</h2>
<ul>
<li><code>Label & CONSTANT</code> was not actually doing the <code>&</code> operation!</li>
<li>Some nonsensical uses of empty local labels (<code>Global.</code>) were ignored</li>
<li>Many bugs prevented SDCC object files from being processed correctly (special thanks to <a class="user-mention notranslate" data-hovercard-type="user" data-hovercard-url="/users/RubenZwietering/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="https://github.com/RubenZwietering">@RubenZwietering</a> for helping with bugfixing and testing!)</li>
<li>Crash when assembling a nonexistent file</li>
<li>Crash when <code>INCLUDE</code>ing an unbounded-size file (e.g. <code>/dev/urandom</code>)</li>
<li>Crash when passing an object file with invalid patch offsets to RGBLINK</li>
<li>Crash when specifying palette files within RGBGFX at-files</li>
<li>Crash when reversing an image if the tilemap referred to nonexistent tiles</li>
<li>Multiple bugs with parsing text palette files (GPL, HEX, and PSP)</li>
<li>Palette generation was suboptimal, potentially failing to fit within 8 palettes</li>
<li>Tiles with too many colors were being detected incorrectly</li>
<li>Maximum number of palettes wrapped around after 255</li>
<li>Allow text palette files to have the maximum number of colors</li>
<li>Allow tab character after backslash for line continuation</li>
<li><code>-Wall</code> did not enable <code>-Wcharmap-redef</code></li>
<li><code>-Wnested-comment</code> was undocumented</li>
<li>Building works on BSD systems</li>
<li>Building works on systems with bison 3.8.0</li>
</ul>github-actions[bot]