r6502/README.md

74 lines
3.9 KiB
Markdown
Raw Permalink Normal View History

2024-04-02 04:45:50 +00:00
[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/balt-dev/r6502/.github%2Fworkflows%2Frust.yml?branch=trunk&style=flat&label=tests)](https://github.com/balt-dev/r6502/actions/)
2024-04-02 04:22:35 +00:00
[![Documentation](https://docs.rs/r6502/badge.svg)](https://docs.rs/r6502)
[![MSRV](https://img.shields.io/badge/MSRV-1.66.1-gold)](https://gist.github.com/alexheretic/d1e98d8433b602e57f5d0a9637927e0c)
[![Repository](https://img.shields.io/badge/-GitHub-%23181717?style=flat&logo=github&labelColor=%23555555&color=%23181717)](https://github.com/balt-dev/r6502)
[![Latest version](https://img.shields.io/crates/v/r6502.svg)](https://crates.io/crates/r6502)
2024-04-02 04:40:38 +00:00
[![License](https://img.shields.io/crates/l/r6502.svg)](https://github.com/balt-dev/r6502/blob/trunk/LICENSE-MIT)
2024-04-02 04:22:35 +00:00
[![unsafe forbidden](https://img.shields.io/badge/unsafe-forbidden-success.svg)](https://github.com/rust-secure-code/safety-dance/)
2024-04-04 17:31:21 +00:00
![Maintenance](https://img.shields.io/maintenance/passively-developed/2024?color=ok)
2024-04-02 04:22:35 +00:00
# r6502
2024-04-02 05:11:24 +00:00
### Yet another MOS 6502 emulator.
2024-04-02 04:22:35 +00:00
---
2024-04-02 04:31:50 +00:00
Designed to support `no-std` and not require an allocator nor any unsafe code, and be reasonably fast.
2024-04-02 04:22:35 +00:00
The API of this crate shies away from implementing interrupt handling,
instead having you step the emulator one opcode at a time and handle them yourself.
2024-04-04 17:31:21 +00:00
Note that this does not emulate cycle-by-cycle, and as such may not be 100% accurate.
2024-04-02 04:22:35 +00:00
## Feature Flags
The following feature flags exist:
2024-04-02 05:11:24 +00:00
| Name | Description |
|-----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| bcd | Enable binary-coded decimal arithmetic.<br/>Enabled by default. Disable if you're writing a NES emulator.<br/>Note that invalid BCD is left untested and will not function faithfully to the MOS 6502. |
| bytemuck | Enables [bytemuck](https://docs.rs/bytemuck/) support. |
| arbitrary | Enables [arbitrary](https://docs.rs/arbitrary/) support. This will pull in `std`. |
| serde | Enables [serde](https://docs.rs/serde) support. |
2024-04-02 04:22:35 +00:00
## Example
```rust ignore
extern crate std;
use std::eprintln;
use r6502::{Emulator, FunctionReadCallback, FunctionWriteCallback};
fn main() {
let mut emu = Emulator::default()
.with_read_callback(FunctionReadCallback(|state: &mut State, addr| {
// Log reads
eprintln!("Read from #${addr:04x}");
state.memory[addr as usize]
}))
.with_write_callback(FunctionWriteCallback(|state: &mut State, addr, byte|
// Don't write to ROM
if addr < 0xFF00 {
state.memory[addr as usize] = byte
})
)
.with_rom(include_bytes!("rom.bin"))
.with_program_counter(0x200);
loop {
let interrupt_requested = emu.step()
2024-04-02 05:11:24 +00:00
.expect("found an invalid opcode (only MOS 6502 opcodes are supported)");
2024-04-02 04:22:35 +00:00
if interrupt_requested { // Go to IRQ interrupt vector
let vector = u16::from_le_bytes([
emu.read(0xFFFE),
emu.read(0xFFFF)
]);
emu.state.program_counter = vector;
}
}
}
```
---
## Licensing
This may be licensed under either the MIT or Apache-2.0 license, at your option.