<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.3">Jekyll</generator><link href="https://x65.zone/feed.xml" rel="self" type="application/atom+xml" /><link href="https://x65.zone/" rel="alternate" type="text/html" /><updated>2026-10-09T01:00:49+02:00</updated><id>https://x65.zone/feed.xml</id><title type="html">X65 - Modern 8-bit computer for Creativity, Learning, and Retro Gaming</title><subtitle>X65 is a modern 8-bit microcomputer built around the W65C816 CPU, featuring 16 MB flat RAM, custom CGIA video with 256-color palette, sprites, layers, and scrolling, SGU-1 synth and PCM audio, USB and Wi-Fi/Bluetooth, and its native OS/816 for multitasking, shell access, and low-level programming.
</subtitle><author><name>X65pc</name></author><entry><title type="html">Gen1 firmware catches up</title><link href="https://x65.zone/news/2026/10/01/gen1-firmware-catches-up.html" rel="alternate" type="text/html" title="Gen1 firmware catches up" /><published>2026-10-01T00:00:00+02:00</published><updated>2026-10-01T00:00:00+02:00</updated><id>https://x65.zone/news/2026/10/01/gen1-firmware-catches-up</id><content type="html" xml:base="https://x65.zone/news/2026/10/01/gen1-firmware-catches-up.html"><![CDATA[<p>The gen1 board has been running its own branch of the firmware for a while.
I finally took the time to bring it up to date with everything done for
the emulator. Along the way I found things that only a real board shows.</p>

<p>Fixes:</p>

<ul>
  <li><strong>CGIA NMI stuck low.</strong> The renderer and the PIX interrupt could lose an
acknowledge, and the edge triggered NMI never fired again. Programs froze
waiting for VBI while the picture kept going. State changes are serialized now.</li>
  <li><strong>VRAM cache tags</strong> were lying across bank switches.</li>
  <li><strong>MODE1 2/3/4 bpp</strong> encoder read the scan address instead of the bitmap.</li>
  <li><strong>USB</strong>: a DualShock 4 froze programs within seconds. The host driver and
TinyUSB come from upstream RP6502 now, and the slots running out is handled.</li>
  <li>Unbacked HID pad slots read as disconnected.</li>
</ul>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[The gen1 board has been running its own branch of the firmware for a while. I finally took the time to bring it up to date with everything done for the emulator. Along the way I found things that only a real board shows.]]></summary></entry><entry><title type="html">Imports that keep in tune</title><link href="https://x65.zone/news/2026/09/29/importer-accuracy.html" rel="alternate" type="text/html" title="Imports that keep in tune" /><published>2026-09-29T00:00:00+02:00</published><updated>2026-09-29T00:00:00+02:00</updated><id>https://x65.zone/news/2026/09/29/importer-accuracy</id><content type="html" xml:base="https://x65.zone/news/2026/09/29/importer-accuracy.html"><![CDATA[<p>The jukebox was a great stress test for the importers. Listening to hundreds of
tunes in a row finds things that a handful of favourites never do.</p>

<p><strong>Rob Hubbard</strong> SIDs got the most love. The importer no longer walks the
player by its driver name - it finds each routine by its opcode signature and
reads the data from the operands. Init is walked statically, so the tempo
cell and the track pointers are read as init left them. I swept every Hubbard
<code class="language-plaintext highlighter-rouge">.sid</code> on HVSC against its own 6502: 150 of 213 builds are within 2% of the
original tempo, up from 118. For 19 files the walk can’t be followed, so they
refuse to import rather than play wrong.</p>

<p><strong>VGM</strong> rips had notes drifting. The YM2151 tunes in the playlist played 13.6%
of their notes more than 50 cents out. Now 0.0%. Chip volumes from the VGM
extra header are applied as balance, PSG envelopes are no longer applied
twice, and SegaPCM channels parked at zero volume are ignored.</p>

<p>Smaller stuff: volume fades on A2M, RAD and <code class="language-plaintext highlighter-rouge">.kt</code> slide on the row’s first tick,
instruments without a sample stay silent in MOD/XM/S3M/IT, and the VU meters
follow the live <code class="language-plaintext highlighter-rouge">VOL</code> register.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[The jukebox was a great stress test for the importers. Listening to hundreds of tunes in a row finds things that a handful of favourites never do.]]></summary></entry><entry><title type="html">The gang is coming</title><link href="https://x65.zone/news/2026/09/19/ghost-gang.html" rel="alternate" type="text/html" title="The gang is coming" /><published>2026-09-19T00:00:00+02:00</published><updated>2026-09-19T00:00:00+02:00</updated><id>https://x65.zone/news/2026/09/19/ghost-gang</id><content type="html" xml:base="https://x65.zone/news/2026/09/19/ghost-gang.html"><![CDATA[<p>If you idle in BOOM!65 too long, somebody will come for you. You may recognise the cast.</p>

<p>I’ve added a hazard to the arena: a gang of ghosts. They don’t show up for free</p>
<ul>
  <li>they come when it is earned, they hunt you four different ways, and what they
touch dies. Blinky picks up pace as the arena wears down, and there is a siren
to let you know.</li>
</ul>

<p>Faces are patched into the sprite frames as they
turn, and each ghost keeps the face the pack drew.</p>

<p>The interesting part is under the hood. Sprites reach the chip only
in the blanking now, via two descriptor pages. The vertical blank interrupt
only moves a pointer, so a face can never tear. Then a week of
profiling to see what every tick pays for: painting the status panel
a few fields at a time, spreading blasts over ticks and paying a late tick
back with a catch-up that draws nothing.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[If you idle in BOOM!65 too long, somebody will come for you. You may recognise the cast.]]></summary></entry><entry><title type="html">SGU Tracker jukebox</title><link href="https://x65.zone/news/2026/09/19/jukebox.html" rel="alternate" type="text/html" title="SGU Tracker jukebox" /><published>2026-09-19T00:00:00+02:00</published><updated>2026-09-19T00:00:00+02:00</updated><id>https://x65.zone/news/2026/09/19/jukebox</id><content type="html" xml:base="https://x65.zone/news/2026/09/19/jukebox.html"><![CDATA[<p>SGU Tracker can play playlists now.</p>

<p>A playlist is a text file with one tune per line - a full URL or a path into one
of the archives, optionally with <code class="language-plaintext highlighter-rouge">&amp;song=N</code> for a sub-song. The tracker imports
each tune on the fly and plays it on SGU-1, one after another, forever. It
reshuffles every lap, and a song is capped to 10 minutes of playing time unless
you say otherwise with <code class="language-plaintext highlighter-rouge">--seconds</code>.</p>

<p>There is a <em>Playlist</em> band in the File menu with prev/next and info, in both
the GUI and the TUI. The browser version keeps ticking in hidden tabs too,
so you can put it in the background and work.</p>

<p>I’ve made one for us, with about 245 tunes: C64 SID, Atari POKEY, AdLib, Yamaha
FM, Amiga modules, MIDI. The first hundred came from rankings, then some
Polish composers were added, then I listened to all of it and removed the
crappy ones. The sources are in the <code class="language-plaintext highlighter-rouge">jukebox</code> directory of the mono repo.</p>

<p>Shuffle and play: <a href="https://tracker.x65.zone/?playlist=https://raw.githubusercontent.com/X65/X65/refs/heads/main/jukebox/play.lst&amp;shuffle&amp;play" target="_blank">https://tracker.x65.zone/?playlist=https://raw.githubusercontent.com/X65/X65/refs/heads/main/jukebox/play.lst&amp;shuffle&amp;play</a></p>

<p>Any playlist reachable over HTTPS works the same way.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[SGU Tracker can play playlists now.]]></summary></entry><entry><title type="html">BOOM!65</title><link href="https://x65.zone/news/2026/09/16/boom65.html" rel="alternate" type="text/html" title="BOOM!65" /><published>2026-09-16T00:00:00+02:00</published><updated>2026-09-16T00:00:00+02:00</updated><id>https://x65.zone/news/2026/09/16/boom65</id><content type="html" xml:base="https://x65.zone/news/2026/09/16/boom65.html"><![CDATA[<p><a href="/emu/?rom=roms/boom65.xex#Emu"><img src="/emu/roms/boom65.png" style="float: right;height:150px;" alt="BOOM!65 in Emu" title="BOOM!65" /></a>
Twelve players, one arena, bombs.</p>

<p><strong>BOOM!65</strong> is a game for X65, written in 65816 assembly. It started as a port
of the Atari 8-bit <em>Dynakillers Unchained</em> by Matosimi. The port is done and
the game has since wandered off on its own.</p>

<p>It is a good torture test for the machine, so it uses everything:</p>

<ul>
  <li>The arena is CGIA <strong>MODE2</strong> attributed text, a 33×19 map of 12×12 pixel tiles,
scrolled six pixels. A flame is only an ink change on ordinary glyphs.</li>
  <li>Players are 4 bpp sprites. Pick your character with the d-pad on the bench.</li>
  <li>Up to fifteen USB gamepads, plus two DE-9 sticks as a fallback.</li>
  <li>Bombs, chain reactions, curses and boons, and an arena that repairs itself.</li>
  <li>Sound effects replayed on SGU-1 PCM voices, with the original’s tune playing
while the machine is idle.</li>
  <li>Troublemakers - bomb dropping bots that fill empty slots.</li>
</ul>

<p>It also gave Emu a good kick. Most of the pad scripting and the screenshot
fixes came from testing this game headlessly.</p>

<p><a href="/emu/?rom=roms/boom65.xex&amp;joystick=digital_1#Emu" target="_blank">Play it in the browser</a>.
Plug in a gamepad and press a button, so the browser notices it.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[Twelve players, one arena, bombs.]]></summary></entry><entry><title type="html">POKEY high-pass voices</title><link href="https://x65.zone/news/2026/09/14/pokey-high-pass.html" rel="alternate" type="text/html" title="POKEY high-pass voices" /><published>2026-09-14T00:00:00+02:00</published><updated>2026-09-14T00:00:00+02:00</updated><id>https://x65.zone/news/2026/09/14/pokey-high-pass</id><content type="html" xml:base="https://x65.zone/news/2026/09/14/pokey-high-pass.html"><![CDATA[<p>Remember <strong>SGU-1 does POKEY</strong>? Well, I haven’t been
listening carefully enough.</p>

<p>POKEY can high-pass filter one channel with another, and many Atari tunes use it
for that crispy sound. SGU Tracker now models those voices, together with
the proper distortion mapping, track routing and pulse widths, across
CMC, MPT, RMT and TMC imports.</p>

<p>A few drums were wrong too. The duty cycle wasn’t applied to every voice, and
the MPT accent 2 didn’t take its pitch from the note. Fixed.</p>

<p>RMT volume slides keep their decay in the volume column now, instead of
dropping it on the floor.</p>

<p>New in the test corpus: <em>Lasermania</em> by Janusz Pelc. If your ears bleed,
it is working.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[Remember SGU-1 does POKEY? Well, I haven’t been listening carefully enough.]]></summary></entry><entry><title type="html">Sprites in 1 to 4 bpp</title><link href="https://x65.zone/news/2026/09/12/sprites-1-to-4-bpp.html" rel="alternate" type="text/html" title="Sprites in 1 to 4 bpp" /><published>2026-09-12T00:00:00+02:00</published><updated>2026-09-12T00:00:00+02:00</updated><id>https://x65.zone/news/2026/09/12/sprites-1-to-4-bpp</id><content type="html" xml:base="https://x65.zone/news/2026/09/12/sprites-1-to-4-bpp.html"><![CDATA[<p>CGIA sprites are no longer stuck with 2 bits per pixel.</p>

<p>Each sprite now picks its depth, from 1 to 4 bpp, in its flags byte, and every
sprite gets a 16 entry palette. Pixel data uses the same packing as MODE1, so
you only need one idea in your head for both.</p>

<p>The palette is assembled per scanline:</p>

<ul>
  <li>entries 0–3 come from the sprite descriptor colors</li>
  <li>entries 4–11 are new color registers of the sprite plane</li>
  <li>entries 12–15 are the descriptor colors again, half-bright</li>
</ul>

<p>Entry 0 stays transparent. So 1 bpp reaches entry 1, 2 bpp reaches 1–3, 3 bpp
1–7 and 4 bpp everything.</p>

<p>GOTCHA: This breaks existing programs. 1 bpp sprites now draw <code class="language-plaintext highlighter-rouge">color[1]</code>
and 2 bpp sprites need their flags byte and data layout regenerated.
<code class="language-plaintext highlighter-rouge">SPRITE_MASK_MULTICOLOR</code> stays as an alias for 2 bpp, so old sources recompile,
but the pixel data needs repacking.</p>

<p>The firmware has it, Emu follows it, and the <code class="language-plaintext highlighter-rouge">examples</code> got the new header
and shared palettes. Remember to update your <code class="language-plaintext highlighter-rouge">cgia.h</code>.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[CGIA sprites are no longer stuck with 2 bits per pixel.]]></summary></entry><entry><title type="html">Fifteen gamepads and a keyboard in Emu scripts</title><link href="https://x65.zone/news/2026/09/11/pads-in-scripts.html" rel="alternate" type="text/html" title="Fifteen gamepads and a keyboard in Emu scripts" /><published>2026-09-11T00:00:00+02:00</published><updated>2026-09-11T00:00:00+02:00</updated><id>https://x65.zone/news/2026/09/11/pads-in-scripts</id><content type="html" xml:base="https://x65.zone/news/2026/09/11/pads-in-scripts.html"><![CDATA[<p>Emu scripts can now press buttons on more than one joystick.</p>

<p>Until now the <code class="language-plaintext highlighter-rouge">joy</code> verb reached joystick 1 and nothing else. Anything with more
than two players lives on the USB HID gamepads, and those were fed only by
real SDL devices, so a four-player game was impossible to test headlessly.
Not anymore:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pad 3 right a
run 30
pad 3 off
key "x"
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">pad &lt;1..15&gt;</code> injects a gamepad report into a slot, analog sticks included.
<code class="language-plaintext highlighter-rouge">pad &lt;n&gt; off</code> lets go and hands the slot back to a real device, if any.</li>
  <li><code class="language-plaintext highlighter-rouge">joy</code> can drive either DE-9 port and names the buttons A, B, X and Y.</li>
  <li><code class="language-plaintext highlighter-rouge">key</code> types on the keyboard.</li>
</ul>

<p>Fifteen is not a random number. It is all that fits into the selector nibble
of the HID register window. The status line now shows the merged pad state,
so you can see what the machine sees.</p>

<p>In the browser, gamepads are now read raw, the way the firmware reads them.
Beware the browser’s privacy gate: a page doesn’t see a pad until you press
a button on it.</p>

<p>Also in this batch: a custom X65 mouse cursor, the screensaver is inhibited
while in fullscreen, and AudioWorklet failures are reported as suspended audio
instead of silence.</p>

<p>And <code class="language-plaintext highlighter-rouge">shot</code> and <code class="language-plaintext highlighter-rouge">crc</code> now capture the frame as displayed, not the raw raster.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[Emu scripts can now press buttons on more than one joystick.]]></summary></entry><entry><title type="html">SGU-1 does POKEY</title><link href="https://x65.zone/news/2026/09/08/atari-imports.html" rel="alternate" type="text/html" title="SGU-1 does POKEY" /><published>2026-09-08T00:00:00+02:00</published><updated>2026-09-08T00:00:00+02:00</updated><id>https://x65.zone/news/2026/09/08/atari-imports</id><content type="html" xml:base="https://x65.zone/news/2026/09/08/atari-imports.html"><![CDATA[<p><a href="/emu/?rom=roms/Draconus.xex#Emu"><img src="/emu/roms/Draconus.png" style="float: right;height:150px;" alt="Draconus music demo in Emu" title="Draconus by Adam Gilmore, running on SGU-1" /></a>
Oh, the iconic <strong>Draconus</strong> tune…</p>

<p>Adam Gilmore wrote it for the Atari 8-bit. You can now listen to it on X65.</p>

<p>I’ve spent the last couple of days implementing Atari music imports in SGU Tracker.
POKEY’s four channels can use different clocks, be paired together and apply
high-pass filtering. This is not straightforward to translate for FM synthesis.</p>

<p>The importer reads music from:</p>

<ul>
  <li>Raster Music Tracker</li>
  <li>Chaos Music Composer</li>
  <li>Music ProTracker, including digi samples</li>
  <li>Theta Music Composer 1.x and 2.x</li>
  <li>Adam Gilmore’s player</li>
</ul>

<p>Each player needs its own data decoder. Some even set the playback rate in
the player code, so the song data alone is not enough to get the tempo right.</p>

<p>Additionally, the <a href="https://asma.atari.org/">Atari SAP Music Archive</a> is available as <code class="language-plaintext highlighter-rouge">asma:/</code>
in the file dialog. It lists the SAP files that pass an import check, along
with the archive’s standalone RMT modules.</p>

<p>Try it in your browser: <a href="https://tracker.x65.zone/" target="_blank">https://tracker.x65.zone/</a></p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[Oh, the iconic Draconus tune…]]></summary></entry><entry><title type="html">New tunes in the gallery</title><link href="https://x65.zone/news/2026/08/31/music-in-the-gallery.html" rel="alternate" type="text/html" title="New tunes in the gallery" /><published>2026-08-31T00:00:00+02:00</published><updated>2026-08-31T00:00:00+02:00</updated><id>https://x65.zone/news/2026/08/31/music-in-the-gallery</id><content type="html" xml:base="https://x65.zone/news/2026/08/31/music-in-the-gallery.html"><![CDATA[<p>Four more music demos are available in the <a href="/emu/">web Emu</a>.</p>

<p><a href="/emu/?rom=roms/alloyrun.xex#Emu" target="_blank"><img src="/emu/roms/alloyrun.png" alt="Alloyrun" /></a></p>

<ul>
  <li><a href="/emu/?rom=roms/alloyrun.xex#Emu">Alloyrun</a> by VOID, from Reality AdLib Tracker (<code class="language-plaintext highlighter-rouge">.rad</code>)</li>
  <li><a href="/emu/?rom=roms/fm-troni.xex#Emu">FM-Tronikk</a> by Malfunction/Altair, from AdLib Tracker II (<code class="language-plaintext highlighter-rouge">.a2m</code>)</li>
  <li><a href="/emu/?rom=roms/pinball_illusions.xex#Emu">Pinball Illusions</a> by Olof Gustafsson, from an Amiga ProTracker module (<code class="language-plaintext highlighter-rouge">.mod</code>)</li>
  <li><a href="/emu/?rom=roms/e1m1.xex#Emu">E1M1: At Doom’s Gate</a> by Bobby Prince, from a General MIDI file (<code class="language-plaintext highlighter-rouge">.mid</code>)</li>
</ul>

<p>Each tune was imported into SGU Tracker and exported as an SGM module bundled
with the 6502 player in an autorun XEX file. Emu runs that player as an X65
program, driving the emulated SGU-1.</p>

<p>These demos show the import and export path working with AdLib FM instruments,
Amiga samples and General MIDI music.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[Four more music demos are available in the web Emu.]]></summary></entry></feed>