mirror of
https://github.com/mre/mos6502.git
synced 2024-11-25 02:33:26 +00:00
Add range_incl.rs and use range_incl() in the tests.
This commit is contained in:
parent
7210ee7d71
commit
6520983de4
@ -33,4 +33,5 @@ pub mod address;
|
|||||||
pub mod instruction;
|
pub mod instruction;
|
||||||
pub mod machine;
|
pub mod machine;
|
||||||
pub mod memory;
|
pub mod memory;
|
||||||
|
pub mod range_incl;
|
||||||
pub mod registers;
|
pub mod registers;
|
||||||
|
@ -31,6 +31,7 @@ use address::{Address, AddressDiff};
|
|||||||
use instruction;
|
use instruction;
|
||||||
use instruction::{DecodedInstr, Instruction, OpInput};
|
use instruction::{DecodedInstr, Instruction, OpInput};
|
||||||
use memory::Memory;
|
use memory::Memory;
|
||||||
|
use range_incl::range_incl;
|
||||||
use registers::{ Registers, StackPointer, Status, StatusArgs };
|
use registers::{ Registers, StackPointer, Status, StatusArgs };
|
||||||
use registers::{ PS_NEGATIVE, PS_DECIMAL_MODE, PS_OVERFLOW, PS_ZERO, PS_CARRY,
|
use registers::{ PS_NEGATIVE, PS_DECIMAL_MODE, PS_OVERFLOW, PS_ZERO, PS_CARRY,
|
||||||
PS_DISABLE_INTERRUPTS };
|
PS_DISABLE_INTERRUPTS };
|
||||||
@ -1230,13 +1231,13 @@ fn compare_with_y_register_test() {
|
|||||||
fn exclusive_or_test() {
|
fn exclusive_or_test() {
|
||||||
let mut machine = Machine::new();
|
let mut machine = Machine::new();
|
||||||
|
|
||||||
for a_before in 0us..256 {
|
for a_before in range_incl(0u8, 255u8) {
|
||||||
for val in 0us..256 {
|
for val in range_incl(0u8, 255u8) {
|
||||||
machine.execute_instruction(
|
machine.execute_instruction(
|
||||||
(Instruction::LDA, OpInput::UseImmediate(a_before as u8))
|
(Instruction::LDA, OpInput::UseImmediate(a_before))
|
||||||
);
|
);
|
||||||
|
|
||||||
machine.exclusive_or(val as u8);
|
machine.exclusive_or(val);
|
||||||
|
|
||||||
let a_after = a_before ^ val;
|
let a_after = a_before ^ val;
|
||||||
assert_eq!(machine.registers.accumulator, a_after as i8);
|
assert_eq!(machine.registers.accumulator, a_after as i8);
|
||||||
@ -1260,13 +1261,13 @@ fn exclusive_or_test() {
|
|||||||
fn inclusive_or_test() {
|
fn inclusive_or_test() {
|
||||||
let mut machine = Machine::new();
|
let mut machine = Machine::new();
|
||||||
|
|
||||||
for a_before in 0us..256 {
|
for a_before in range_incl(0u8, 255u8) {
|
||||||
for val in 0us..256 {
|
for val in range_incl(0u8, 255u8) {
|
||||||
machine.execute_instruction(
|
machine.execute_instruction(
|
||||||
(Instruction::LDA, OpInput::UseImmediate(a_before as u8))
|
(Instruction::LDA, OpInput::UseImmediate(a_before))
|
||||||
);
|
);
|
||||||
|
|
||||||
machine.inclusive_or(val as u8);
|
machine.inclusive_or(val);
|
||||||
|
|
||||||
let a_after = a_before | val;
|
let a_after = a_before | val;
|
||||||
assert_eq!(machine.registers.accumulator, a_after as i8);
|
assert_eq!(machine.registers.accumulator, a_after as i8);
|
||||||
|
36
src/range_incl.rs
Normal file
36
src/range_incl.rs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#![allow(unstable)]
|
||||||
|
|
||||||
|
use std::num::Int;
|
||||||
|
|
||||||
|
pub struct RangeIncl<T: Int> {
|
||||||
|
state: Option<T>,
|
||||||
|
end: T,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn range_incl<T: Int>(begin: T, end: T) -> RangeIncl<T> {
|
||||||
|
RangeIncl { state: Some(begin), end: end }
|
||||||
|
}
|
||||||
|
|
||||||
|
trait One : Int {
|
||||||
|
fn my_one(_: Option<Self>) -> Self {
|
||||||
|
Int::one()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T> One for T where T: Int {}
|
||||||
|
|
||||||
|
impl<T: Int> Iterator for RangeIncl<T> {
|
||||||
|
type Item = T;
|
||||||
|
fn next(&mut self) -> Option<<Self as Iterator>::Item> {
|
||||||
|
match self.state {
|
||||||
|
Some(current) => {
|
||||||
|
self.state =
|
||||||
|
if current == self.end { None }
|
||||||
|
else { Some(current + One::my_one(None::<T>)) };
|
||||||
|
Some(current)
|
||||||
|
},
|
||||||
|
None => {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user