An emulator for various m68k and z80 based computers, written in Rust. Currently it has support for the Sega Genesis, TRS-80, and Computie (my own project), with Macintosh support in the works
Go to file
transistor 18e54f4a44 Added line-based hscroll and fixed an hscroll bug
The hscroll table was multiplying by 2 (because scroll a and b values
are next to each other) but it should have multiplied by 4 because
each value is also 2 bytes and the array is of u8.

I added hscroll by-line support by using a different function for the
line scroll vs the cell or whole screen scrolling.  There are still
a bunch of glitches in scroll b's scroll values that I need to fix
2021-12-20 20:11:43 -08:00
binaries Added Macintosh 128k/512k work in progress 2021-12-06 15:04:08 -08:00
docs/posts Fixed capitalization 2021-11-28 10:36:51 -08:00
frontends Cleaned up warnings 2021-12-13 12:00:24 -08:00
images Updated readme 2021-12-05 19:41:23 -08:00
src Added line-based hscroll and fixed an hscroll bug 2021-12-20 20:11:43 -08:00
.gitignore Modified to use a common trait to derive other traits 2021-10-17 10:39:43 -07:00
Cargo.toml Moved tty to frontends/moa-common to remove the dependency on nix 2021-12-06 19:52:04 -08:00
README.md Added LDI, LDD, and LDDR instructions for Z80 2021-12-06 20:44:44 -08:00
todo.txt Added line-based hscroll and fixed an hscroll bug 2021-12-20 20:11:43 -08:00

Moa

Started September 26, 2021

Moa is an emulator/simulator for computers using various 68000 and Z80 CPUs and peripherals. The original idea was to emulate the computer I had built as part of the Computie project.

Currently it can simulate Computie (68000) and the TRS-80 Model I (Z80), and I'm working on supporting the Macintosh 512k and Sega Genesis.

For more detail, check out this post about how I started the project: Making a 68000 Emulator in Rust

Computie

For Computie, it can do everything the 68k-SMT board can do, including run the monitor program and load the Computie OS kernel and boot it from the CompactFlash card. To run it:

cargo run -p moa-console --bin moa-computie

It will open two PTYs: one for the serial terminal, and one for the SLIP connection. Once open, it will try to launch both pyserial-miniterm as a separate process and connect to the Computie PTY. It will also launch slattach with the associated setup commands to create the SLIP device on the host, and set up host routing. The exact commands in src/machines/computie.rs might need to be adjusted to work on different hosts.

TRS-80

For the TRS-80, it can run Level I or Level II Basic, but it doesn't yet support a cassette tape drive or floppy drive. I haven't tested it that thoroughly either, so any help with it would be welcome. I mostly made it to test the Z80 cpu implementation in a simpler computer before I used in the Genesis emulator. The frontend uses the minifb rust crate to open a window and render the characters to screen, as well as accept input from the keyboard.

cargo run -p moa-minifb --release --bin moa-trs-80

By default it will start Level I Basic. To use the other rom, add the option --rom binaries/trs80/level2.rom

alt text

The characters are being drawn pixel by pixel (6x8) using characters I drew using this handy website. They aren't a perfect match of the characters used by the TRS-80

Sega Genesis/MegaDrive

It can be run with:

cargo run -p moa-minifb --release --bin moa-genesis -- <ROM FILE>

The Genesis emulator is a work in progress. It can play a few games but some games won't run because the bank switching for the Z80 coprocessor is not working yet, and some games will hang waiting for the Z80 to respond. For the video processor, the window layer is not drawn and the layer priority is not handled. The horizontal scroll also doesn't work on a line-by-line basis so it tends to be quite jerky as you move, with the sprites and cells misaligned until you've moved one complete cell over (8x8 pixels).

On the Sonic 2 title screen, the colours for Tails are wonky, probably because there's some trickery going on to get more than 16 colours per line, but the emulator currently renders the whole frame at once instead of line by line, so changes that should be made while the screen is updating don't show up

alt text

The game play is mostly working but the bottom of the clouds should be a different colour, probably because highlight/shadow colours are not yet supported. The time in the upper left corner also doesn't seem to progress

alt text

I'm not yet sure why the clouds in the background are cut off suddenly. They change in a glitchy way when you move around

alt text

There are some graphics glitches in Earthworm Jim, but it's almost playable if it wasn't for the 'jump' button, which only makes him jump a few pixels

alt text

General Options

By default, the minifb frontend will scale the window by 2. This can be changed with the --scale [1,2,4] option.

The -t or --threaded options will run the simulated hardware in a separate thread from the frontend, which will run as fast as possible, faster than real-time. By default, the simulated hardware is run inline with the frontend's update cycle, which is limited to 60Hz. The simulation will be run for 16.6ms of simulated time for each frame the frontend draws. But the simulated time is not accurate and Sega Genesis games will run slower than they should.

The -d or --debugger option will make the emulator start the debugger before running. There is a simple built-in debugger for stepping through the rom instructions being emulated. The state of the CPU registers will be displayed after each instruction, breakpoints can be set, memory contents can be examined, and memory locations can be modified. This has helped a lot with tracking down errors in the emulator itself.