Import register enum values

This commit is contained in:
Michael Kohl 2021-04-08 17:58:41 +07:00
parent b105e8ca1e
commit e51bd4a8e2
5 changed files with 49 additions and 45 deletions

1
src/chip8/cpu.rs Normal file
View File

@ -0,0 +1 @@

View File

@ -2,7 +2,7 @@ use crate::chip8::audio::Speaker;
use crate::chip8::display::Screen;
use crate::chip8::keyboard::Keyboard;
use crate::chip8::memory::{Memory, MEMORY_SIZE, PROGRAM_LOAD_ADDRESS};
use crate::chip8::registers::{Register, Registers};
use crate::chip8::registers::{Register::*, Registers};
use crate::chip8::stack::Stack;
use sdl2::AudioSubsystem;
@ -31,20 +31,20 @@ impl Chip8 {
}
pub fn handle_delay_timer(&mut self) -> () {
let delay_timer = self.registers.get(Register::DT);
let delay_timer = self.registers.get(DT);
if delay_timer > 0 {
thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
self.registers.set(Register::DT, delay_timer - 1);
self.registers.set(DT, delay_timer - 1);
}
}
pub fn handle_sound_timer(&mut self) {
let sound_timer = self.registers.get(Register::ST);
let sound_timer = self.registers.get(ST);
let status = sound_timer > 0;
self.speaker.beep(status);
if status {
thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
self.registers.set(Register::ST, sound_timer - 1);
self.registers.set(ST, sound_timer - 1);
}
}
@ -64,9 +64,9 @@ impl Chip8 {
}
pub fn exec(&mut self) {
let pc = self.registers.get(Register::PC);
let pc = self.registers.get(PC);
let opcode = self.memory.read_opcode(pc as usize);
println!("{}", opcode);
self.registers.set(Register::PC, pc + 2);
self.registers.set(PC, pc + 2);
}
}

View File

@ -1,4 +1,5 @@
pub mod audio;
pub mod cpu;
pub mod display;
pub mod emulator;
pub mod keyboard;

View File

@ -26,24 +26,26 @@ pub enum Register {
SP,
}
use Register::*;
fn data_register_to_index(register: Register) -> usize {
match register {
Register::V0 => 0,
Register::V1 => 1,
Register::V2 => 2,
Register::V3 => 3,
Register::V4 => 4,
Register::V5 => 5,
Register::V6 => 6,
Register::V7 => 7,
Register::V8 => 8,
Register::V9 => 9,
Register::VA => 10,
Register::VB => 11,
Register::VC => 12,
Register::VD => 13,
Register::VE => 14,
Register::VF => 15,
V0 => 0,
V1 => 1,
V2 => 2,
V3 => 3,
V4 => 4,
V5 => 5,
V6 => 6,
V7 => 7,
V8 => 8,
V9 => 9,
VA => 10,
VB => 11,
VC => 12,
VD => 13,
VE => 14,
VF => 15,
_ => panic!("invalid data register"),
}
}
@ -71,22 +73,22 @@ impl Registers {
pub fn set(&mut self, register: Register, value: u16) -> () {
match register {
Register::I => self.i = value,
Register::DT => self.delay_timer = value as u8,
Register::ST => self.sound_timer = value as u8,
Register::PC => self.pc = value,
Register::SP => self.sp = value as u8,
I => self.i = value,
DT => self.delay_timer = value as u8,
ST => self.sound_timer = value as u8,
PC => self.pc = value,
SP => self.sp = value as u8,
_ => self.data[data_register_to_index(register)] = value as u8,
}
}
pub fn get(&self, register: Register) -> u16 {
match register {
Register::I => self.i,
Register::DT => self.delay_timer as u16,
Register::ST => self.sound_timer as u16,
Register::PC => self.pc,
Register::SP => self.sp as u16,
I => self.i,
DT => self.delay_timer as u16,
ST => self.sound_timer as u16,
PC => self.pc,
SP => self.sp as u16,
_ => self.data[data_register_to_index(register)] as u16,
}
}
@ -104,28 +106,28 @@ mod tests {
#[test]
fn it_can_write_data_registers() {
let mut registers = Registers::new();
registers.set(Register::VA, 42);
registers.set(VA, 42);
assert_eq!(registers.data[10], 42);
}
#[test]
fn it_can_read_data_registers() {
let mut registers = Registers::new();
registers.set(Register::VA, 42);
assert_eq!(registers.get(Register::VA), 42);
registers.set(VA, 42);
assert_eq!(registers.get(VA), 42);
}
#[test]
fn it_can_write_special_registers() {
let mut registers = Registers::new();
registers.set(Register::PC, 42);
registers.set(PC, 42);
assert_eq!(registers.pc, 42);
}
#[test]
fn it_can_read_special_registers() {
let mut registers = Registers::new();
registers.set(Register::PC, 42);
assert_eq!(registers.get(Register::PC), 42);
registers.set(PC, 42);
assert_eq!(registers.get(PC), 42);
}
}

View File

@ -28,22 +28,22 @@ impl Stack {
#[cfg(test)]
mod tests {
use super::*;
use crate::chip8::registers::{Register, Registers};
use crate::chip8::registers::{Register::*, Registers};
#[test]
fn it_can_push_to_and_pop_from_the_stack() {
let mut registers = Registers::new();
assert_eq!(registers.get(Register::SP), 0);
assert_eq!(registers.get(SP), 0);
let mut stack = Stack::new();
stack.push(&mut registers.sp, 0xff);
assert_eq!(registers.get(Register::SP), 1);
assert_eq!(registers.get(SP), 1);
stack.push(&mut registers.sp, 0xaa);
assert_eq!(registers.get(Register::SP), 2);
assert_eq!(registers.get(SP), 2);
assert_eq!(stack.pop(&mut registers.sp), 170);
assert_eq!(registers.get(Register::SP), 1);
assert_eq!(registers.get(SP), 1);
assert_eq!(stack.pop(&mut registers.sp), 255);
assert_eq!(registers.get(Register::SP), 0);
assert_eq!(registers.get(SP), 0);
}
}