<?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-03-23T14:42:38+01: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">X65 in the [m]atrix</title><link href="https://x65.zone/news/2026/03/22/Matrix.html" rel="alternate" type="text/html" title="X65 in the [m]atrix" /><published>2026-03-22T00:00:00+01:00</published><updated>2026-03-22T00:00:00+01:00</updated><id>https://x65.zone/news/2026/03/22/Matrix</id><content type="html" xml:base="https://x65.zone/news/2026/03/22/Matrix.html"><![CDATA[<p>X65 Community is moving…</p>

<p>We are moving to Matrix, a modern, open-source communication platform.</p>

<p>The X65 Matrix Space is available at <a href="https://matrix.to/#/#x65:chrome.pl" target="_blank">https://matrix.to/#/#x65:chrome.pl</a>.</p>

<p>Matrix provides a modern, feature-rich chat alternative to traditional platforms,
with support for end-to-end encryption, rich media sharing, and a vibrant ecosystem of clients and integrations.</p>

<p>We found a new home at a freshly reincarnated <a href="https://chrome.pl">chrome.pl</a> server,
which is a great fit for our community and values.
The server is run by the creator of X65 Project itself, so we can ensure
it will be well-maintained and aligned with our needs.</p>

<p style="text-align: center;"><a href="https://matrix.to/#/#x65:chrome.pl" target="_blank"><img src="/media/2026-03-23_x65-matrix-space.png" alt="X65 Matrix Space" /></a></p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[X65 Community is moving…]]></summary></entry><entry><title type="html">K816 high-level assembler</title><link href="https://x65.zone/news/2026/02/09/K816.html" rel="alternate" type="text/html" title="K816 high-level assembler" /><published>2026-02-09T00:00:00+01:00</published><updated>2026-02-09T00:00:00+01:00</updated><id>https://x65.zone/news/2026/02/09/K816</id><content type="html" xml:base="https://x65.zone/news/2026/02/09/K816.html"><![CDATA[<p>A new development tool is part of the X65 Project.</p>

<p>I was looking for a high-level-assembler that will make my life easier, writing OS/816.
The closest one to my needs is K65, but it was developed for 6502 on Atari VCS.</p>

<p>So I decided to rewrite it and adapt to 65816.</p>

<p>Meet K816: <a href="https://github.com/X65/K816" target="_blank">https://github.com/X65/K816</a></p>

<p>K816 aims to combine a familiar, readable, C-like source format with the control and predictability of hand-written assembly, while providing a small set of high-level conveniences that remove boilerplate and improve code clarity.</p>

<h2 id="goals">Goals</h2>

<ul>
  <li>Target the WDC 65816 as a first-class CPU, including 24-bit addressing workflows.</li>
  <li>Provide a K65-inspired high-level assembly syntax designed for readability.</li>
  <li>Support compile-time evaluation for generating constants and data programmatically.</li>
  <li>Support structured code blocks (functions, inlining, and explicit far functions).</li>
  <li>Provide deterministic, reproducible output suitable for golden testing.</li>
  <li>Provide a formatter to keep sources consistently styled.</li>
  <li>Keep the toolchain small, fast, and well-suited to modern Rust development workflows.</li>
</ul>

<h2 id="quick-taste">Quick Taste</h2>

<p>Want to get a feel for K65-style code? This is the vibe:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">var</span> <span class="n">UART_READY</span> <span class="o">=</span> <span class="err">$</span><span class="n">FFE0</span>
<span class="n">var</span> <span class="n">UART_DATA</span>  <span class="o">=</span> <span class="err">$</span><span class="n">FFE1</span>
<span class="n">var</span> <span class="n">API_OP</span> <span class="o">=</span> <span class="err">$</span><span class="n">FFF1</span>

<span class="n">data</span> <span class="n">VECTORS</span> <span class="p">{</span>
  <span class="n">segment</span> <span class="n">VECTORS</span>
  <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span>  <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span>
  <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span>  <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span> <span class="o">&amp;&lt;</span><span class="n">main</span> <span class="o">&amp;&gt;</span><span class="n">main</span> <span class="err">$</span><span class="mo">00</span> <span class="err">$</span><span class="mo">00</span>
<span class="p">}</span>

<span class="n">main</span> <span class="p">{</span>
  <span class="n">x</span> <span class="o">=</span> <span class="err">#</span><span class="mi">0</span>
  <span class="p">{</span>
    <span class="p">{</span> <span class="n">a</span><span class="o">&amp;?</span><span class="n">UART_READY</span> <span class="p">}</span> <span class="n">n</span><span class="o">-?</span>   <span class="c1">// UART ready?</span>
    <span class="n">UART_DATA</span> <span class="o">=</span> <span class="n">a</span> <span class="o">=</span> <span class="n">text</span><span class="p">,</span><span class="n">x</span>
    <span class="n">x</span><span class="o">++</span>
    <span class="n">a</span><span class="o">?</span><span class="mi">0</span>
  <span class="p">}</span> <span class="o">!=</span>
  <span class="n">API_OP</span> <span class="o">=</span> <span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="err">$</span><span class="n">FF</span><span class="p">]</span>        <span class="c1">// Halt CPU</span>
<span class="p">}</span>

<span class="n">data</span> <span class="n">text</span> <span class="p">{</span>
  <span class="s">"Hello, World!"</span>
  <span class="err">$</span><span class="mi">0</span><span class="n">D</span> <span class="err">$</span><span class="mi">0</span><span class="n">A</span> <span class="err">$</span><span class="mo">00</span>
<span class="p">}</span>

<span class="n">data</span> <span class="n">INFO</span> <span class="p">{</span>
  <span class="n">segment</span> <span class="n">INFO</span>
  <span class="s">"Hello UART example for X65 RIA"</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This compiles to the following assembly:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt; target/debug/k816 examples/hello_uart.k65 --listing

&gt; cat examples/hello_uart.lst
[default]
000200: A2 00 2C E0 FF 10 FB BD 18 02 8D E1 FF E8 C9 00
000210: D0 F0 A9 FF 8D F1 FF 60 48 65 6C 6C 6F 2C 20 57
000220: 6F 72 6C 64 21 0D 0A 00


[VECTORS]
00FFE0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00FFF0: 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00


[INFO]
00FC00: 48 65 6C 6C 6F 20 55 41 52 54 20 65 78 61 6D 70
00FC10: 6C 65 20 66 6F 72 20 58 36 35 20 52 49 41


[data obj#0 VECTORS::VECTORS]
00FFE0: &lt;32 bytes of data&gt;

[data obj#0 default::text]
000218: "Hello, World!"
000225: &lt;3 bytes of data&gt;

[data obj#0 INFO::INFO]
00FC00: "Hello UART example for X65 RIA"

[disasm obj#0 default::main]
000200: A2 00       ldx #$00
000202: 2C E0 FF    bit $FFE0
000205: 10 FB       bpl $000202
000207: BD 18 02    lda $0218,X
00020A: 8D E1 FF    sta $FFE1
00020D: E8          inx
00020E: C9 00       cmp #$00
000210: D0 F0       bne $000202
000212: A9 FF       lda #$FF
000214: 8D F1 FF    sta $FFF1
000217: 60          rts⏎
</code></pre></div></div>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[A new development tool is part of the X65 Project.]]></summary></entry><entry><title type="html">SGU-1 is feature-complete</title><link href="https://x65.zone/news/2026/02/05/SGU-1_v010.html" rel="alternate" type="text/html" title="SGU-1 is feature-complete" /><published>2026-02-05T00:00:00+01:00</published><updated>2026-02-05T00:00:00+01:00</updated><id>https://x65.zone/news/2026/02/05/SGU-1_v010</id><content type="html" xml:base="https://x65.zone/news/2026/02/05/SGU-1_v010.html"><![CDATA[<p>After a month of intense work, the SGU-1 is now feature-complete.</p>

<p>SGU-1 is a new audio-synthesis hardware under development as part of the X65 Microcomputer Project.
It cherry-picks the best features of OPL/ESFM, OPM, SID, POKEY, and Paula,
combining 4-operator FM synthesis with per-channel subtractive filtering and hardware sweeps.</p>

<p>SGU-1 is implemented using a microcontroller paired with an audio CODEC chip.
Together they generate a stereo 48 kHz I²S stream, which is converted to an analog stereo line-out signal.
Contemporary audio-synthesis chips with advanced features are no longer manufactured,
so creating our own solution was the only practical way to bring such capabilities to the X65.</p>

<p>It has the following capabilities:</p>

<ul>
  <li>9 channels of 4-operator FM synthesis</li>
  <li>stereo sound</li>
  <li>8 waveforms per operator (sine, triangle, sawtooth, pulse, noise, periodic noise, reserved, sample)</li>
  <li>per-operator waveform parameter for wave shaping</li>
  <li>flexible ESFM-style operator routing (per-operator output and modulation input levels)</li>
  <li>per-operator hard sync and ring modulation</li>
  <li>OPN-style ADSR envelope with sustain rate control (AR/DR/SL/SR/RR) and 5-bit attack/decay/sustain rates</li>
  <li>per-channel resonant filter (low pass, band pass, high pass, ring modulation)</li>
  <li>128 pulse widths for pulse waveform</li>
  <li>volume, frequency and cutoff sweep units (per-channel)</li>
  <li>phase reset timer (per-channel)</li>
  <li>64KB PCM sample memory</li>
  <li>hardware sequencer</li>
</ul>

<p>You can listen to the SGU-1 in action in this YT playlist, when it acts as a stand-in
for various other sound chips, demonstrating its versatility and wide range of capabilities:<br />
<a href="https://youtube.com/playlist?list=PLbSCQdOP-_xh-mkkLIiCdmu_ArqHcOkYM&amp;si=8RVpEhiz4_qCwM7B" target="_blank">https://youtube.com/playlist?list=PLbSCQdOP-_xh-mkkLIiCdmu_ArqHcOkYM&amp;si=8RVpEhiz4_qCwM7B</a></p>

<p>You can also listen and play with SGU-1 using online X65 emulator:</p>

<ul>
  <li><a href="https://x65.zone/emu/emu.html?file=roms/opl.xex" target="_blank">Tyrian, The Level</a></li>
  <li><a href="https://x65.zone/emu/emu.html?file=roms/Mystery_Cannon.xex" target="_blank">Mystery Cannon by Zack Maxis</a></li>
  <li><a href="https://x65.zone/emu/emu.html?file=roms/MontyOnTheRun.xex" target="_blank">Monty On The Run by Robert J. Hubbard</a></li>
  <li><a href="https://x65.zone/emu/emu.html?file=roms/Pokeymania.xex" target="_blank">PokeyMania by 4-Mat</a></li>
  <li><a href="https://x65.zone/emu/emu.html?file=roms/Driller.xex" target="_blank">Driller by Matt Gray</a></li>
</ul>

<p>I’ve also created a port of Furnace Tracker with SGU-1 chip added.<br />
You can download it from the releases page on GitHub:<br />
<a href="https://github.com/X65/furnace/releases" target="_blank">https://github.com/X65/furnace/releases</a></p>

<p>Here is a short test track made by <a href="https://slp.architectenterprises.net/">Ashley</a>:</p>
<audio controls="">
  <source src="/media/sgu-1_first_test.wav" type="audio/wav" />
  Your browser does not support the audio element.
</audio>

<p><img src="/media/2026-02-07-Furnace_SGU-1.png" alt="Furnace Tracker + SGU-1" /></p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[After a month of intense work, the SGU-1 is now feature-complete.]]></summary></entry><entry><title type="html">Font test program</title><link href="https://x65.zone/news/2026/01/18/Font_test.html" rel="alternate" type="text/html" title="Font test program" /><published>2026-01-18T00:00:00+01:00</published><updated>2026-01-18T00:00:00+01:00</updated><id>https://x65.zone/news/2026/01/18/Font_test</id><content type="html" xml:base="https://x65.zone/news/2026/01/18/Font_test.html"><![CDATA[<p>Font test program is online</p>

<p><a href="https://x65.zone/emu/?rom=roms/font_cp.xex#Emu" target="_blank"><img src="/media/2026-01-18_font_cp.png" alt="Testing Fonts" /></a></p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[Font test program is online]]></summary></entry><entry><title type="html">2025 Year in Review</title><link href="https://x65.zone/news/2026/01/16/year-summary.html" rel="alternate" type="text/html" title="2025 Year in Review" /><published>2026-01-16T00:00:00+01:00</published><updated>2026-01-16T00:00:00+01:00</updated><id>https://x65.zone/news/2026/01/16/year-summary</id><content type="html" xml:base="https://x65.zone/news/2026/01/16/year-summary.html"><![CDATA[<p>2025 was the year X65 became a real platform: not just “hardware that runs demos”, but an ecosystem with a serious emulator, modern tooling, an OS taking shape, and DEV-boards in people’s hands. It was also the year of big, practical course-corrections - from video connector realities, through simpler interrupt handling, to a late-year architectural reset toward a Gen2 design and a new custom sound direction.</p>

<p>Here’s the journey, step by step:</p>

<hr />

<h3 id="january-23-2025---hold-and-modify-graphics-mode">January 23, 2025 - Hold-And-Modify Graphics Mode</h3>

<p>After the MODE reshuffle left MODE6 unused, I filled the gap with an Amiga-inspired HAM mode - adapted to X65 constraints. The big win was fitting it into a 64 kB bank by targeting 320x240 and using a 6bpp bitpacked format (4 pixels in 3 bytes). The final encoding ended up being its own thing: 8 base colors, per-channel signed deltas with a tuned quantum, plus an extra BLEND command for 50/50 mixing. I expected “too Amiga”, but the results look distinctly X65 - and the gradients are gorgeous.</p>

<hr />

<h3 id="february-3-2025---emu---x65-emulator">February 3, 2025 - Emu - X65 Emulator</h3>

<p>With RP2350B still unavailable, I pivoted hard into <em>Emu</em> - because modern retro development needs an emulator as much as it needs an assembler. I forked a C64 example from the <code class="language-plaintext highlighter-rouge">chip-emulators</code> toolbox and started swapping the C64’s chips for X65’s equivalents, wiring them together “like on a breadboard” via the pin-mask model. CGIA was brought in by compiling the real firmware C code inside Emu (rewriting the ASM parts to C), which kept Emu close to hardware and even exposed firmware bugs along the way. Audio was trickier: SD-1 isn’t widely emulated, so I used OPL3 as a stopgap and landed on ESFMu after Nuked-OPL3 produced only buzzing.</p>

<h3 id="february-4-2025---emu---development-builds">February 4, 2025 - Emu - Development Builds</h3>

<p>Set up continuous development builds for Linux, Linux ARM, and Windows, automatically produced by GitHub CI on every commit. That made Emu easy to track, test, and share without manual packaging.</p>

<h3 id="february-13-2025---w65c816s-cpu-support-in-emu">February 13, 2025 - W65C816S CPU support in Emu</h3>

<p>The early M6502 core wasn’t enough, so I extended the emulator into a full W65C816S CPU implementation using the <code class="language-plaintext highlighter-rouge">chip-emulators</code> approach: a C wrapper plus a Python instruction decoder generator driven by opcode/addressing-mode tables. To validate it, I built a headless CPU simulator for automated testing, and even got it to run EhBASIC in interactive mode. Meticulous work, but massively easier than writing a 65816 emulator from scratch.</p>

<h3 id="february-21-2025---tech-demos-galore">February 21, 2025 - Tech Demos Galore</h3>

<p>Rewrote the tech demos to run as proper 65C816 assembly programs on the “real” emulated machine, instead of firmware hacks that merely simulated CPU behavior for hardware validation. This was the start of shifting demos from “bring-up tools” into actual software artifacts.</p>

<h3 id="february-27-2025---w65c816s-cpu-emulation-done">February 27, 2025 - W65C816S CPU emulation done</h3>

<p>Huge milestone: 65816 emulation reached “complete” status - all instructions, all addressing modes, in both Emulation and Native modes. Emu itself leveled up too: full 16 MB memory, a sprites debugger, GPIO/joystick ports, label support in the disassembler, and a VTY-style UART console. At this point Emu stopped being a prototype emulator and started being a development environment.</p>

<hr />

<h3 id="march-14-2025---switching-from-dvi-d-to-the-other-connector">March 14, 2025 - Switching from DVI-D to “The Other Connector”</h3>

<p>Swapped the board’s DVI-D connector for an HDMI-shaped connector to make the machine easier to use in the real world - fewer adapters, standard cables, fewer headaches. The key is that X65 still outputs a plain DVI-compatible TMDS stream; the connector shape is convenience, not “HDMI feature compliance”. I also looked at what it would take to do full HDMI with embedded audio and it’s possible, but expensive enough to push into a potential “Plus” variant later.</p>

<h3 id="march-29-2025---os816---multitasking-and-system-calls">March 29, 2025 - OS/816 - Multitasking and System Calls</h3>

<p>OS/816 made a major leap: multitasking scheduler and I/O working, plus a COP-based syscall framework that plays nicely with task switching. The important detail: if a task switch happens mid-syscall, the kernel completes the syscall but returns into the next scheduled task, not necessarily the original caller - clean, modern behavior. A UART echo task using <code class="language-plaintext highlighter-rouge">read()</code>/<code class="language-plaintext highlighter-rouge">write()</code> validated the API, and the CLI shell began taking shape with <code class="language-plaintext highlighter-rouge">help</code> and <code class="language-plaintext highlighter-rouge">echo</code> as a foundation.</p>

<hr />

<h3 id="may-13-2025---simplified-interrupt-controller">May 13, 2025 - Simplified Interrupt Controller</h3>

<p>A solid reality check: using I²C GPIO expanders as an interrupt controller was a latency trap. The solution was aggressively simple - no masking, no ACKing, just a NAND gate to combine sources and a bus transceiver to read interrupt lines in one go. Less “controller”, more “truth table”, but fast and easy to reason about.</p>

<h3 id="may-18-2025---expansion-port-connector">May 18, 2025 - Expansion port connector</h3>

<p>Moved to a proper expansion connector by repurposing a PCIe x4 slot - cheap, available, and much safer than improvised exposed headers. It set the stage for real add-ons without the constant fear of accidental shorts.</p>

<h3 id="may-20-2025---pcm-out-dac-in">May 20, 2025 - PCM out, DAC in</h3>

<p>A major audio redesign: dropped the old PCM channels and integrated an SGTL5000 stereo DAC/ADC codec, giving X65 two sample playback channels. It’s a deliberate trade: beeps now require waveform generation in memory, but sampled sound effects become straightforward - crucial for modern game ports. The ADC also enables line-in sampling and “built-in sampler” style workflows, and the $5 codec cost was largely offset by removing the previous PCM parts.</p>

<h3 id="may-23-2025---direct-video-memory-editing-using-debugger">May 23, 2025 - Direct video memory editing using debugger</h3>

<p>Showed off one of the most “8-bit in spirit” features of X65: uniform shared memory between CPU and VPU. Editing RAM live in the debugger immediately alters video output, with no abstraction barrier in the way - exactly the kind of immediacy that makes these machines fun to develop for.</p>

<h3 id="may-25-2025---vs-code-debugger-extension-for-x65-emu">May 25, 2025 - VS Code Debugger Extension for X65 Emu</h3>

<p>Built <code class="language-plaintext highlighter-rouge">cc65-dbg</code>, a real VS Code debugging extension for cc65/ca65 workflows using Debug Adapter Protocol (DAP). It parses <code class="language-plaintext highlighter-rouge">ld65 --dbgfile</code> output and drives a DAP-capable emulator/adapter, enabling breakpoint synchronization, register/memory views, disassembly, watch expressions, and module-scoped globals. This removed the “manual breakpoint pain” and made X65 development feel like modern debugging, just aimed at 6502/65816.</p>

<h3 id="may-31-2025---flash-chip-added">May 31, 2025 - Flash chip added</h3>

<p>Stopped waiting on RP2354B and added a FLASH chip directly to the board. Routing three devices on the QPI bus was tight and awkward, but worth it to unblock progress and reduce dependency on future parts availability.</p>

<hr />

<h3 id="june-24-2025---first-batch-of-dev-boards">June 24, 2025 - First batch of DEV-boards</h3>

<p>DEV-board Rev1 went into production (PCBWay), explicitly positioned as Milestone 1 rather than “the final computer”. The purpose was clear: validate hardware, push OS/816 forward, and enable real apps and ports. At the same time, the long-term shape of the full machine was laid out: an all-in-one keyboard computer with a 70% keyboard, familiar port layout, extra USB, and internal bays for storage in that classic Amiga/MSX spirit.</p>

<hr />

<h3 id="july-6-2025---lets-talk-about-keyboards">July 6, 2025 - Let’s talk about keyboards…</h3>

<p>With DEV-boards in motion, attention shifted to Milestone 2: the full computer, starting with the keyboard. After trying to find a suitable off-the-shelf option and failing on quality/bulk availability, I committed to designing a custom keyboard. The proposed layout is intentionally “retro-familiar” with packed ortholinear top rows to support wild remaps, plus exploration of ISO/ANSI Enter variants and optional extra keys in place of LEDs.</p>

<h3 id="july-21-2025---dev-boards-arrived">July 21, 2025 - DEV-boards arrived</h3>

<p>The boards landed, looked great, and the real bring-up phase began. This was the moment the year’s emulator/tooling groundwork met real hardware again.</p>

<h3 id="july-24-2025---x65-in-its-natural-habitat">July 24, 2025 - X65 in its natural habitat</h3>

<p>A simple but satisfying snapshot: the DEV-board setup as an actual “kit” on a desk, looking like a real machine-in-progress rather than a lab oddity.</p>

<h3 id="july-29-2025---power-led-brightness">July 29, 2025 - Power LED brightness</h3>

<p>A fun usability gimmick with a very 65816-flavored punchline: switching into native mode makes the power LED visibly brighter. Small detail, big charm.</p>

<hr />

<h3 id="august-5-2025---memtest-command">August 5, 2025 - MEMTEST command</h3>

<p>Tracked down weird crashes to memory instability under certain conditions, tied to overclocked RP2350 timing assumptions. Added a MEMTEST command to stress-test both PSRAM banks and produce useful copy-speed and block-test diagnostics, making it much easier to tune and validate memory parameters.</p>

<h3 id="august-6-2025---video-bitclock-shenanigans">August 6, 2025 - Video bitclock shenanigans</h3>

<p>A monitor revealed an ugly truth: the system was outputting ~76 Hz because video timing was implicitly tied to an overclocked system clock - bad news when VBI timing needs a perfect 60 Hz. The fix was architectural: decouple video timing from the core clock by using the second PLL for HSTX/DVI timing, and settle on a clean 336 MHz system clock that also produces a sweet-spot 112 MHz PSRAM clock divider. Result: perfect 60 Hz video and a more stable overall timing plan.</p>

<h3 id="august-21-2025---dev-board-live-demo">August 21, 2025 - DEV-board live demo</h3>

<p>Ran a real-hardware demo (<code class="language-plaintext highlighter-rouge">mixed_modes.xex</code>) showcasing CGIA’s strengths: multiple background layers, transparency, and mid-screen mode split via display list. And it’s mirrored in Emu for easy sharing and reproduction.</p>

<h3 id="august-27-2025---games--vintage-days-wrocław">August 27, 2025 - Games &amp; Vintage Days Wrocław</h3>

<p>Announced X65 presence at Games &amp; Vintage Days Wrocław, including a talk on building a machine emulator “the EZ way” based on the Emu experience. A clear pivot toward public-facing community building.</p>

<hr />

<h3 id="september-4-2025---block-diagram">September 4, 2025 - Block diagram</h3>

<p>Published a DEV-board block diagram, clarifying the intended conceptual architecture: RIA816 as the north/south-bridge for the 65816, CGIA as a VPU behind it, both designed as “real chips” in spirit even if currently implemented as microcontroller firmware. It reframed the MCU approach as an implementation detail, not the identity of the platform.</p>

<h3 id="september-18-2025---sample-playback">September 18, 2025 - Sample playback</h3>

<p>Demonstrated sampled sound playback on real hardware: 8-bit, 8 kHz, streamed through two DAC channels. A practical proof that the “PCM out, DAC in” direction delivered what it promised.</p>

<h3 id="september-24-2025---sokoban">September 24, 2025 - Sokoban</h3>

<p>First real game landed on X65: Sokoban by zbyti, written in MAD-Pascal, using a tilemap engine and joystick controls. Importantly, it runs on real hardware and can be tried online in Emu - a perfect “community software begins” milestone.</p>

<h3 id="september-25-2025---joy-test">September 25, 2025 - Joy-test</h3>

<p>Confirmed multi-button joystick support on the DEV-board and published a simple joy-test program that reads and visualizes controller state. Small utility, big impact on confidence for game development.</p>

<h3 id="september-25-2025---usb-serial-port">September 25, 2025 - USB serial port</h3>

<p>Made the USB-C power connection pull double duty as a USB-CDC serial port by extending ESP-AT on the ESP32. Result: no external wiring to access the monitor - just plug into a PC and program/debug directly.</p>

<h3 id="september-29-2025---atled">September 29, 2025 - AT+LED</h3>

<p>Started RGB LED support, discovered the on-board LEDs were wired wrong, and worked around it by disabling them via jumper and using an external LED board. Since LEDs are driven by the ESP32 running ESP-AT, the solution was firmware-level: add a new <code class="language-plaintext highlighter-rouge">AT+LED=...</code> command to control color output.</p>

<h3 id="september-30-2025---buzzer-is-back">September 30, 2025 - Buzzer is back</h3>

<p>Used the last spare ESP32-C3 GPIO to add a piezo buzzer and restore classic system beep vibes. Naturally, it comes with its own AT command: <code class="language-plaintext highlighter-rouge">AT+BUZZ=...</code>.</p>

<hr />

<h3 id="october-3-2025---new-gpio-extender">October 3, 2025 - New GPIO extender</h3>

<p>Replaced TI TCA6416A with NXP PCAL6416A to get interrupt masking. The old chip would generate IRQs on any input change whether you cared or not; PCAL6416A lets you request only the interrupts you actually want, and stays pin/register compatible while adding extra features.</p>

<h3 id="october-5-2025---expansion-port-breakout">October 5, 2025 - EXPansion port breakout</h3>

<p>Built breakout boards to actually use and test the expansion port, and documented the exposed signals: 8-bit data/address buses, CPU control lines, I/O enables and interrupt lines, power rails, I²C, UART, audio in/out, and WS2812 LED data. This turned the expansion concept into something developers can start experimenting with immediately.</p>

<h3 id="october-7-2025---ic-on-board-port">October 7, 2025 - I²C on-board port</h3>

<p>Added an on-board I²C header inspired by the Amiga Clockport, intended for simple add-ons like RTC modules or sensors. A small connector with big “make it hackable” energy.</p>

<h3 id="october-13-2025---games--vintage-days-wrocław-2025">October 13, 2025 - Games &amp; Vintage Days Wrocław 2025</h3>

<p>The event happened - and it went great. Strong audience interest, lots of questions, and genuine excitement even from people outside the retro niche. Kids especially latched onto Sokoban, which is exactly the kind of “instant hands-on” win you want at a show.</p>

<h3 id="october-14-2025---od-zera-do-emulatora">October 14, 2025 - Od Zera Do Emulatora</h3>

<p>Published the talk on building an emulator “from zero”, using Emu as the practical example. This neatly closed the loop on the year’s early emulator focus: it wasn’t just a development necessity, it became something teachable and shareable.</p>

<h3 id="october-18-2025---how-does-accessing-external-devices-on-x65-work">October 18, 2025 - How does accessing external devices on X65 work?</h3>

<p>Released a short tutorial video explaining external device access on X65, featuring the interrupt controller. More documentation, more onboarding, less tribal knowledge.</p>

<hr />

<h3 id="november-4-2025---test-tune-on-yamaha-ymf825-sd-1-chip">November 4, 2025 - Test tune on Yamaha YMF825 SD-1 chip</h3>

<p>A proof of life for the SD-1 path: a test program demonstrated memory-mapped access to YMF825 registers from the 65816, producing sound on real hardware. Even with later plans changing, this was an important validation milestone.</p>

<h3 id="november-6-2025---cgia-palette-mode0">November 6, 2025 - CGIA palette MODE0</h3>

<p>CGIA gained paletted text/graphics modes (MODE0 and MODE1) using palette tables stored in CGIA registers rather than dedicated color-attribute memory. This enabled colorful modes with tiny memory footprints, with selectable 1-4 bpp depths and a clever half-bright behavior in 4 bpp. MODE0 also got a multi-color variant with its own constraints, trading glyph range for color richness.</p>

<h3 id="november-12-2025---double-width-and-80-columns-text-modes">November 12, 2025 - Double-width and 80 columns text modes</h3>

<p>Expanded text rendering with double-width support across all text modes (useful for classic “wide character” looks), and demonstrated a readable 80-column text mode using multi-color text behavior and 4x8 cells. This was a practical usability upgrade, not just a graphics party trick.</p>

<hr />

<h3 id="december-2-2025---x65-prototype-gen2">December 2, 2025 - X65 prototype Gen2</h3>

<p>The biggest pivot of the year: after testing Gen1 DEV-board, the architecture moved to Gen2 with two RP2350 MCUs instead of one - splitting roles into North Bridge (CPU+memory) and South Bridge (I/O + VPU). With the extra GPIO budget, this approach can eliminate lots of discrete glue logic. After community discussion, there was also a major sound direction change: moving away from the Yamaha SD-1 (supply too sketchy) toward a custom MCU-based sound processor driving a modern CODEC+DSP. The Gen2 prototype was already mostly working, and the breadboard behaved better than the Gen1 PCB.</p>

<h3 id="december-27-2025---custom-sgu-1-sound-chip">December 27, 2025 - Custom SGU-1 sound chip</h3>

<p>Introduced SGU-1 (Sound Generator Unit 1): a custom sound chip design based on tildearrow’s Sound Unit (tSU), wrapped in a memory-mapped register interface. A quick PoC already played a Rob Hubbard SID tune via a rough register translation, running in the web Emu. It’s explicitly early and imperfect, but it marks a clear new direction: if nobody wants to manufacture cool synth chips anymore, X65 will build its own path.</p>

<hr />

<p>Looking back, 2025 was about turning X65 into something you can actually develop for: Emu matured into a real environment, VS Code tooling removed friction, OS/816 gained real OS-shaped features, and the DEV-board crossed into physical reality and public demos. And then, right at the end, the project did the most “serious” thing it can do: change course decisively toward a simpler, more scalable Gen2 architecture and a sound solution the project can truly own.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[2025 was the year X65 became a real platform: not just “hardware that runs demos”, but an ecosystem with a serious emulator, modern tooling, an OS taking shape, and DEV-boards in people’s hands. It was also the year of big, practical course-corrections - from video connector realities, through simpler interrupt handling, to a late-year architectural reset toward a Gen2 design and a new custom sound direction.]]></summary></entry><entry><title type="html">USB HID Keyboard Support</title><link href="https://x65.zone/news/2026/01/15/HID_Keyboard.html" rel="alternate" type="text/html" title="USB HID Keyboard Support" /><published>2026-01-15T00:00:00+01:00</published><updated>2026-01-15T00:00:00+01:00</updated><id>https://x65.zone/news/2026/01/15/HID_Keyboard</id><content type="html" xml:base="https://x65.zone/news/2026/01/15/HID_Keyboard.html"><![CDATA[<p>Added USB HID keyboard handling today.<br />
Uses the same mmap area as other HID devices.</p>

<p>Extremely simple. A direct mapping of HID keyboard codes to 256 bits in memory.
This gives us the whole keyboard state compacted to 64 bytes.<br />
As described at: <a href="https://picocomputer.github.io/ria.html#keyboard">https://picocomputer.github.io/ria.html#keyboard</a></p>

<p>Due to the fact we have 32 bytes available in the HID memory area,<br />
keyboard state is split into two addressable pages.</p>

<p>It makes the use of the interface very simple and efficient:</p>

<ul>
  <li>one <code class="language-plaintext highlighter-rouge">BIT</code> instruction to check whether any key is pressed</li>
  <li>two instructions (<code class="language-plaintext highlighter-rouge">LDA</code>+<code class="language-plaintext highlighter-rouge">AND</code>) to check whether any particular key is pressed</li>
</ul>

<p>Of course, it works in Emu too…<br />
<a href="https://x65.zone/emu/?rom=roms/controller.xex#Emu">https://x65.zone/emu/?rom=roms/controller.xex#Emu</a></p>

<p><img src="/media/2026-01-15-HID_Keyboard_test.png" alt="HID Keyboard test" /></p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[Added USB HID keyboard handling today. Uses the same mmap area as other HID devices.]]></summary></entry><entry><title type="html">RGB LEDs in Emu</title><link href="https://x65.zone/news/2026/01/14/Emu_LEDs.html" rel="alternate" type="text/html" title="RGB LEDs in Emu" /><published>2026-01-14T00:00:00+01:00</published><updated>2026-01-14T00:00:00+01:00</updated><id>https://x65.zone/news/2026/01/14/Emu_LEDs</id><content type="html" xml:base="https://x65.zone/news/2026/01/14/Emu_LEDs.html"><![CDATA[<p>Added HW RGB LEDs display to Emu.</p>

<p><img src="/media/2026-01-14-Emu_LEDs.png" alt="RGB LEDs in Emu" /></p>

<p>The RGB LEDs use a very simple, yet extensive interface
for an RGB LED chain mapped to <code class="language-plaintext highlighter-rouge">$FFA0</code>-<code class="language-plaintext highlighter-rouge">$FFA7</code>:</p>

<p><img src="/media/2026-01-14-LEDs_MMAP.png" alt="RGB LEDs memory map" /></p>

<p>The first four bytes are direct controls of the first four reds,<br />
with values in RGB332 format.</p>

<p>The next four bytes are an interface for all LEDs in the chain.</p>

<ol>
  <li>You write the requested RGB values to <code class="language-plaintext highlighter-rouge">$FFA5</code> (R), <code class="language-plaintext highlighter-rouge">$FFA6</code> (G), <code class="language-plaintext highlighter-rouge">$FFA7</code> (B).</li>
  <li>You write the number of the LED you want to set to the selected color to <code class="language-plaintext highlighter-rouge">$FFA4</code>.</li>
</ol>

<p>This allows control of up to 256 LEDs, including the first three
built into the X65 machine keyboard.</p>

<p>The simple one-byte interface for the first four LEDs is meant to make trivial
LED blinking a single <code class="language-plaintext highlighter-rouge">STA</code> operation.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[Added HW RGB LEDs display to Emu.]]></summary></entry><entry><title type="html">USB HID Device Support</title><link href="https://x65.zone/news/2026/01/13/HID_GamePad.html" rel="alternate" type="text/html" title="USB HID Device Support" /><published>2026-01-13T00:00:00+01:00</published><updated>2026-01-13T00:00:00+01:00</updated><id>https://x65.zone/news/2026/01/13/HID_GamePad</id><content type="html" xml:base="https://x65.zone/news/2026/01/13/HID_GamePad.html"><![CDATA[<p>USB HID device support has landed in X65 firmware.</p>

<p>Video demonstrating testing HID gamepad support with an expanded test application:</p>

<p><a href="https://youtu.be/08bnaRSnBZs" target="_blank"><img src="/media/2026-01-13-HID_GamePad_08bnaRSnBZs.jpg" alt="Testing HID GamePads" /></a></p>

<p>Memory mapped to <code class="language-plaintext highlighter-rouge">$FFB0</code>-<code class="language-plaintext highlighter-rouge">$FFBF</code></p>

<p><img src="/media/2026-01-13-HID_MMAP.png" alt="HID devices memory map" /></p>

<p>Writing to <code class="language-plaintext highlighter-rouge">$FFB0</code> selects the device.
The memory layout of exposed data is documented here: <a href="https://picocomputer.github.io/ria.html#gamepads">https://picocomputer.github.io/ria.html#gamepads</a></p>

<p>I really like how it turned out.<br />
Extremely ez to access all devices.</p>

<p>The idea of the 0th merged device is that all connected controllers (1st, 2nd, and so on…) contribute to the 0th controller.
So if you are doing a single-player game, you just use the 0th merged controller
and the player can play using any controller.<br />
When you are doing multiplayer, you need to scan particular controllers
and map buttons to players accordingly.</p>

<p>It is implemented in Emu and works in the browser too.<br />
<a href="https://x65.zone/emu/?rom=roms/controller.xex#Emu">https://x65.zone/emu/?rom=roms/controller.xex#Emu</a></p>

<p>What’s wild is that it uses literally the same code that is running on Raspberry Pico
to provide the 65816 CPU with memory-mapped data, just sourcing keypress events differently:
<code class="language-plaintext highlighter-rouge">libusb</code> or <em>Web Gamepad API</em>, respectively.</p>

<p>I’ve also updated the digital DE-9 joystick support.<br />
It now supports 4 buttons.</p>

<ul>
  <li>Joy: <code class="language-plaintext highlighter-rouge">Arrow-Keys</code> / <code class="language-plaintext highlighter-rouge">WSAD</code></li>
  <li>Btn: <code class="language-plaintext highlighter-rouge">ZXCV</code> / <code class="language-plaintext highlighter-rouge">JKL;</code></li>
</ul>

<p>You need to enable these in the menu though…</p>

<p><img src="/media/2026-01-13-Digital_4_buttons.png" alt="4 button joystick test" /></p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[USB HID device support has landed in X65 firmware.]]></summary></entry><entry><title type="html">L2 Cache Implementation</title><link href="https://x65.zone/news/2026/01/11/L2_cache.html" rel="alternate" type="text/html" title="L2 Cache Implementation" /><published>2026-01-11T00:00:00+01:00</published><updated>2026-01-11T00:00:00+01:00</updated><id>https://x65.zone/news/2026/01/11/L2_cache</id><content type="html" xml:base="https://x65.zone/news/2026/01/11/L2_cache.html"><![CDATA[<p>Yes, cache on a 6502-class CPU.</p>

<p>X65 now has a 64 kB L2 cache implemented in the RP2350’s internal SRAM,
sitting between the 65816 and external PSRAM.</p>

<p>PSRAM is relatively slow and was the main CPU bottleneck.<br />
RP2350 SRAM runs at full MCU speed with no wait states,
so cache hits let the 65816 run as fast as it possibly can.</p>

<p>The RP2350 already acts as a bridge between the 65816’s 8-bit parallel bus
and the serial PSRAM interface. Adding caching is a natural extension of that role:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>CPU (8-bit) ⇄ RP2350 [64 kB L2 SRAM] ⇄ PSRAM (8 MB)
</code></pre></div></div>

<p>64 kB is enough to hold the full working set of a typical task,
which significantly reduces PSRAM traffic.</p>

<p>I also evaluated the RP2350’s built-in QSPI XIP cache. It is slightly faster,
but limited to 16 kB. Both cache implementations are selectable
via a compile-time switch, so they can be compared on real workloads
once the new hardware revision is ready.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[Yes, cache on a 6502-class CPU.]]></summary></entry><entry><title type="html">SGU-1 Tech Demo 1</title><link href="https://x65.zone/news/2026/01/06/SGU-1-tech_demo_1.html" rel="alternate" type="text/html" title="SGU-1 Tech Demo 1" /><published>2026-01-06T00:00:00+01:00</published><updated>2026-01-06T00:00:00+01:00</updated><id>https://x65.zone/news/2026/01/06/SGU-1-tech_demo_1</id><content type="html" xml:base="https://x65.zone/news/2026/01/06/SGU-1-tech_demo_1.html"><![CDATA[<p>SGU-1 — Sound Generator Unit 1 is a new audio-synthesis hardware under development as part of the X65 Project.</p>

<p>A video demonstrating sound playback on X65 sound chip:<br />
SGU-1 — Sound Generator Unit 1.</p>

<p>Playing (heavily butchered) 6-channel chiptune<br />
by Zack Maxis (aka Manganoid)<br />
titled Mystery Cannon.</p>

<p><a href="https://youtu.be/Um4VnszF-7s" target="_blank"><img src="/media/2026-01-06-Um4VnszF-7s.jpg" alt="SGU-1 playing 6 channel SID" /></a></p>

<hr />

<p>SGU-1 — Sound Generator Unit 1</p>

<p>is a new audio-synthesis hardware
under development as part of the X65 Project.</p>

<hr />

<p>It is based on the tildearrow Sound Unit</p>

<p>fantasy sound chip from the Furnace chiptune tracker.</p>

<hr />

<p>SGU-1 is implemented using an RP2350 microcontroller
paired with an audio CODEC chip.</p>

<p>Together they generate a stereo 48 kHz I²S stream,
which is converted to an analog stereo line-out signal.</p>

<hr />

<p><img src="/media/2026-01-06-SGU-1_breadboard_prototype.jpeg" alt="SGU-1_breadboard_prototype" /></p>

<hr />

<p>Contemporary audio-synthesis chips
with advanced features are no longer manufactured,</p>

<p>so creating our own solution was the only practical way
to bring such capabilities to the X65.</p>

<hr />

<p>The six-channel chiptune you are hearing is
an excellent piece by Zack Maxis (aka Manganoid)
titled: Mystery Cannon.</p>

<p>In this tech-demo it is heavily butchered by a rough,
direct SID -&gt; SGU-1 register translation.
It is intended purely as a technical proof-of-concept
for the work-in-progress hardware.</p>

<p>Do not evaluate Zack’s composition based on this demo.
Seek out and listen to the original SID version
to appreciate it properly.</p>]]></content><author><name>smokku</name></author><category term="news" /><summary type="html"><![CDATA[SGU-1 — Sound Generator Unit 1 is a new audio-synthesis hardware under development as part of the X65 Project.]]></summary></entry></feed>