MOS-Hardware
This crate contains hardware register tables and support functions for
8-bit retro computers like the Commodore 64, Commander X16, MEGA65 and others.
Please check the examples
directory to see how Rust can be used to generate simple demo effects.
Aims
- Excellent support for Rust programming on CBM (inspired) 8-bit computers
- Labelled registers for expressive hardware programming
- Intuitive bitflags with type checks where possible
- Minimum resource impact
Examples
Read and write to labelled hardware registers
use ;
let old_border_color = .border_color.read;
.border_color.write;
.potentiometer_x.write; // error: read-only register
Use bitflags to safely control hardware
...for example where the VIC-II chip accesses screen memory and character sets:
let bank = AT_2C00.bits | AT_2000.bits;
.screen_and_charset_bank.write;
Convenience functions to perform hardware-specific tasks
...for example to generate random numbers using noise from the C64's SID chip:
.start_random_generator;
let random_number : u8 = rand8!;
Getting started
The project requires rust-mos and is setup to build for C64 by default. A docker image of rust-mos is available if you do not fancy compiling LLVM.
Docker and Visual Studio Code
The easiest way is to use the provided .devcontainer.json configuration for vscode:
- Configure Visual Studio Code with the Remote - Containers extension
- Open the project inside devcontainer when asked
- In the vscode terminal do:
# build for the MEGA65:
Status
The hardware registers are currently incomplete and the library may be subject to significant changes.
- Commodore 64:
-
sid -
vic2 -
cia(partially) -
c64memory map (particlly)
-
- Commander X16
-
vera -
via(partially) -
cx16Memory map (partially) - Support functions
-
- MEGA65:
- partial support for vic3, vic4 and other hardware registers.
- mega65-libc bindings
- Examples:
- Plasma effect (c64, mega65)
- Raster IRQ (c64)
- Sprites (c64)