Home

Awesome

jsbeeb tests

jsbeeb - JavaScript BBC Micro Emulator

jsbeeb

A BBC Micro emulator written in JavaScript and running in modern browsers. Emulates a 32K BBC B (with sideways RAM) and a 128K BBC Master, along with a number of different peripherals.

Table of Contents

Keyboard Mappings

The BBC had a somewhat different-looking keyboard to a modern PC, and so it's useful to know some of the mappings:

To play right now, visit https://bbc.xania.org/. To load the default disc image (Elite in this case), press shift-F12 (which is shift-Break on the BBC).

Getting Set Up to Run Locally

Prerequisites

Installation

  1. Clone the repository:
    git clone https://github.com/mattgodbolt/jsbeeb.git
    cd jsbeeb
    
  2. Install dependencies:
    npm install
    
  3. Start the local webserver:
    npm start
    
  4. Visit http://localhost:8080/ in your browser.

jsbeeb uses Node.js and webpack to afford simple and standard web development tooling and third-party library access without lots of painful copy/paste or wheel-reinventing, as well as the ability to better run tests, and "pack" up the site to make it smaller and faster to load when it's deployed to https://bbc.xania.org.

URL Parameters

Patches

Patches can be applied by making a patch=P URL parameter. P is a sequence of semicolon-separated patches of the form @XXXX,YYYY:ZZZZZ,... where the @XXXX specifies a PC address to breakpoint, the YYYY is the address to patch and the ZZZZ is the data to write at address YYYY. The @ part is optional, but is handy to ensure the code you want to patch has actually loaded. For example: patch=@31a6,0769:6e4c4d48465a which is a patch for the default Elite image. Once the PC has reached $31a6, the bytes at 0769 are replaced with 6e4c4d48465a.

Loading BASIC Files from GitHub Gists

  1. Create a gist with your code. https://gist.github.com/ - here's an example
  2. Get the "Raw" link by clicking "raw" and copying the URL. In the case above that's: https://gist.githubusercontent.com/mattgodbolt/fc8d6f3d6e5e015dce399013719c8341/raw/bd5cb4314bfc3ee4330783ecf82cb329a36b915c/foo.bas
  3. Add that after "https://bbc.xania.org/?autorun&loadBasic=" or similar, for example, this link

Note that every update you make means you need to make a new raw link.

Things Left to Do

If you're looking to help:

Tests

For general correctness, there are several tests in the tests directory, including:

For timing correctness, we have:

Tests can be run automatically if you have node installed - just run make and it'll ensure the relevant libraries are installed, then it'll run the tests. Please note it can take a while to run the whole test suite.

Thanks

jsbeeb was heavily based on Sarah Walker's C B-Em emulator -- thanks to her for her hard work and for open sourcing her code. B-em is now being maintained by a group of enthusiasts - thanks to them too!

Huge thanks to Richard Talbot-Watkins for his advice and help along the way in fathoming out the instruction timings, interrupt fun, video code rewrite and for being such a good pal all these many years!

Thanks to Michael Borcherds for his help; improving the keyboard layouts and handling in JavaScript, reporting issues, chasing down game bugs and much more.

Thanks to David Banks (hoglet) for his help in testing the gnarly BCD flag behaviour on real live BBCs.

Cheers to Ed Spittles for testing various interrupt timing code on a real BBC.

Thanks to Chris Jordan for his thorough testing, bug reports, ideas and help.

A lot of the early development used the amazing Visual 6502 as reference for intra-instruction timings. Amazing stuff.

Special shout out to the users of the 6502 Forums

More Information

I've written a lot about how the innards work on my blog in the emulation section. I gave a presentation on how it all fits together at work, and posted the video up on YouTube. I have another presentation at ABug.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Contact

For support or questions, please contact Matt Godbolt at matt@godbolt.org.