Eben Upton's Elite and DOOM join jsbeeb's discs, and save states keep sideways RAM

2 hours ago

jsbeeb 2.11 came out on October 24th. It adds four of Eben Upton's discs to the GitHub disc list, Solid Elite and a wireframe DOOM among them, and save states and rewind now keep what's in sideways RAM. There are also two fixes for interlaced screens, and the bitmap modes now draw through WebAssembly SIMD.

Ask about this presentation

Chapters

  1. 0:00jsbeeb 2.11.0
  2. 0:21New GitHub discs
  3. 0:46Sideways RAM in save states
  4. 1:09Older save states still load
  5. 1:36Interlaced display fixes
  6. 2:00WebAssembly SIMD drawing
  7. 2:26Upgrading
Show transcript
  1. jsbeeb 2.11 came out on October 24th. It adds four of Eben Upton's discs to the GitHub disc list, Solid Elite and a wireframe DOOM among them, and save states and rewind now keep what's in sideways RAM. There are also two fixes for interlaced screens, and the bitmap modes now draw through WebAssembly SIMD.

    Slide text
    jsbeeb v2.11.0 · 24 Oct 2026

    Eben Upton's Elite and DOOM join jsbeeb's discs, and save states keep sideways RAM

    Plus two interlaced display fixes, and bitmap modes drawn with WebAssembly SIMD.
    jsbeeb owl
    jsbeeb 2.11.0
  2. This is Solid Elite, Eben Upton's port of Ian Bell and David Braben's Elite to the Master, built on Mark Moxon's documented source. Three more of his discs come with it: a BBC Micro version of 2048, a port of Braben's Lander demo from the Archimedes, and DOOM's first level, E1M1, drawn as a wireframe. All four are now in jsbeeb's GitHub disc list, ready to load.

    Slide text
    jsbeeb v2.11.0
    Solid Elite on the Master. Screenshot: ebenupton/solid-elite-bbc-master

    Four of Eben Upton's discs now load from the GitHub list

    Solid EliteMaster
    Ian Bell and David Braben's Elite, ported
    2048
    Gabriele Cirulli's game, BBC Micro version
    Lander
    David Braben's Archimedes demo, ported
    DOOM E1M1Demo
    id Software's first level, wireframe renderer
  3. Until this release, a snapshot held main memory and left sideways RAM out. So restoring a save state, or rewinding, put main memory back while the sideways banks kept whatever they held at that moment. Now every bank a model has as sideways RAM goes into the snapshot: banks zero to seven on a B, and four to seven on a Master. A stock B and the Atom have none to save.

    Slide text
    jsbeeb v2.11.0 · fix #1511

    Save states and rewind now keep sideways RAM

    Write to a bank, save, change it, restore: the bank comes back as it was.
    ROM bank
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    B
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Master
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Green banks are saved, in swram. A stock B and the Atom have none.
  4. Your existing save states keep working. A file from an earlier version carries 128 kilobytes of main RAM, and jsbeeb now reads just the first 64, the only part that was ever mapped. It has no sideways RAM, so restoring it leaves the banks with their current contents. A new file carries 64 kilobytes of RAM, the sideways banks, and a mask saying which banks they are. The format version stays the same.

    Slide text
    jsbeeb docs/snapshot-format.md
    Saved before 2.11
    ram 128KB; jsbeeb uses the first 64KB
    swram absent; the banks keep their current contents
    Saved by 2.11
    ram 64KB
    swram each sideways RAM bank, 16KB apiece
    swramBankMask bit n set for bank n
    Same snapshot format version. Old files load as they are.
  5. Interlaced screens get two drawing fixes. When an interlaced mode gets stuck drawing just one field, jsbeeb doubles each line to avoid a ghost half frame. The character cell was doubled, but the cursor inverted only one of its two rows. Now the cursor doubles with its cell. And a teletext cell on the line just above an odd field now draws only the part that spills onto the top row.

    Slide text
    jsbeeb fixes #1496, #1508

    The cursor and teletext cells now draw correctly on interlaced screens

    Cursor in a stuck interlaced field
    Lines are doubled there, and now the cursor doubles with its cell.
    2.10.2
    2.11.0
    Teletext cell above an odd field
    Only the part that spills onto row 0 is drawn.
    row 0
  6. The bitmap modes now take a new drawing path. As the beam passes each cell, jsbeeb records the byte and where it goes, then draws the whole batch when the framebuffer is needed, using a WebAssembly SIMD function it assembles at load. Where WebAssembly is switched off, as in Safari's Lockdown Mode, or blocked by a content security policy, a plain JavaScript version draws the same pixels, and the console says it fell back.

    Slide text
    jsbeeb perf #1497

    Bitmap modes now draw through WebAssembly SIMD

    Record
    Each cell's byte and position, as the beam passes it
    →
    Batch
    Drawn when the framebuffer is needed
    →
    Wasm SIMD
    One function, assembled when jsbeeb loads
    WebAssembly switched off, as in Safari's Lockdown Mode, or blocked by a content security policy: a JavaScript drain draws the same pixels.
    video drain falls back to JavaScript
  7. Upgrading to 2.11 needs no migration. There is one limit. A save state made before this release holds no sideways RAM, so restoring it can't bring those banks back. The full notes are on the release page. Eben Upton's Elite and DOOM join jsbeeb's discs, and save states keep sideways RAM.

    Slide text
    jsbeeb v2.11.0
    jsbeeb owl
    jsbeeb 2.11.0

    Upgrading to 2.11.0 needs no migration

    One limit: a save state made before 2.11 holds no sideways RAM, so restoring it leaves the banks as they are.
    Solid Elite, 2048, Lander and DOOM in the disc list. Sideways RAM in save states and rewind. Cursor and teletext fixes on interlaced screens.
    github.com/mattgodbolt/jsbeeb/releases/tag/v2.11.0

What happened in AI today, in your inbox

One short email each evening. Read it and you’re caught up.

Built in New York with ❤️