diff --git a/src/cpu.rs b/src/cpu.rs index 49555be..e4d668a 100644 --- a/src/cpu.rs +++ b/src/cpu.rs @@ -7,15 +7,15 @@ use ux::{u3, u4}; #[allow(non_snake_case)] pub struct Cpu { - IP: Wrapping, - R0: Wrapping, - R1: Wrapping, - C: bool, - code: [u8; 0x100], - data: [u8; 0x10], - port_in: VecDeque, - port_out: VecDeque, - num_cycles: u64, + pub IP: Wrapping, + pub R0: Wrapping, + pub R1: Wrapping, + pub C: bool, + pub code: [u8; 0x100], + pub data: [u8; 0x10], + pub port_in: VecDeque, + pub port_out: VecDeque, + pub num_cycles: u64, } impl Cpu { diff --git a/src/lib.rs b/src/lib.rs index 43caa6e..520cd80 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,3 +4,35 @@ pub mod assembler; pub mod cpu; pub mod instruction; + +#[cfg(test)] +mod tests { + use crate::{assembler::Assembler, cpu::Cpu}; + use std::num::Wrapping; + + #[test] + fn integration_assemble_execute() { + let code = r#" + MOV R0.l, 0xF # R0 = 15 + MOV R1.l, 0x3 # R1 = 3 + ADD # R0 += R1 (18) + MOV [0], R0 # MEM[0] = R0 (18) + ZERO R0 # R0 = 0 + HALT # EXIT + "#; + let code = Assembler::new().assemble(code).unwrap(); + let mut cpu = Cpu::new(&code); + for _ in 0..5 { + assert!(!cpu.step()); // CPU does not halt… + } + assert!(cpu.step()); // …until it reaches halt instruction + assert_eq!(cpu.IP, Wrapping(5)); // IP points at halt instruction + assert_eq!(cpu.R0, Wrapping(0)); + assert_eq!(cpu.R1, Wrapping(3)); + assert!(!cpu.C); + assert_eq!(cpu.data[0], 18); + for i in 1..=15 { + assert_eq!(cpu.data[i], 0); + } + } +}