<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Small Things Retro</title>
    <link>https://nand2mario.github.io/</link>
    <description>Retro gaming and computing experiments by nand2mario</description>
    <language>en-us</language>
    <lastBuildDate>Tue, 23 Jun 2026 06:07:39 GMT</lastBuildDate>
    <atom:link href="https://nand2mario.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>80386 Early Start Memory Access</title>
      <link>https://nand2mario.github.io/posts/2026/80386_early_start/</link>
      <guid>https://nand2mario.github.io/posts/2026/80386_early_start/</guid>
      <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;When Intel designed the 80386, they gave it a trick for hiding memory latency: &lt;strong&gt;Early Start&lt;/strong&gt;. Instead of waiting for an instruction to reach its memory micro-op, the 386 begins the next instruction&#x27;s address work — effective address, segment relocation, the bus cycle — in the last cycle of the current instruction. Intel put it at about 9% of overall performance. It is also the source of the POPAD bug.&lt;/p&gt;</description>
    </item>
    <item>
      <title>z386: An Open-Source 80386 Built Around Original Microcode</title>
      <link>https://nand2mario.github.io/posts/2026/z386/</link>
      <guid>https://nand2mario.github.io/posts/2026/z386/</guid>
      <pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;This is the fifth installment of the &lt;a href=&quot;/tags/386/&quot;&gt;80386 series&lt;/a&gt;. The FPGA CPU is now far enough along to run real software, and this post is about how it works. &lt;a href=&quot;https://github.com/nand2mario/z386&quot;&gt;z386&lt;/a&gt; is a 386-class CPU built around the original Intel microcode, in the same spirit as &lt;a href=&quot;/posts/2025/z8086/&quot;&gt;z8086&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The core is not an instruction-by-instruction emulator in RTL. The goal is to recreate enough of the original machine that the recovered 386 control ROM can drive it. Today z386 boots DOS 6 and DOS 7, runs protected-mode programs like DOS/4GW and DOS/32A, and plays games like Doom and Cannon Fodder. Here are some rough numbers against ao486:&lt;/p&gt;
&lt;div class=&quot;table-wrap&quot;&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th style=&quot;text-align: right;&quot;&gt;z386&lt;/th&gt;
&lt;th style=&quot;text-align: right;&quot;&gt;ao486&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lines of code (cloc)&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;8K&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;17.6K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ALUTs&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;18K&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;21K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Registers&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;5K&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;6.5K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BRAM&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;116K&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;131K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FPGA clock&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;85MHz&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;90MHz&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3DBench FPS&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;34&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;43&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Doom (original) FPS, max details&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;16.5&lt;/td&gt;
&lt;td style=&quot;text-align: right;&quot;&gt;21.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;In current builds, z386 performs like a fast (~70MHz) cached 386-class machine, or a low-end 486. It runs at a much higher clock than historical 386 CPUs, but with somewhat worse CPI (cycles per instruction). The current cache is a 16 KB, 4-way set-associative unified L1, chosen partly to keep the clock high. Real high-end 386 systems often used larger external caches, typically in the 32 KB to 128 KB range.&lt;/p&gt;
&lt;figure style=&quot;width: 100%; max-width: 680px; margin: 28px auto 32px;&quot;&gt;
&lt;img src=&quot;z386_doom2_game.jpg&quot; alt=&quot;Doom II running on z386&quot; class=&quot;no-border&quot;&gt;
&lt;figcaption style=&quot;text-align: center;&quot;&gt;Doom II running on z386.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Much of this 386 microarchitecture archaeology has already been covered in the previous four posts: the &lt;a href=&quot;../80386_multiplication_and_division/&quot;&gt;multiplication/division datapath&lt;/a&gt;, the &lt;a href=&quot;../80386_barrel_shifter/&quot;&gt;barrel shifter&lt;/a&gt;, &lt;a href=&quot;../80386_protection/&quot;&gt;protection and paging&lt;/a&gt;, and the &lt;a href=&quot;../80386_memory_pipeline/&quot;&gt;memory pipeline&lt;/a&gt;. z386 tries to be both an educational reconstruction and a usable FPGA CPU. It keeps many 386-like structures: a 32-entry paging TLB, a barrel shifter shaped like the original, ROM/PLA-style decoding, the Protection PLA model, and most importantly the 37-bit-wide, 2,560-entry microcode ROM. At the same time, it uses FPGA-friendly shortcuts where they make sense, such as DSP blocks for multiplication and the small fast L1 cache.&lt;/p&gt;
&lt;p&gt;In this post, I will fill in the rest of the design: instruction prefetch, decode, the microcode sequencer, cache design, testing, how z386 differs from ao486, and some lessons from the bring-up.&lt;/p&gt;</description>
    </item>
    <item>
      <title>80386 Memory Pipeline</title>
      <link>https://nand2mario.github.io/posts/2026/80386_memory_pipeline/</link>
      <guid>https://nand2mario.github.io/posts/2026/80386_memory_pipeline/</guid>
      <pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;The FPGA 386 core I&#x27;ve been building now boots DOS, runs applications like Norton Commander, and plays games like Doom. On DE10-Nano it currently runs at 75 MHz. With the core now far enough along to run real software, this seems like a good point to step back and look at one of the 80386&#x27;s performance-critical subsystems: its memory pipeline.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;32-bit Protected Mode&lt;/em&gt; was the defining feature of the 80386. In the &lt;a href=&quot;/posts/2026/80386_protection/&quot;&gt;previous post&lt;/a&gt;, I looked at one side of that story: the virtual-memory protection mechanisms. We saw how the 80386 implements protection with a dedicated PLA, segment caches, and a hardware page walker. This time I want to look at virtual memory from a different angle: the microarchitecture of the memory access pipeline, how address translation is made efficient, how microcode drives the process, and what kind of RTL timing the design achieves.&lt;/p&gt;
&lt;p&gt;On paper, x86 virtual memory management looks expensive. Every memory reference seems to require effective address calculation, segment relocation, limit checking, TLB lookup, and, on a miss, two page-table reads plus Accessed/Dirty-bit updates. Yet Intel&#x27;s own 1986 IEEE ICCD paper, Jim Slager&#x27;s &lt;em&gt;Performance Optimizations of the 80386&lt;/em&gt;, describes the common-case address path as completing in about &lt;strong&gt;1.5 clocks&lt;/strong&gt;. How did the 386 pull that off?&lt;/p&gt;
&lt;p&gt;The answer is that virtual memory is not really a serial chain of checks, even if the diagrams make it look that way. It is a carefully overlapped memory pipeline that uses pre-calculation, pipelining, and parallelism to keep the common case surprisingly short.&lt;/p&gt;</description>
    </item>
    <item>
      <title>80386 Protection</title>
      <link>https://nand2mario.github.io/posts/2026/80386_protection/</link>
      <guid>https://nand2mario.github.io/posts/2026/80386_protection/</guid>
      <pubDate>Tue, 24 Feb 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;I&#x27;m building an 80386-compatible core in SystemVerilog and blogging the process. In the &lt;a href=&quot;/posts/2026/80386_barrel_shifter/&quot;&gt;previous post&lt;/a&gt;, we looked at how the 386 reuses one barrel shifter for all shift and rotate instructions. This time we move from real mode to protected and talk about &lt;strong&gt;protection&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The 80286 introduced &quot;Protected Mode&quot; in 1982. It was not popular. The mode was difficult to use, lacked paging, and offered no way to return to real mode without a hardware reset. The 80386, arriving three years later, made protection usable -- adding paging, a flat 32-bit address space, per-page User/Supervisor control, and Virtual 8086 mode so that DOS programs could run inside a protected multitasking system. These features made possible Windows 3.0, OS/2, and early Linux.&lt;/p&gt;
&lt;p&gt;The x86 protection model is notoriously complex, with four privilege rings, segmentation, paging, call gates, task switches, and virtual 8086 mode. What&#x27;s interesting from a hardware perspective is how the 386 manages this complexity on a 275,000-transistor budget. The 386 employs a variety of techniques to implement protection: a dedicated PLA for protection checking, a hardware state machine for page table walks, segment and paging caches, and microcode for everything else.&lt;/p&gt;</description>
    </item>
    <item>
      <title>80386 Barrel Shifter</title>
      <link>https://nand2mario.github.io/posts/2026/80386_barrel_shifter/</link>
      <guid>https://nand2mario.github.io/posts/2026/80386_barrel_shifter/</guid>
      <pubDate>Sat, 07 Feb 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;I’m currently building an 80386-compatible core in SystemVerilog, driven by the original Intel microcode extracted from real 386 silicon. Real mode is now operational in simulation, with more than 10,000 single-instruction test cases passing successfully, and work on protected-mode features is in progress. In the course of this work, corners of the 386 microcode and silicon have been examined in detail; this series documents the resulting findings.&lt;/p&gt;
&lt;p&gt;In the &lt;a href=&quot;/posts/2026/80386_multiplication_and_division/&quot;&gt;previous post&lt;/a&gt;, we looked at multiplication and division -- iterative algorithms that process one bit per cycle. Shifts and rotates are a different story: the 386 has a dedicated &lt;strong&gt;barrel shifter&lt;/strong&gt; that completes an arbitrary multi-bit shift in a single cycle. What&#x27;s interesting is how the microcode makes one piece of hardware serve all shift and rotate variants -- and how the complex rotate-through-carry instructions are handled.&lt;/p&gt;</description>
    </item>
    <item>
      <title>80386 Multiplication and Division</title>
      <link>https://nand2mario.github.io/posts/2026/80386_multiplication_and_division/</link>
      <guid>https://nand2mario.github.io/posts/2026/80386_multiplication_and_division/</guid>
      <pubDate>Sat, 24 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;When Intel released the 80386 in October 1985, it marked a watershed moment for personal computing. The 386 was the first 32-bit x86 processor, increasing the register width from 16 to 32 bits and vastly expanding the address space compared to its predecessors. This wasn&#x27;t just an incremental upgrade—it was the foundation that would carry the PC architecture for decades to come.&lt;/p&gt;</description>
    </item>
    <item>
      <title>New Site Design</title>
      <link>https://nand2mario.github.io/posts/2026/new_site_design/</link>
      <guid>https://nand2mario.github.io/posts/2026/new_site_design/</guid>
      <pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Happy New Year! The site has a fresh new design. I’ve replaced Hugo with a minimal, custom static site generator that suits my needs much better.&lt;/p&gt;</description>
    </item>
    <item>
      <title>z8086: Rebuilding the 8086 from Original Microcode</title>
      <link>https://nand2mario.github.io/posts/2025/z8086/</link>
      <guid>https://nand2mario.github.io/posts/2025/z8086/</guid>
      <pubDate>Sat, 13 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;After &lt;a href=&quot;https://nand2mario.github.io/posts/2025/486tang_486_on_a_credit_card_size_fpga_board/&quot;&gt;486Tang&lt;/a&gt;, I wanted to go back to where x86 started. The result is &lt;a href=&quot;https://github.com/nand2mario/z8086&quot;&gt;&lt;strong&gt;z8086&lt;/strong&gt;&lt;/a&gt;: a 8086/8088 core that runs the &lt;strong&gt;original Intel microcode&lt;/strong&gt;. Instead of hand‑coding hundreds of instructions, the core loads the recovered 512x21 ROM and recreates the micro‑architecture the ROM expects.&lt;/p&gt;
&lt;p&gt;z8086 is compact and FPGA‑friendly: it runs on a single clock domain, avoids vendor-specific primitives, and offers a simple external bus interface. Version 0.1 is about 2000 lines of SystemVerilog, and on a Gowin GW5A device, it uses around 2500 LUTs with a maximum clock speed of 60 MHz. The core passes all ISA test vectors, boots small programs, and can directly control peripherals like an SPI display. While it doesn’t boot DOS yet, it’s getting close.  &lt;/p&gt;</description>
    </item>
    <item>
      <title>8086 Microcode Browser</title>
      <link>https://nand2mario.github.io/posts/2025/8086_microcode_browser/</link>
      <guid>https://nand2mario.github.io/posts/2025/8086_microcode_browser/</guid>
      <pubDate>Thu, 04 Dec 2025 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Since releasing &lt;a href=&quot;/posts/2025/486tang_486_on_a_credit_card_size_fpga_board/&quot;&gt;486Tang&lt;/a&gt;, I’ve been working on recreating the 8086 with a design that stays as faithful as possible to the original chip. That exploration naturally led me deep into the original 8086 microcode — &lt;a href=&quot;https://www.reenigne.org/blog/8086-microcode-disassembled/&quot;&gt;extracted and disassembled&lt;/a&gt; by Andrew Jenner in 2020.&lt;/p&gt;
&lt;p&gt;Like all microcoded CPUs, the 8086 hides a lot of subtle behavior below the assembly layer. While studying it I kept extensive notes, and those eventually evolved into something more useful: an interactive browser for the entire 8086 microcode ROM.&lt;/p&gt;</description>
    </item>
    <item>
      <title>486Tang - 486 on a credit-card-sized FPGA board</title>
      <link>https://nand2mario.github.io/posts/2025/486tang_486_on_a_credit_card_size_FPGA_board/</link>
      <guid>https://nand2mario.github.io/posts/2025/486tang_486_on_a_credit_card_size_FPGA_board/</guid>
      <pubDate>Sat, 13 Sep 2025 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Yesterday I released &lt;a href=&quot;https://github.com/nand2mario/486tang&quot;&gt;486Tang&lt;/a&gt; v0.1 on GitHub. It’s a port of the ao486 MiSTer PC core to the Sipeed Tang Console 138K FPGA. I’ve been trying to get an x86 core running on the Tang for a while. As far as I know, this is the first time ao486 has been ported to a non-Altera FPGA. Here’s a short write‑up of the project.&lt;/p&gt;</description>
    </item>
    <item>
      <title>MCU for Better FPGA Gaming on Tang Console</title>
      <link>https://nand2mario.github.io/posts/2025/mcu_for_better_fpga_gaming/</link>
      <guid>https://nand2mario.github.io/posts/2025/mcu_for_better_fpga_gaming/</guid>
      <pubDate>Tue, 11 Mar 2025 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;A year ago, I &lt;a href=&quot;/posts/2024/softcore_for_fpga_gaming&quot;&gt;added a softcore CPU to SNESTang&lt;/a&gt;, to make FPGA gaming cores easier to use. Over the past months, this allowed me to implement features like an improved menu system and core switching. While the softcore served its purpose, its limitations—slow performance, inability to handle complex peripherals like USB, and FPGA resource consumption—became apparent. Now is again the time to introduce some changes. After extensive collaboration with the Sipeed team, we&#x27;ve finally found a way to tap the Tang boards&#x27; onboard MCU (a Bouffalo BL616 chip) to address these challenges. The result is &lt;strong&gt;&lt;a href=&quot;https://github.com/nand2mario/tangcore/releases/tag/r0.6&quot;&gt;TangCore 0.6&lt;/a&gt;&lt;/strong&gt;, along with all four gaming cores. In this post, I&#x27;ll discuss integrating the MCU with the Tang gaming cores.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Script to Add a Title Page to PDFs</title>
      <link>https://nand2mario.github.io/posts/2025/add_title_page_to_pdf/</link>
      <guid>https://nand2mario.github.io/posts/2025/add_title_page_to_pdf/</guid>
      <pubDate>Mon, 10 Mar 2025 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;I&#x27;ve recently found myself frequently using the &quot;ChatGPT to PDF&quot; Chrome extension to convert ChatGPT conversations into PDF documents. The Deep Research discussions in particular contain valuable info worth preserving in ebook format. However they lack proper title pages. So here&#x27;s a quick Python script to add a simple title page to PDF documents.&lt;/p&gt;</description>
    </item>
    <item>
      <title>UART in Verilog with Fractional Clock Dividers</title>
      <link>https://nand2mario.github.io/posts/2025/uart_with_fractional_clock_divider/</link>
      <guid>https://nand2mario.github.io/posts/2025/uart_with_fractional_clock_divider/</guid>
      <pubDate>Tue, 25 Feb 2025 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Universal Asynchronous Receiver-Transmitter (UART) modules are basic components in embedded systems, enabling serial communication between devices. While there are many free implementations available online, a new challenge arose during my work on the independent software stack for the &lt;a href=&quot;https://sipeed.com/tangconsole&quot;&gt;Tang Console&lt;/a&gt;: &lt;strong&gt;non-integer clock multiples&lt;/strong&gt;. This issue surfaced when FPGA cores running on clocks of different frequencies need to communicate with an MCU via UART. Unlike SPI, where the master dictates the clock, UART demands both sides to adhere to a pre-agreed-upon baud rate (1Mbps in my case). Traditional integer clock dividers in this case yield imprecise baud rates and communication errors. In this post, I’ll explore a nice solution using a &lt;strong&gt;fractional clock divider&lt;/strong&gt; technique.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Blast Processing on the Tang FPGA boards</title>
      <link>https://nand2mario.github.io/posts/2024/mdtang/</link>
      <guid>https://nand2mario.github.io/posts/2024/mdtang/</guid>
      <pubDate>Sat, 19 Oct 2024 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Today we discuss Sega Genesis (or Mega Drive). The 16-bit game consoles held a special place in game history. After the 8-bit machines became extremely popular in the mid-1980s, companies had more resources to pour into R&amp;amp;D of the next generation, leading to more sophisticated designs. And the users truly desired &quot;arcade-level performance&quot;, hence the &quot;Blast Processing&quot; marketing by Sega. These machines were well-received and significantly pushed the industry forward. Although companies like NEC and SNK entered the home console market during this period, the main rivalry was between two companies, Nintendo and Sega. &lt;a href=&quot;https://github.com/nand2mario/snestang&quot;&gt;SNESTang&lt;/a&gt; has been available for some time now. It is about time I bring the other major 16-bit machine, Sega Genesis or Mega Drive, to the Tang boards. &lt;a href=&quot;https://github.com/nand2mario/mdtang&quot;&gt;MDTang 0.1&lt;/a&gt; is a port of &lt;a href=&quot;https://github.com/MiSTer-devel/Genesis_MiSTer&quot;&gt;Genesis-MiSTer&lt;/a&gt; to Tang Mega 138K/138K Pro. In the future, it will also support TangConsole 60K when it is released.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building GBATang part 2 - memory system and others</title>
      <link>https://nand2mario.github.io/posts/2024/gbatang_part_2/</link>
      <guid>https://nand2mario.github.io/posts/2024/gbatang_part_2/</guid>
      <pubDate>Sat, 28 Sep 2024 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;&lt;a href=&quot;https://github.com/nand2mario/gbatang&quot;&gt;GBATang&lt;/a&gt; has been improving pretty quickly since its release and just reached &lt;a href=&quot;https://github.com/nand2mario/gbatang/releases&quot;&gt;version 0.4&lt;/a&gt;.  More games are running. Graphics rendering has improved a lot. And sound bugs were fixed. Continuing &lt;a href=&quot;../gbatang_part_1&quot;&gt;part one&lt;/a&gt;, let us discuss the components that were not covered in the first post.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tips for Working with Tang FPGA boards / Gowin EDA</title>
      <link>https://nand2mario.github.io/posts/2024/tang_tips/</link>
      <guid>https://nand2mario.github.io/posts/2024/tang_tips/</guid>
      <pubDate>Fri, 13 Sep 2024 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Here are a few tips and tricks for using the &lt;a href=&quot;https://www.gowinsemi.com/en/support/home/&quot;&gt;Gowin EDA IDE&lt;/a&gt; and &lt;a href=&quot;https://wiki.sipeed.com/hardware/en/tang/index.html&quot;&gt;Tang FPGA boards&lt;/a&gt;, such as Tang Nano 20K, Tang Primer 25K and Tang Mega 138K.  These are small things that I wish I knew when picking up the Tang boards. Gowin is a relatively small FPGA vendor and documentation is not that complete. So I hope this is helpful for the community. If you are coming from Xilinx or Intel FPGAs, you may also find these useful for quickly getting started.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Building GBATang part 1 - overall design and CPU</title>
      <link>https://nand2mario.github.io/posts/2024/gbatang_part_1/</link>
      <guid>https://nand2mario.github.io/posts/2024/gbatang_part_1/</guid>
      <pubDate>Sat, 07 Sep 2024 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;Version 0.1 of &lt;a href=&quot;https://github.com/nand2mario/gbatang&quot;&gt;GBATang&lt;/a&gt; is just released. It is the first FPGA core for a 32-bit console available for Tang FPGA boards (Tang Mega 138K and the upcoming 60K). The journey is an interesting one for me. This first blog post discusses the experience of porting and building this core, its overall technical design and in more details, the CPU part.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding a Softcore to SNESTang - part 2</title>
      <link>https://nand2mario.github.io/posts/2024/softcore_for_fpga_gaming_part_2/</link>
      <guid>https://nand2mario.github.io/posts/2024/softcore_for_fpga_gaming_part_2/</guid>
      <pubDate>Wed, 07 Feb 2024 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;In &lt;a href=&quot;/posts/2024/softcore_for_fpga_gaming&quot;&gt;part 1&lt;/a&gt;, we discussed why we need a softcore for SNESTang, and how it can use SDRAM in a way that does not disrupt the gaming core. Now we need to provide a firmware program to to make the softcore useful, like displaying a menu. In this part, let&#x27;s explore the building and loading of the RISC-V firmware to get the soft core to do useful work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding a Softcore to SNESTang - part 1</title>
      <link>https://nand2mario.github.io/posts/2024/softcore_for_fpga_gaming/</link>
      <guid>https://nand2mario.github.io/posts/2024/softcore_for_fpga_gaming/</guid>
      <pubDate>Sat, 03 Feb 2024 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;In the recently released &lt;a href=&quot;https://github.com/nand2mario/snestang/releases/tag/v0.3&quot;&gt;SNESTang 0.3&lt;/a&gt;, a softcore-based I/O system is added to enhance the menu system and file system support. Let us explore how this works. Part one of the article discusses why the soft core is necessary, choice of CPU to use and how it works with the SDRAM.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Design notes for SNESTang 0.3</title>
      <link>https://nand2mario.github.io/posts/2024/snes_design_0.3/</link>
      <guid>https://nand2mario.github.io/posts/2024/snes_design_0.3/</guid>
      <pubDate>Sun, 07 Jan 2024 00:00:00 GMT</pubDate>
      <description>&lt;p&gt;This documents the design of &lt;a href=&quot;https://github.com/nand2mario/snestang&quot;&gt;SNESTang&lt;/a&gt; 0.3 for my own reference and others who want to read the code. It also aims to be helpful to people porting other cores to Tang FPGAs.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>