Tag: stm32

26 posts tagged with "stm32".

Reading a Game Boy cartridge through a GBFlash

The console's USB host port meets a cartridge reader that pretends to be a CH340 serial chip. By the end of the day the firmware read and validated a real cartridge header.

Speculative execution against the SNES sound chip

The SNES core was losing four million cycles a frame waiting on a sound chip on another board. Predicting the answer lifted Super Mario World from 35 to about 50 fps.

A flight recorder for firmware

Building a recorder that captures a good run and a bad run of the same firmware workload so a tool can find the first difference that matters.

Proving where the SNES bottleneck was

Days optimising the HDMI coprocessor because every symptom said it was holding the SNES back. The measurements pointed at the wire instead.

Profiling the SNES core on the H7

The from-scratch SNES core matches the reference emulator to the cycle. Five optimisations measured on hardware, and a profiler that says the problem is memory.

The emulated Amiga boots Workbench 1.3

The Amiga core on the STM32H753 boots a real Workbench 1.3 floppy to the desktop, and what it took to get the floppy controller right.

Kickstart 1.3 runs under budget on the STM32H753

First hardware numbers for the Amiga core: a real Kickstart 1.3 ROM executing deterministically at a p99 of 2.51M cycles per PAL frame, against a gate of 3.35M.

Planning USB floppy support

Four transport dialects from 1998 and a FAT12 layer nobody ships, which is why the first firmware milestone is just reading descriptors.

The console's second shell

Two days building the console's second shell, including a crash hunt that ended eight kilobytes from the stack floor.

Cattle Crisis from 9 fps to 58

One day of hardware A/B tests on the H753. The biggest single win was a compiler flag I should have set weeks ago.

Game Boy first light

Two days from a feasibility study to DMG code on the TV, with the console's SPI video wire carrying two frame geometries at once.

A crash reporter for a bare-metal console

Giving the console a crash reporter that survives the reset and emails me, and the ways an STM32H7 loses data across a warm reset.

A 9 by 9 demoscene square in the launcher header

The launcher's blinking sparkle became a 9 by 9 pixel demoscene with seventeen tiny effects dealt from a shuffled deck.

Why the speakers started clicking

The morning after deleting the old Lua core, everything played and then the speakers started clicking. A command trace found three lines of channel semantics and a missing crossfade.

The fixed-point Lua core becomes the default

Stage 9 of the runtime migration, ending the night at 59 fps on jumper wires after a one-byte regression that cost 19 carts.

An evening of unrelated fixes

Three unrelated fixes from one evening. The biggest was a cartridge that finally keeps its saves; the strangest was an iterator that duplicated the player.

z8lua lands behind a flag

The new Lua core measured against the old one on identical silicon, with a licensed PICO-8 as the oracle and a per-cart compatibility matrix.

A runtime baseline before the Lua swap

A permanent benchmark and input tapes recorded from real play, so the new Lua VM has numbers to beat before it lands.

Reading the framebuffer out of RAM

The standalone build sends nothing back to a host, so before I could redesign the boot splash I had to work out how to screenshot a screen my Mac cannot see.

Planning a flash cartridge for the console

Picking a W25Q flash chip for a physical PICO-8 cartridge and mapping how the firmware would read it. Nothing is built yet.

The HDMI board I bought before reading the datasheet

I bought a 50-pin RGB888-to-HDMI board, then counted the pins. The Nucleo never had 24 to give, so the fix is probably a second microcontroller whose whole job is HDMI.

A divide per pixel

Profiling the PICO-8 runtime found a stretched-sprite blit doing an integer divide on every pixel, on a chip with no fast divide.

Moving the SPI panel to DMA

The SPI blit was a blocking row-by-row write that stalled the console for about 13 ms every frame. DMA fixed it and the data cache nearly broke it.

The SPI panel and me

I had a working HDMI path at 12:48am. The next morning I picked up the tiny SPI screen instead and spent nine hours reinventing flicker.

The SPI panel, from a blank screen to 25 MHz

Getting the desktop off the USB stream and onto a real LCD, then climbing from 1 MHz to 25 MHz without losing the audio.

Getting sound out of it

Wiring an I2S DAC to the console over SAI and DMA, and why the audio stayed silent for most of a day.