You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
1.8 KiB
Rust

mod r6502;
use r6502::{R6502, Flags, Bus};
// All-RAM bus for testing
struct RAMBus
{
ram: [u8; 64 * 1024]
}
impl RAMBus
{
fn new() -> RAMBus
{
RAMBus { ram: [0; 64 * 1024] }
}
}
impl Bus for RAMBus
{
fn read(&self, addr: u16) -> u8
{
self.ram[addr as usize]
}
fn write(&mut self, addr: u16, value: u8)
{
self.ram[addr as usize] = value;
}
}
fn main()
{
let mut cpu = R6502::new();
println!("\nStatus flag testing...");
cpu.set_flag(Flags::I);
println!("\nI Flag is: {}", cpu.check_flag(Flags::I));
cpu.clear_flag(Flags::I);
println!("\nI Flag is: {}", cpu.check_flag(Flags::I));
println!("\nRunning a very simple test program:\n\tLDA #9\n\tORA #2\n Result should be 11 in the A register");
//////////////////////////
// Setup Bus with program
//////////////////////////
let mut bus = RAMBus::new();
// program address
let addr = 0x0020 as u16;
// Set the program counter address
bus.write(0xFFFC, (addr & 0x00FF) as u8); // low byte
bus.write(0xFFFD, ((addr & 0xFF00) >> 8) as u8); // high byte
2 years ago
///////////////////////////////
// write the program to memory
2 years ago
//////////////////////////////
// LDA #9
bus.write(addr, 0xA9); // LDA - Immediate mode
bus.write(addr + 1, 0x09); // Argument
// ORA #2
bus.write(addr + 2, 0x09); // ORA - Immediate mode
bus.write(addr + 3, 0x02); // Argument
2 years ago
////////////////////
// Run the program!
////////////////////
// Restart cpu
cpu.reset(&mut bus);
// Clock the cpu twice (Clock essentially runs one full instruction)
cpu.clock(&mut bus);
cpu.clock(&mut bus);
println!("\nProgram result, A register: {}", cpu.a);
println!("\nFinished.");
}