use super::*;
#[test]
fn a_block_transfer_moves_one_byte_and_steps_all_three_pairs() {
let mut program = vec![0xED, 0xA0];
program.resize(0x40, 0);
program[0x30] = 0xAB;
let (cpu, ram, t) = run_from(
&program,
|cpu| {
cpu.registers_mut().hl = 0x0030;
cpu.registers_mut().de = 0x0038;
cpu.registers_mut().bc = 0x0002;
},
1,
);
assert_eq!(t, 16);
assert_eq!(ram.bytes[0x0038], 0xAB);
assert_eq!(cpu.registers().hl, 0x0031);
assert_eq!(cpu.registers().de, 0x0039);
assert_eq!(cpu.registers().bc, 0x0001);
}
#[test]
fn a_repeating_block_transfer_moves_every_byte() {
let mut program = vec![0xED, 0xB0, 0x76];
program.resize(0x40, 0);
program[0x30] = 0x11;
program[0x31] = 0x22;
program[0x32] = 0x33;
let mut cpu = Cpu::new();
cpu.reset();
cpu.registers_mut().hl = 0x0030;
cpu.registers_mut().de = 0x0038;
cpu.registers_mut().bc = 0x0003;
let mut ram = Ram::with(&program);
let mut total = 0;
for _ in 0..3 {
total += cpu.step_by_edges(&mut ram);
}
assert_eq!(total, 21 + 21 + 16);
assert_eq!(ram.bytes[0x0038], 0x11);
assert_eq!(ram.bytes[0x0039], 0x22);
assert_eq!(ram.bytes[0x003A], 0x33);
assert_eq!(cpu.registers().bc, 0x0000);
assert_eq!(cpu.registers().pc, 0x0002);
}
#[test]
fn a_block_compare_stops_when_it_matches() {
let mut program = vec![0xED, 0xB1, 0x76];
program.resize(0x40, 0);
program[0x30] = 0x11;
program[0x31] = 0x22;
let mut cpu = Cpu::new();
cpu.reset();
cpu.registers_mut().af = 0x2200;
cpu.registers_mut().hl = 0x0030;
cpu.registers_mut().bc = 0x0004;
let mut ram = Ram::with(&program);
cpu.step_by_edges(&mut ram);
cpu.step_by_edges(&mut ram);
assert_eq!(cpu.registers().hl, 0x0032);
assert_eq!(cpu.registers().bc, 0x0002);
assert_eq!(cpu.flags() & crate::flag::Z_MASK, crate::flag::Z_MASK);
assert_eq!(cpu.registers().pc, 0x0002);
}