hg80 1.0.0

Z80 and Z80N CPU core, stepped one clock edge at a time
Documentation
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);
}