#mos #emulation #cpu #8-bit #technology #microprocessor #computer

mos6502

一个MOS 6502仿真器

6个版本 (破坏性更新)

0.6.0 2024年7月29日
0.5.0 2023年10月31日
0.4.0 2023年4月20日
0.3.0 2023年4月20日
0.0.1 2017年11月13日

#19 in 仿真器

Download history 7/week @ 2024-05-17 28/week @ 2024-05-24 6/week @ 2024-05-31 6/week @ 2024-06-07 5/week @ 2024-06-14 16/week @ 2024-06-28 125/week @ 2024-07-26 17/week @ 2024-08-02 12/week @ 2024-08-09 73/week @ 2024-08-16

每月下载量227
用于 strop

BSD-3-Clause

370KB
2K SLoC

mos6502

docs.rs

使用Rust编写的MOS 6502 CPU仿真器。
solid65 测试和验证。
它基于稳定的Rust并支持 #[no_std] 目标。

什么是MOS 6502?

MOS Technology 6502(通常发音为“sixty-five-oh-two”或“six-five-oh-two”)是由Chuck Peddle领导的小团队为MOS Technology设计的8位微处理器。 [...]

1975年推出时,6502是市场上 最便宜的微处理器,比大型公司如Motorola的6800或Intel 8080的竞争设计便宜得多。它的推出导致整个处理器市场的价格迅速下降。 与Zilog Z80一起,它引发了80年代初家用电脑革命的一系列项目。

来源: 维基百科

如何使用此库

use mos6502::memory::Bus;
use mos6502::memory::Memory;
use mos6502::instruction::Nmos6502;
use mos6502::cpu;

fn main() {
    // Calculate the greatest common divisor of 56 and 49
    // using Euclid's algorithm.
    let zero_page_data = [56, 49];

    let program = [
        // (F)irst | (S)econd
        // .algo
        0xa5, 0x00,       // Load from F to A
        // .algo_
        0x38,             // Set carry flag
        0xe5, 0x01,       // Substract S from number in A (from F)
        0xf0, 0x07,       // Jump to .end if diff is zero
        0x30, 0x08,       // Jump to .swap if diff is negative
        0x85, 0x00,       // Load A to F
        0x4c, 0x12, 0x00, // Jump to .algo_
        // .end
        0xa5, 0x00,       // Load from S to A
        0xff,
        // .swap
        0xa6, 0x00,       // load F to X
        0xa4, 0x01,       // load S to Y
        0x86, 0x01,       // Store X to F
        0x84, 0x00,       // Store Y to S
        0x4c, 0x10, 0x00, // Jump to .algo
    ];

    let mut cpu = cpu::CPU::new(Memory::new(), Nmos6502);

    cpu.memory.set_bytes(0x00, &zero_page_data);
    cpu.memory.set_bytes(0x10, &program);
    cpu.registers.program_counter = 0x10;

    cpu.run();

    // The expected GCD is 7
    assert_eq!(7, cpu.registers.accumulator);
}

可以通过自己编译euclid示例来实现相同的功能。

首先安装一个6502汇编器和链接器,例如 cc65.

brew install cc65

然后编译和链接汇编文件

cd examples/asm/euclid
ca65 euclid.a65
ld65 -C ../linker.cfg -o euclid.bin euclid.o

这将创建一个二进制文件 euclid.bin,您可以将它加载到仿真器中

use mos6502::memory::Bus;
use mos6502::memory::Memory;
use mos6502::instruction::Nmos6502;
use mos6502::cpu;
use std::fs::read;

fn main() {
    // Calculate the greatest common divisor of 56 and 49
    // using Euclid's algorithm.
    let zero_page_data = [56, 49];

    // Load the binary file from disk
    let program = match read("examples/asm/euclid/euclid.bin") {
        Ok(data) => data,
        Err(err) => {
            println!("Error reading euclid.bin: {}", err);
            return;
        }
    };

    let mut cpu = cpu::CPU::new(Memory::new(), Nmos6502);

    cpu.memory.set_bytes(0x00, &zero_page_data);
    cpu.memory.set_bytes(0x10, &program);
    cpu.registers.program_counter = 0x10;

    cpu.run();

    // The expected GCD is 7
    assert_eq!(7, cpu.registers.accumulator);
}

致谢

这最初是 amw-zero/6502-rs 的分支,目前看起来 未维护

依赖项