extern crate rz80;
#[cfg(test)]
#[allow(unused_imports)]
mod test_opcodes {
use std::cell::Cell;
use rz80;
use rz80::RegT as RegT;
use rz80::CF as CF;
use rz80::NF as NF;
use rz80::VF as VF;
use rz80::PF as PF;
use rz80::XF as XF;
use rz80::HF as HF;
use rz80::YF as YF;
use rz80::ZF as ZF;
use rz80::SF as SF;
struct TestBus {
pub port: Cell<RegT>,
pub val: Cell<RegT>,
}
impl TestBus {
pub fn new() -> TestBus {
TestBus {
port: Cell::new(0),
val: Cell::new(0),
}
}
}
impl rz80::Bus for TestBus {
fn cpu_inp(&self, port: RegT) -> RegT {
(port * 2) & 0xFF
}
fn cpu_outp(&self, port: RegT, val: RegT) {
self.port.set(port);
self.val.set(val);
}
}
fn flags(cpu: &rz80::CPU, expected: rz80::RegT) -> bool {
(cpu.reg.f() & !(XF|YF)) == expected
}
#[test]
fn test_ld_r_s() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x47, 0x4F, 0x57, 0x5F, 0x67, 0x6F, 0x7F,
0x48, 0x51, 0x5A, 0x63, 0x6C, 0x7D,
];
cpu.mem.write(0x0000, &prog);
cpu.reg.set_a(0x12);
assert!(4 == cpu.step(bus)); assert!(0x12 == cpu.reg.b());
assert!(4 == cpu.step(bus)); assert!(0x12 == cpu.reg.c());
assert!(4 == cpu.step(bus)); assert!(0x12 == cpu.reg.d());
assert!(4 == cpu.step(bus)); assert!(0x12 == cpu.reg.e());
assert!(4 == cpu.step(bus)); assert!(0x12 == cpu.reg.h());
assert!(4 == cpu.step(bus)); assert!(0x12 == cpu.reg.l());
assert!(4 == cpu.step(bus)); assert!(0x12 == cpu.reg.a());
cpu.reg.set_b(0x13);
assert!(4 == cpu.step(bus)); assert!(0x13 == cpu.reg.c());
assert!(4 == cpu.step(bus)); assert!(0x13 == cpu.reg.d());
assert!(4 == cpu.step(bus)); assert!(0x13 == cpu.reg.e());
assert!(4 == cpu.step(bus)); assert!(0x13 == cpu.reg.h());
assert!(4 == cpu.step(bus)); assert!(0x13 == cpu.reg.l());
assert!(4 == cpu.step(bus)); assert!(0x13 == cpu.reg.a());
}
#[test]
fn test_ld_ihl() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x77, 0x46, 0x4E, 0x56, 0x5E, 0x66, ];
cpu.mem.write(0x0100, &prog);
cpu.reg.set_a(0x33);
cpu.reg.set_hl(0x1000);
cpu.reg.set_pc(0x0100);
assert!(7 == cpu.step(bus)); assert!(0x33 == cpu.mem.r8(0x1000));
assert!(7 == cpu.step(bus)); assert!(0x33 == cpu.reg.b());
assert!(7 == cpu.step(bus)); assert!(0x33 == cpu.reg.c());
assert!(7 == cpu.step(bus)); assert!(0x33 == cpu.reg.d());
assert!(7 == cpu.step(bus)); assert!(0x33 == cpu.reg.e());
assert!(7 == cpu.step(bus)); assert!(0x33 == cpu.reg.h());
}
#[test]
fn test_ld_ihl_n() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x21, 0x00, 0x20, 0x36, 0x33, 0x21, 0x00, 0x10, 0x36, 0x65, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x2000 == cpu.reg.hl());
assert!(10==cpu.step(bus)); assert!(0x33 == cpu.mem.r8(0x2000));
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(10==cpu.step(bus)); assert!(0x65 == cpu.mem.r8(0x1000));
}
#[test]
fn test_ld_ixiy_n() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0xDD, 0x21, 0x00, 0x20, 0xDD, 0x36, 0x02, 0x33, 0xDD, 0x36, 0xFE, 0x11, 0xFD, 0x21, 0x00, 0x10, 0xFD, 0x36, 0x01, 0x22, 0xFD, 0x36, 0xFF, 0x44, ];
cpu.mem.write(0x0000, &prog);
assert!(14==cpu.step(bus)); assert!(0x2000 == cpu.reg.ix());
assert!(19==cpu.step(bus)); assert!(0x33 == cpu.mem.r8(0x2002));
assert!(19==cpu.step(bus)); assert!(0x11 == cpu.mem.r8(0x1FFE));
assert!(14==cpu.step(bus)); assert!(0x1000 == cpu.reg.iy());
assert!(19==cpu.step(bus)); assert!(0x22 == cpu.mem.r8(0x1001));
assert!(19==cpu.step(bus)); assert!(0x44 == cpu.mem.r8(0x0FFF));
}
#[test]
fn test_ld_ddixiy_nn() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x01, 0x34, 0x12, 0x11, 0x78, 0x56, 0x21, 0xBC, 0x9A, 0x31, 0x68, 0x13, 0xDD, 0x21, 0x21, 0x43, 0xFD, 0x21, 0x65, 0x87, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1234 == cpu.reg.bc());
assert!(10==cpu.step(bus)); assert!(0x5678 == cpu.reg.de());
assert!(10==cpu.step(bus)); assert!(0x9ABC == cpu.reg.hl());
assert!(10==cpu.step(bus)); assert!(0x1368 == cpu.reg.sp());
assert!(14==cpu.step(bus)); assert!(0x4321 == cpu.reg.ix());
assert!(14==cpu.step(bus)); assert!(0x8765 == cpu.reg.iy());
}
#[test]
fn test_ld_hlddixiy_inn() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08
];
cpu.mem.write(0x1000, &data);
let prog = [
0x2A, 0x00, 0x10, 0xED, 0x4B, 0x01, 0x10, 0xED, 0x5B, 0x02, 0x10, 0xED, 0x6B, 0x03, 0x10, 0xED, 0x7B, 0x04, 0x10, 0xDD, 0x2A, 0x05, 0x10, 0xFD, 0x2A, 0x06, 0x10, ];
cpu.mem.write(0x0000, &prog);
assert!(16==cpu.step(bus)); assert!(0x0201 == cpu.reg.hl());
assert!(20==cpu.step(bus)); assert!(0x0302 == cpu.reg.bc());
assert!(20==cpu.step(bus)); assert!(0x0403 == cpu.reg.de());
assert!(20==cpu.step(bus)); assert!(0x0504 == cpu.reg.hl());
assert!(20==cpu.step(bus)); assert!(0x0605 == cpu.reg.sp());
assert!(20==cpu.step(bus)); assert!(0x0706 == cpu.reg.ix());
assert!(20==cpu.step(bus)); assert!(0x0807 == cpu.reg.iy());
}
#[test]
fn test_ld_sp_hlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x21, 0x34, 0x12, 0xDD, 0x21, 0x78, 0x56, 0xFD, 0x21, 0xBC, 0x9A, 0xF9, 0xDD, 0xF9, 0xFD, 0xF9, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1234 == cpu.reg.hl());
assert!(14==cpu.step(bus)); assert!(0x5678 == cpu.reg.ix());
assert!(14==cpu.step(bus)); assert!(0x9ABC == cpu.reg.iy());
assert!(6 ==cpu.step(bus)); assert!(0x1234 == cpu.reg.sp());
assert!(10==cpu.step(bus)); assert!(0x5678 == cpu.reg.sp());
assert!(10==cpu.step(bus)); assert!(0x9ABC == cpu.reg.sp());
}
#[test]
fn test_ld_r_ixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [
1, 2, 3, 4, 5, 6, 7, 8
];
cpu.mem.write(0x1000, &data);
let prog = [
0xDD, 0x21, 0x03, 0x10, 0xDD, 0x7E, 0x00, 0xDD, 0x46, 0x01, 0xDD, 0x4E, 0x02, 0xDD, 0x56, 0xFF, 0xDD, 0x5E, 0xFE, 0xDD, 0x66, 0x03, 0xDD, 0x6E, 0xFD,
0xFD, 0x21, 0x04, 0x10, 0xFD, 0x7E, 0x00, 0xFD, 0x46, 0x01, 0xFD, 0x4E, 0x02, 0xFD, 0x56, 0xFF, 0xFD, 0x5E, 0xFE, 0xFD, 0x66, 0x03, 0xFD, 0x6E, 0xFD, ];
cpu.mem.write(0x0000, &prog);
assert!(14==cpu.step(bus)); assert!(0x1003 == cpu.reg.ix());
assert!(19==cpu.step(bus)); assert!(4 == cpu.reg.a());
assert!(19==cpu.step(bus)); assert!(5 == cpu.reg.b());
assert!(19==cpu.step(bus)); assert!(6 == cpu.reg.c());
assert!(19==cpu.step(bus)); assert!(3 == cpu.reg.d());
assert!(19==cpu.step(bus)); assert!(2 == cpu.reg.e());
assert!(19==cpu.step(bus)); assert!(7 == cpu.reg.h());
assert!(19==cpu.step(bus)); assert!(1 == cpu.reg.l());
assert!(14==cpu.step(bus)); assert!(0x1004 == cpu.reg.iy());
assert!(19==cpu.step(bus)); assert!(5 == cpu.reg.a());
assert!(19==cpu.step(bus)); assert!(6 == cpu.reg.b());
assert!(19==cpu.step(bus)); assert!(7 == cpu.reg.c());
assert!(19==cpu.step(bus)); assert!(4 == cpu.reg.d());
assert!(19==cpu.step(bus)); assert!(3 == cpu.reg.e());
assert!(19==cpu.step(bus)); assert!(8 == cpu.reg.h());
assert!(19==cpu.step(bus)); assert!(2 == cpu.reg.l());
}
#[test]
fn test_ld_ixiy_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0xDD, 0x21, 0x03, 0x10, 0x3E, 0x12, 0xDD, 0x77, 0x00, 0x06, 0x13, 0xDD, 0x70, 0x01, 0x0E, 0x14, 0xDD, 0x71, 0x02, 0x16, 0x15, 0xDD, 0x72, 0xFF, 0x1E, 0x16, 0xDD, 0x73, 0xFE, 0x26, 0x17, 0xDD, 0x74, 0x03, 0x2E, 0x18, 0xDD, 0x75, 0xFD, 0xFD, 0x21, 0x03, 0x10, 0x3E, 0x12, 0xFD, 0x77, 0x00, 0x06, 0x13, 0xFD, 0x70, 0x01, 0x0E, 0x14, 0xFD, 0x71, 0x02, 0x16, 0x15, 0xFD, 0x72, 0xFF, 0x1E, 0x16, 0xFD, 0x73, 0xFE, 0x26, 0x17, 0xFD, 0x74, 0x03, 0x2E, 0x18, 0xFD, 0x75, 0xFD, ];
cpu.mem.write(0x0000, &prog);
assert!(14==cpu.step(bus)); assert!(0x1003 == cpu.reg.ix());
assert!(7 ==cpu.step(bus)); assert!(0x12 == cpu.reg.a());
assert!(19==cpu.step(bus)); assert!(0x12 == cpu.mem.r8(0x1003));
assert!(7 ==cpu.step(bus)); assert!(0x13 == cpu.reg.b());
assert!(19==cpu.step(bus)); assert!(0x13 == cpu.mem.r8(0x1004));
assert!(7 ==cpu.step(bus)); assert!(0x14 == cpu.reg.c());
assert!(19==cpu.step(bus)); assert!(0x14 == cpu.mem.r8(0x1005));
assert!(7 ==cpu.step(bus)); assert!(0x15 == cpu.reg.d());
assert!(19==cpu.step(bus)); assert!(0x15 == cpu.mem.r8(0x1002));
assert!(7 ==cpu.step(bus)); assert!(0x16 == cpu.reg.e());
assert!(19==cpu.step(bus)); assert!(0x16 == cpu.mem.r8(0x1001));
assert!(7 ==cpu.step(bus)); assert!(0x17 == cpu.reg.h());
assert!(19==cpu.step(bus)); assert!(0x17 == cpu.mem.r8(0x1006));
assert!(7 ==cpu.step(bus)); assert!(0x18 == cpu.reg.l());
assert!(19==cpu.step(bus)); assert!(0x18 == cpu.mem.r8(0x1000));
assert!(14==cpu.step(bus)); assert!(0x1003 == cpu.reg.iy());
assert!(7 ==cpu.step(bus)); assert!(0x12 == cpu.reg.a());
assert!(19==cpu.step(bus)); assert!(0x12 == cpu.mem.r8(0x1003));
assert!(7 ==cpu.step(bus)); assert!(0x13 == cpu.reg.b());
assert!(19==cpu.step(bus)); assert!(0x13 == cpu.mem.r8(0x1004));
assert!(7 ==cpu.step(bus)); assert!(0x14 == cpu.reg.c());
assert!(19==cpu.step(bus)); assert!(0x14 == cpu.mem.r8(0x1005));
assert!(7 ==cpu.step(bus)); assert!(0x15 == cpu.reg.d());
assert!(19==cpu.step(bus)); assert!(0x15 == cpu.mem.r8(0x1002));
assert!(7 ==cpu.step(bus)); assert!(0x16 == cpu.reg.e());
assert!(19==cpu.step(bus)); assert!(0x16 == cpu.mem.r8(0x1001));
assert!(7 ==cpu.step(bus)); assert!(0x17 == cpu.reg.h());
assert!(19==cpu.step(bus)); assert!(0x17 == cpu.mem.r8(0x1006));
assert!(7 ==cpu.step(bus)); assert!(0x18 == cpu.reg.l());
assert!(19==cpu.step(bus)); assert!(0x18 == cpu.mem.r8(0x1000));
}
#[test]
fn test_push_pop() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x01, 0x34, 0x12, 0x11, 0x78, 0x56, 0x21, 0xBC, 0x9A, 0x3E, 0xEF, 0xDD, 0x21, 0x45, 0x23, 0xFD, 0x21, 0x89, 0x67, 0x31, 0x00, 0x01, 0xF5, 0xC5, 0xD5, 0xE5, 0xDD, 0xE5, 0xFD, 0xE5, 0xF1, 0xC1, 0xD1, 0xE1, 0xDD, 0xE1, 0xFD, 0xE1, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1234 == cpu.reg.bc());
assert!(10==cpu.step(bus)); assert!(0x5678 == cpu.reg.de());
assert!(10==cpu.step(bus)); assert!(0x9ABC == cpu.reg.hl());
assert!(7 ==cpu.step(bus)); assert!(0xEF00 == cpu.reg.af());
assert!(14==cpu.step(bus)); assert!(0x2345 == cpu.reg.ix());
assert!(14==cpu.step(bus)); assert!(0x6789 == cpu.reg.iy());
assert!(10==cpu.step(bus)); assert!(0x0100 == cpu.reg.sp());
assert!(11==cpu.step(bus)); assert!(0xEF00 == cpu.mem.r16(0x00FE)); assert!(0x00FE == cpu.reg.sp());
assert!(11==cpu.step(bus)); assert!(0x1234 == cpu.mem.r16(0x00FC)); assert!(0x00FC == cpu.reg.sp());
assert!(11==cpu.step(bus)); assert!(0x5678 == cpu.mem.r16(0x00FA)); assert!(0x00FA == cpu.reg.sp());
assert!(11==cpu.step(bus)); assert!(0x9ABC == cpu.mem.r16(0x00F8)); assert!(0x00F8 == cpu.reg.sp());
assert!(15==cpu.step(bus)); assert!(0x2345 == cpu.mem.r16(0x00F6)); assert!(0x00F6 == cpu.reg.sp());
assert!(15==cpu.step(bus)); assert!(0x6789 == cpu.mem.r16(0x00F4)); assert!(0x00F4 == cpu.reg.sp());
assert!(10==cpu.step(bus)); assert!(0x6789 == cpu.reg.af()); assert!(0x00F6 == cpu.reg.sp());
assert!(10==cpu.step(bus)); assert!(0x2345 == cpu.reg.bc()); assert!(0x00F8 == cpu.reg.sp());
assert!(10==cpu.step(bus)); assert!(0x9ABC == cpu.reg.de()); assert!(0x00FA == cpu.reg.sp());
assert!(10==cpu.step(bus)); assert!(0x5678 == cpu.reg.hl()); assert!(0x00FC == cpu.reg.sp());
assert!(14==cpu.step(bus)); assert!(0x1234 == cpu.reg.ix()); assert!(0x00FE == cpu.reg.sp());
assert!(14==cpu.step(bus)); assert!(0xEF00 == cpu.reg.iy()); assert!(0x0100 == cpu.reg.sp());
}
#[test]
fn test_add_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x0F, 0x87, 0x06, 0xE0, 0x80, 0x3E, 0x81, 0x0E, 0x80, 0x81, 0x16, 0xFF, 0x82, 0x1E, 0x40, 0x83, 0x26, 0x80, 0x84, 0x2E, 0x33, 0x85, 0xC6, 0x44, ];
cpu.mem.write(0x0000, &prog);
assert!(7==cpu.step(bus)); assert!(0x0F == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x1E == cpu.reg.a()); assert!(flags(&cpu, HF));
assert!(7==cpu.step(bus)); assert!(0xE0 == cpu.reg.b());
assert!(4==cpu.step(bus)); assert!(0xFE == cpu.reg.a()); assert!(flags(&cpu, SF));
assert!(7==cpu.step(bus)); assert!(0x81 == cpu.reg.a());
assert!(7==cpu.step(bus)); assert!(0x80 == cpu.reg.c());
assert!(4==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, VF|CF));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.d());
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|HF|CF));
assert!(7==cpu.step(bus)); assert!(0x40 == cpu.reg.e());
assert!(4==cpu.step(bus)); assert!(0x40 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(7==cpu.step(bus)); assert!(0x80 == cpu.reg.h());
assert!(4==cpu.step(bus)); assert!(0xC0 == cpu.reg.a()); assert!(flags(&cpu, SF));
assert!(7==cpu.step(bus)); assert!(0x33 == cpu.reg.l());
assert!(4==cpu.step(bus)); assert!(0xF3 == cpu.reg.a()); assert!(flags(&cpu, SF));
assert!(7==cpu.step(bus)); assert!(0x37 == cpu.reg.a()); assert!(flags(&cpu, CF));
}
#[test]
fn test_add_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x41, 0x61, 0x81 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0x3E, 0x00, 0x86, 0xDD, 0x86, 0x01, 0xFD, 0x86, 0xFF, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(14==cpu.step(bus)); assert!(0x1000 == cpu.reg.ix());
assert!(14==cpu.step(bus)); assert!(0x1003 == cpu.reg.iy());
assert!(7 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(7 ==cpu.step(bus)); assert!(0x41 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(19==cpu.step(bus)); assert!(0xA2 == cpu.reg.a()); assert!(flags(&cpu, SF|VF));
assert!(19==cpu.step(bus)); assert!(0x23 == cpu.reg.a()); assert!(flags(&cpu, VF|CF));
}
#[test]
fn test_adc_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x00, 0x06, 0x41, 0x0E, 0x61, 0x16, 0x81, 0x1E, 0x41, 0x26, 0x61, 0x2E, 0x81, 0x8F, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0xCE, 0x01, ];
cpu.mem.write(0x0000, &prog);
assert!(7==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(7==cpu.step(bus)); assert!(0x41 == cpu.reg.b());
assert!(7==cpu.step(bus)); assert!(0x61 == cpu.reg.c());
assert!(7==cpu.step(bus)); assert!(0x81 == cpu.reg.d());
assert!(7==cpu.step(bus)); assert!(0x41 == cpu.reg.e());
assert!(7==cpu.step(bus)); assert!(0x61 == cpu.reg.h());
assert!(7==cpu.step(bus)); assert!(0x81 == cpu.reg.l());
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF));
assert!(4==cpu.step(bus)); assert!(0x41 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0xA2 == cpu.reg.a()); assert!(flags(&cpu, SF|VF));
assert!(4==cpu.step(bus)); assert!(0x23 == cpu.reg.a()); assert!(flags(&cpu, VF|CF));
assert!(4==cpu.step(bus)); assert!(0x65 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0xC6 == cpu.reg.a()); assert!(flags(&cpu, SF|VF));
assert!(4==cpu.step(bus)); assert!(0x47 == cpu.reg.a()); assert!(flags(&cpu, VF|CF));
assert!(7==cpu.step(bus)); assert!(0x49 == cpu.reg.a()); assert!(flags(&cpu, 0));
}
#[test]
fn test_adc_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x41, 0x61, 0x81, 0x2 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0x3E, 0x00, 0x86, 0xDD, 0x8E, 0x01, 0xFD, 0x8E, 0xFF, 0xDD, 0x8E, 0x03, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(14==cpu.step(bus)); assert!(0x1000 == cpu.reg.ix());
assert!(14==cpu.step(bus)); assert!(0x1003 == cpu.reg.iy());
assert!(7 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(7 ==cpu.step(bus)); assert!(0x41 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(19==cpu.step(bus)); assert!(0xA2 == cpu.reg.a()); assert!(flags(&cpu, SF|VF));
assert!(19==cpu.step(bus)); assert!(0x23 == cpu.reg.a()); assert!(flags(&cpu, VF|CF));
assert!(19==cpu.step(bus)); assert!(0x26 == cpu.reg.a()); assert!(flags(&cpu, 0));
}
#[test]
fn test_sub_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x04, 0x06, 0x01, 0x0E, 0xF8, 0x16, 0x0F, 0x1E, 0x79, 0x26, 0xC0, 0x2E, 0xBF, 0x97, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0xD6, 0x01, 0xD6, 0xFE, ];
cpu.mem.write(0x0000, &prog);
assert!(7==cpu.step(bus)); assert!(0x04 == cpu.reg.a());
assert!(7==cpu.step(bus)); assert!(0x01 == cpu.reg.b());
assert!(7==cpu.step(bus)); assert!(0xF8 == cpu.reg.c());
assert!(7==cpu.step(bus)); assert!(0x0F == cpu.reg.d());
assert!(7==cpu.step(bus)); assert!(0x79 == cpu.reg.e());
assert!(7==cpu.step(bus)); assert!(0xC0 == cpu.reg.h());
assert!(7==cpu.step(bus)); assert!(0xBF == cpu.reg.l());
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(4==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x07 == cpu.reg.a()); assert!(flags(&cpu, NF));
assert!(4==cpu.step(bus)); assert!(0xF8 == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x7F == cpu.reg.a()); assert!(flags(&cpu, HF|VF|NF));
assert!(4==cpu.step(bus)); assert!(0xBF == cpu.reg.a()); assert!(flags(&cpu, SF|VF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(7==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, NF));
}
#[test]
fn test_cp_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x04, 0x06, 0x05, 0x0E, 0x03, 0x16, 0xff, 0x1E, 0xaa, 0x26, 0x80, 0x2E, 0x7f, 0xBF, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0xFE, 0x04, ];
cpu.mem.write(0x0000, &prog);
assert!(7==cpu.step(bus)); assert!(0x04 == cpu.reg.a());
assert!(7==cpu.step(bus)); assert!(0x05 == cpu.reg.b());
assert!(7==cpu.step(bus)); assert!(0x03 == cpu.reg.c());
assert!(7==cpu.step(bus)); assert!(0xff == cpu.reg.d());
assert!(7==cpu.step(bus)); assert!(0xaa == cpu.reg.e());
assert!(7==cpu.step(bus)); assert!(0x80 == cpu.reg.h());
assert!(7==cpu.step(bus)); assert!(0x7f == cpu.reg.l());
assert!(4==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(4==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, NF));
assert!(4==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, HF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, HF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, SF|VF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(7==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
}
#[test]
fn test_sub_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x41, 0x61, 0x81 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0x3E, 0x00, 0x96, 0xDD, 0x96, 0x01, 0xFD, 0x96, 0xFE, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(14==cpu.step(bus)); assert!(0x1000 == cpu.reg.ix());
assert!(14==cpu.step(bus)); assert!(0x1003 == cpu.reg.iy());
assert!(7 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(7 ==cpu.step(bus)); assert!(0xBF == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(19==cpu.step(bus)); assert!(0x5E == cpu.reg.a()); assert!(flags(&cpu, VF|NF));
assert!(19==cpu.step(bus)); assert!(0xFD == cpu.reg.a()); assert!(flags(&cpu, SF|NF|CF));
}
#[test]
fn test_cp_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x41, 0x61, 0x22 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0x3E, 0x41, 0xBE, 0xDD, 0xBE, 0x01, 0xFD, 0xBE, 0xFF, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(14==cpu.step(bus)); assert!(0x1000 == cpu.reg.ix());
assert!(14==cpu.step(bus)); assert!(0x1003 == cpu.reg.iy());
assert!(7 ==cpu.step(bus)); assert!(0x41 == cpu.reg.a());
assert!(7 ==cpu.step(bus)); assert!(0x41 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(19==cpu.step(bus)); assert!(0x41 == cpu.reg.a()); assert!(flags(&cpu, SF|NF|CF));
assert!(19==cpu.step(bus)); assert!(0x41 == cpu.reg.a()); assert!(flags(&cpu, HF|NF));
}
#[test]
fn test_sbc_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x04, 0x06, 0x01, 0x0E, 0xF8, 0x16, 0x0F, 0x1E, 0x79, 0x26, 0xC0, 0x2E, 0xBF, 0x97, 0x98, 0x99, 0x9A, 0x9B, 0x9C, 0x9D, 0xDE, 0x01, 0xDE, 0xFE, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..7 {
cpu.step(bus);
}
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(4==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x06 == cpu.reg.a()); assert!(flags(&cpu, NF));
assert!(4==cpu.step(bus)); assert!(0xF7 == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x7D == cpu.reg.a()); assert!(flags(&cpu, HF|VF|NF));
assert!(4==cpu.step(bus)); assert!(0xBD == cpu.reg.a()); assert!(flags(&cpu, SF|VF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0xFD == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(7==cpu.step(bus)); assert!(0xFB == cpu.reg.a()); assert!(flags(&cpu, SF|NF));
assert!(7==cpu.step(bus)); assert!(0xFD == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
}
#[test]
fn test_sbc_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x41, 0x61, 0x81 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0x3E, 0x00, 0x9E, 0xDD, 0x9E, 0x01, 0xFD, 0x9E, 0xFE, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(14==cpu.step(bus)); assert!(0x1000 == cpu.reg.ix());
assert!(14==cpu.step(bus)); assert!(0x1003 == cpu.reg.iy());
assert!(7 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(7 ==cpu.step(bus)); assert!(0xBF == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(19==cpu.step(bus)); assert!(0x5D == cpu.reg.a()); assert!(flags(&cpu, VF|NF));
assert!(19==cpu.step(bus)); assert!(0xFC == cpu.reg.a()); assert!(flags(&cpu, SF|NF|CF));
}
#[test]
fn test_or_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x97, 0x06, 0x01, 0x0E, 0x02, 0x16, 0x04, 0x1E, 0x08, 0x26, 0x10, 0x2E, 0x20, 0xB7, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xF6, 0x40, 0xF6, 0x80, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..7 {
cpu.step(bus);
}
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|PF));
assert!(4==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x03 == cpu.reg.a()); assert!(flags(&cpu, PF));
assert!(4==cpu.step(bus)); assert!(0x07 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x0F == cpu.reg.a()); assert!(flags(&cpu, PF));
assert!(4==cpu.step(bus)); assert!(0x1F == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x3F == cpu.reg.a()); assert!(flags(&cpu, PF));
assert!(7==cpu.step(bus)); assert!(0x7F == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
}
#[test]
fn test_xor_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x97, 0x06, 0x01, 0x0E, 0x03, 0x16, 0x07, 0x1E, 0x0F, 0x26, 0x1F, 0x2E, 0x3F, 0xAF, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xEE, 0x7F, 0xEE, 0xFF, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..7 {
cpu.step(bus);
}
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|PF));
assert!(4==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x02 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x05 == cpu.reg.a()); assert!(flags(&cpu, PF));
assert!(4==cpu.step(bus)); assert!(0x0A == cpu.reg.a()); assert!(flags(&cpu, PF));
assert!(4==cpu.step(bus)); assert!(0x15 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x2A == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(7==cpu.step(bus)); assert!(0x55 == cpu.reg.a()); assert!(flags(&cpu, PF));
assert!(7==cpu.step(bus)); assert!(0xAA == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
}
#[test]
fn test_or_xor_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x41, 0x62, 0x84 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0xB6, 0xDD, 0xB6, 0x01, 0xFD, 0xB6, 0xFF, 0xAE, 0xDD, 0xAE, 0x01, 0xFD, 0xAE, 0xFF, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(7 ==cpu.step(bus)); assert!(0x41 == cpu.reg.a()); assert!(flags(&cpu, PF));
assert!(19==cpu.step(bus)); assert!(0x63 == cpu.reg.a()); assert!(flags(&cpu, PF));
assert!(19==cpu.step(bus)); assert!(0xE7 == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
assert!(7 ==cpu.step(bus)); assert!(0xA6 == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
assert!(19==cpu.step(bus)); assert!(0xC4 == cpu.reg.a()); assert!(flags(&cpu, SF));
assert!(19==cpu.step(bus)); assert!(0x40 == cpu.reg.a()); assert!(flags(&cpu, 0));
}
#[test]
fn test_and_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0xFF, 0x06, 0x01, 0x0E, 0x03, 0x16, 0x04, 0x1E, 0x08, 0x26, 0x10, 0x2E, 0x20, 0xA0, 0xF6, 0xFF, 0xA1, 0xF6, 0xFF, 0xA2, 0xF6, 0xFF, 0xA3, 0xF6, 0xFF, 0xA4, 0xF6, 0xFF, 0xA5, 0xF6, 0xFF, 0xE6, 0x40, 0xF6, 0xFF, 0xE6, 0xAA, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..7 {
cpu.step(bus);
}
assert!(4==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, HF));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
assert!(4==cpu.step(bus)); assert!(0x03 == cpu.reg.a()); assert!(flags(&cpu, HF|PF));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
assert!(4==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, HF));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
assert!(4==cpu.step(bus)); assert!(0x08 == cpu.reg.a()); assert!(flags(&cpu, HF));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
assert!(4==cpu.step(bus)); assert!(0x10 == cpu.reg.a()); assert!(flags(&cpu, HF));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
assert!(4==cpu.step(bus)); assert!(0x20 == cpu.reg.a()); assert!(flags(&cpu, HF));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
assert!(7==cpu.step(bus)); assert!(0x40 == cpu.reg.a()); assert!(flags(&cpu, HF));
assert!(7==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|PF));
assert!(7==cpu.step(bus)); assert!(0xAA == cpu.reg.a()); assert!(flags(&cpu, SF|HF|PF));
}
#[test]
fn test_and_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0xFE, 0xAA, 0x99 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0x3E, 0xFF, 0xA6, 0xDD, 0xA6, 0x01, 0xFD, 0xA6, 0xFF, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..4 {
cpu.step(bus);
}
assert!(7 ==cpu.step(bus)); assert!(0xFE == cpu.reg.a()); assert!(flags(&cpu, SF|HF));
assert!(19==cpu.step(bus)); assert!(0xAA == cpu.reg.a()); assert!(flags(&cpu, SF|HF|PF));
assert!(19==cpu.step(bus)); assert!(0x88 == cpu.reg.a()); assert!(flags(&cpu, SF|HF|PF));
}
#[test]
fn test_inc_dec_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3e, 0x00, 0x06, 0xFF, 0x0e, 0x0F, 0x16, 0x0E, 0x1E, 0x7F, 0x26, 0x3E, 0x2E, 0x23, 0x3C, 0x3D, 0x04, 0x05, 0x0C, 0x0D, 0x14, 0x15, 0xFE, 0x01, 0x1C, 0x1D, 0x24, 0x25, 0x2C, 0x2D, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..7 {
cpu.step(bus);
}
assert!(4==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.b()); assert!(flags(&cpu, ZF|HF));
assert!(4==cpu.step(bus)); assert!(0xFF == cpu.reg.b()); assert!(flags(&cpu, SF|HF|NF));
assert!(4==cpu.step(bus)); assert!(0x10 == cpu.reg.c()); assert!(flags(&cpu, HF));
assert!(4==cpu.step(bus)); assert!(0x0F == cpu.reg.c()); assert!(flags(&cpu, HF|NF));
assert!(4==cpu.step(bus)); assert!(0x0F == cpu.reg.d()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x0E == cpu.reg.d()); assert!(flags(&cpu, NF));
assert!(7==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x80 == cpu.reg.e()); assert!(flags(&cpu, SF|HF|VF|CF));
assert!(4==cpu.step(bus)); assert!(0x7F == cpu.reg.e()); assert!(flags(&cpu, HF|VF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x3F == cpu.reg.h()); assert!(flags(&cpu, CF));
assert!(4==cpu.step(bus)); assert!(0x3E == cpu.reg.h()); assert!(flags(&cpu, NF|CF));
assert!(4==cpu.step(bus)); assert!(0x24 == cpu.reg.l()); assert!(flags(&cpu, CF));
assert!(4==cpu.step(bus)); assert!(0x23 == cpu.reg.l()); assert!(flags(&cpu, NF|CF));
}
#[test]
fn test_inc_dec_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x00, 0x3F, 0x7F ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0x35, 0x34, 0xDD, 0x34, 0x01, 0xDD, 0x35, 0x01, 0xFD, 0x34, 0xFF, 0xFD, 0x35, 0xFF, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(11==cpu.step(bus)); assert!(0xFF == cpu.mem.r8(0x1000)); assert!(flags(&cpu, SF|HF|NF));
assert!(11==cpu.step(bus)); assert!(0x00 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, ZF|HF));
assert!(23==cpu.step(bus)); assert!(0x40 == cpu.mem.r8(0x1001)); assert!(flags(&cpu, HF));
assert!(23==cpu.step(bus)); assert!(0x3F == cpu.mem.r8(0x1001)); assert!(flags(&cpu, HF|NF));
assert!(23==cpu.step(bus)); assert!(0x80 == cpu.mem.r8(0x1002)); assert!(flags(&cpu, SF|HF|VF));
assert!(23==cpu.step(bus)); assert!(0x7F == cpu.mem.r8(0x1002)); assert!(flags(&cpu, HF|PF|NF));
}
#[test]
fn test_inc_dec_ssixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x01, 0x00, 0x00, 0x11, 0xFF, 0xFF, 0x21, 0xFF, 0x00, 0x31, 0x11, 0x11, 0xDD, 0x21, 0xFF, 0x0F, 0xFD, 0x21, 0x34, 0x12, 0x0B, 0x03, 0x13, 0x1B, 0x23, 0x2B, 0x33, 0x3B, 0xDD, 0x23, 0xDD, 0x2B, 0xFD, 0x23, 0xFD, 0x2B, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..6 {
cpu.step(bus);
}
assert!(6==cpu.step(bus)); assert!(0xFFFF == cpu.reg.bc());
assert!(6==cpu.step(bus)); assert!(0x0000 == cpu.reg.bc());
assert!(6==cpu.step(bus)); assert!(0x0000 == cpu.reg.de());
assert!(6==cpu.step(bus)); assert!(0xFFFF == cpu.reg.de());
assert!(6==cpu.step(bus)); assert!(0x0100 == cpu.reg.hl());
assert!(6==cpu.step(bus)); assert!(0x00FF == cpu.reg.hl());
assert!(6==cpu.step(bus)); assert!(0x1112 == cpu.reg.sp());
assert!(6==cpu.step(bus)); assert!(0x1111 == cpu.reg.sp());
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.ix());
assert!(10==cpu.step(bus)); assert!(0x0FFF == cpu.reg.ix());
assert!(10==cpu.step(bus)); assert!(0x1235 == cpu.reg.iy());
assert!(10==cpu.step(bus)); assert!(0x1234 == cpu.reg.iy());
}
#[test]
fn test_djnz() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x06, 0x03, 0x97, 0x3C, 0x10, 0xFD, 0x00, ];
cpu.mem.write(0x0204, &prog);
cpu.reg.set_pc(0x0204);
assert!(7 == cpu.step(bus)); assert!(0x03 == cpu.reg.b());
assert!(4 == cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(4 == cpu.step(bus)); assert!(0x01 == cpu.reg.a());
assert!(13 == cpu.step(bus)); assert!(0x02 == cpu.reg.b()); assert!(0x0207 == cpu.reg.pc());
assert!(4 == cpu.step(bus)); assert!(0x02 == cpu.reg.a());
assert!(13 == cpu.step(bus)); assert!(0x01 == cpu.reg.b()); assert!(0x0207 == cpu.reg.pc());
assert!(4 == cpu.step(bus)); assert!(0x03 == cpu.reg.a());
assert!(8 == cpu.step(bus)); assert!(0x00 == cpu.reg.b()); assert!(0x020A == cpu.reg.pc());
}
#[test]
fn test_jr_cc() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x97, 0x20, 0x03, 0x28, 0x01, 0x00, 0xC6, 0x01, 0x28, 0x03, 0x20, 0x01, 0x00, 0xD6, 0x03, 0x30, 0x03, 0x38, 0x01, 0x00, 0x00, ];
cpu.mem.write(0x204, &prog);
cpu.reg.set_pc(0x0204);
assert!(4 == cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(7 == cpu.step(bus)); assert!(0x0207 == cpu.reg.pc());
assert!(12 == cpu.step(bus)); assert!(0x020A == cpu.reg.pc());
assert!(7 == cpu.step(bus)); assert!(0x01 == cpu.reg.a());
assert!(7 == cpu.step(bus)); assert!(0x020E == cpu.reg.pc());
assert!(12 == cpu.step(bus)); assert!(0x0211 == cpu.reg.pc());
assert!(7 == cpu.step(bus)); assert!(0xFE == cpu.reg.a());
assert!(7 == cpu.step(bus)); assert!(0x0215 == cpu.reg.pc());
assert!(12 == cpu.step(bus)); assert!(0x0218 == cpu.reg.pc());
}
#[test]
fn test_ihl_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x21, 0x00, 0x10, 0x3E, 0x12, 0x77, 0x06, 0x13, 0x70, 0x0E, 0x14, 0x71, 0x16, 0x15, 0x72, 0x1E, 0x16, 0x73, 0x74, 0x75, ];
cpu.mem.write(0x0000, &prog);
assert!(10 == cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(7 == cpu.step(bus)); assert!(0x12 == cpu.reg.a());
assert!(7 == cpu.step(bus)); assert!(0x12 == cpu.mem.r8(0x1000));
assert!(7 == cpu.step(bus)); assert!(0x13 == cpu.reg.b());
assert!(7 == cpu.step(bus)); assert!(0x13 == cpu.mem.r8(0x1000));
assert!(7 == cpu.step(bus)); assert!(0x14 == cpu.reg.c());
assert!(7 == cpu.step(bus)); assert!(0x14 == cpu.mem.r8(0x1000));
assert!(7 == cpu.step(bus)); assert!(0x15 == cpu.reg.d());
assert!(7 == cpu.step(bus)); assert!(0x15 == cpu.mem.r8(0x1000));
assert!(7 == cpu.step(bus)); assert!(0x16 == cpu.reg.e());
assert!(7 == cpu.step(bus)); assert!(0x16 == cpu.mem.r8(0x1000));
assert!(7 == cpu.step(bus)); assert!(0x10 == cpu.mem.r8(0x1000));
assert!(7 == cpu.step(bus)); assert!(0x00 == cpu.mem.r8(0x1000));
}
#[test]
fn test_inc_dec_ss() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x01, 0x00, 0x00, 0x11, 0xFF, 0xFF, 0x21, 0xFF, 0x00, 0x31, 0x11, 0x11, 0x0B, 0x03, 0x13, 0x1B, 0x23, 0x2B, 0x33, 0x3B, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..4 {
cpu.step(bus);
}
assert!(6 == cpu.step(bus)); assert!(0xFFFF == cpu.reg.bc());
assert!(6 == cpu.step(bus)); assert!(0x0000 == cpu.reg.bc());
assert!(6 == cpu.step(bus)); assert!(0x0000 == cpu.reg.de());
assert!(6 == cpu.step(bus)); assert!(0xFFFF == cpu.reg.de());
assert!(6 == cpu.step(bus)); assert!(0x0100 == cpu.reg.hl());
assert!(6 == cpu.step(bus)); assert!(0x00FF == cpu.reg.hl());
assert!(6 == cpu.step(bus)); assert!(0x1112 == cpu.reg.sp());
assert!(6 == cpu.step(bus)); assert!(0x1111 == cpu.reg.sp());
}
#[test]
fn test_ld_a_ibcdenn() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x11, 0x22, 0x33];
cpu.mem.write(0x1000, &data);
let prog = [
0x01, 0x00, 0x10, 0x11, 0x01, 0x10, 0x0A, 0x1A, 0x3A, 0x02, 0x10, ];
cpu.mem.write(0x0000, &prog);
assert!(10 == cpu.step(bus)); assert!(0x1000 == cpu.reg.bc());
assert!(10 == cpu.step(bus)); assert!(0x1001 == cpu.reg.de());
assert!(7 == cpu.step(bus)); assert!(0x11 == cpu.reg.a());
assert!(7 == cpu.step(bus)); assert!(0x22 == cpu.reg.a());
assert!(13 == cpu.step(bus)); assert!(0x33 == cpu.reg.a());
}
#[test]
fn test_ld_ibcdenn_a() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x01, 0x00, 0x10, 0x11, 0x01, 0x10, 0x3E, 0x77, 0x02, 0x12, 0x32, 0x02, 0x10, ];
cpu.mem.write(0x0000, &prog);
assert!(10 == cpu.step(bus)); assert!(0x1000 == cpu.reg.bc());
assert!(10 == cpu.step(bus)); assert!(0x1001 == cpu.reg.de());
assert!(7 == cpu.step(bus)); assert!(0x77 == cpu.reg.a());
assert!(7 == cpu.step(bus)); assert!(0x77 == cpu.mem.r8(0x1000));
assert!(7 == cpu.step(bus)); assert!(0x77 == cpu.mem.r8(0x1001));
assert!(13 == cpu.step(bus)); assert!(0x77 == cpu.mem.r8(0x1002));
}
#[test]
fn test_rlca_rla_rrca_rra() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0xA0, 0x07, 0x07, 0x0F, 0x0F, 0x17, 0x17, 0x1F, 0x1F, ];
cpu.mem.write(0x0000, &prog);
cpu.reg.set_f(0xFF);
assert!(7==cpu.step(bus)); assert!(0xA0 == cpu.reg.a());
assert!(4==cpu.step(bus)); assert!(0x41 == cpu.reg.a());
assert!(4==cpu.step(bus)); assert!(0x82 == cpu.reg.a());
assert!(4==cpu.step(bus)); assert!(0x41 == cpu.reg.a());
assert!(4==cpu.step(bus)); assert!(0xA0 == cpu.reg.a());
assert!(4==cpu.step(bus)); assert!(0x41 == cpu.reg.a());
assert!(4==cpu.step(bus)); assert!(0x83 == cpu.reg.a());
assert!(4==cpu.step(bus)); assert!(0x41 == cpu.reg.a());
assert!(4==cpu.step(bus)); assert!(0xA0 == cpu.reg.a());
}
#[test]
fn test_daa() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x15, 0x06, 0x27, 0x80, 0x27, 0x90, 0x27, 0x3E, 0x90, 0x06, 0x15, 0x80, 0x27, 0x90, 0x27, ];
cpu.mem.write(0x0000, &prog);
assert!(7==cpu.step(bus)); assert!(0x15 == cpu.reg.a());
assert!(7==cpu.step(bus)); assert!(0x27 == cpu.reg.b());
assert!(4==cpu.step(bus)); assert!(0x3C == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(4==cpu.step(bus)); assert!(0x42 == cpu.reg.a()); assert!(flags(&cpu, HF|PF));
assert!(4==cpu.step(bus)); assert!(0x1B == cpu.reg.a()); assert!(flags(&cpu, HF|NF));
assert!(4==cpu.step(bus)); assert!(0x15 == cpu.reg.a()); assert!(flags(&cpu, NF));
assert!(7==cpu.step(bus)); assert!(0x90 == cpu.reg.a()); assert!(flags(&cpu, NF));
assert!(7==cpu.step(bus)); assert!(0x15 == cpu.reg.b()); assert!(flags(&cpu, NF));
assert!(4==cpu.step(bus)); assert!(0xA5 == cpu.reg.a()); assert!(flags(&cpu, SF));
assert!(4==cpu.step(bus)); assert!(0x05 == cpu.reg.a()); assert!(flags(&cpu, PF|CF));
assert!(4==cpu.step(bus)); assert!(0xF0 == cpu.reg.a()); assert!(flags(&cpu, SF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x90 == cpu.reg.a()); assert!(flags(&cpu, SF|PF|NF|CF));
}
#[test]
fn test_cpl() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x97, 0x2F, 0x2F, 0xC6, 0xAA, 0x2F, 0x2F, ];
cpu.mem.write(0x0000, &prog);
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(4==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, ZF|HF|NF));
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|HF|NF));
assert!(7==cpu.step(bus)); assert!(0xAA == cpu.reg.a()); assert!(flags(&cpu, SF));
assert!(4==cpu.step(bus)); assert!(0x55 == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF));
assert!(4==cpu.step(bus)); assert!(0xAA == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF));
}
#[test]
fn test_ccf_scf() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x97, 0x37, 0x3F, 0xD6, 0xCC, 0x3F, 0x37, ];
cpu.mem.write(0x0000, &prog);
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|CF));
assert!(4==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|HF));
assert!(7==cpu.step(bus)); assert!(0x34 == cpu.reg.a()); assert!(flags(&cpu, HF|NF|CF));
assert!(4==cpu.step(bus)); assert!(0x34 == cpu.reg.a()); assert!(flags(&cpu, HF));
assert!(4==cpu.step(bus)); assert!(0x34 == cpu.reg.a()); assert!(flags(&cpu, CF));
}
#[test]
fn test_call_ret() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0xCD, 0x0A, 0x02, 0xCD, 0x0A, 0x02, 0xC9, ];
cpu.mem.write(0x0204, &prog);
cpu.reg.set_pc(0x0204);
assert!(17 == cpu.step(bus));
assert!(0x020A == cpu.reg.pc());
assert!(0xFFFE == cpu.reg.sp());
assert!(0x0207 == cpu.mem.r16(0xFFFE));
assert!(10 == cpu.step(bus));
assert!(0x0207 == cpu.reg.pc());
assert!(0x0000 == cpu.reg.sp());
assert!(17 == cpu.step(bus));
assert!(0x020A == cpu.reg.pc());
assert!(0xFFFE == cpu.reg.sp());
assert!(0x020A == cpu.mem.r16(0xFFFE));
assert!(10 == cpu.step(bus));
assert!(0x020A == cpu.reg.pc());
assert!(0x0000 == cpu.reg.sp());
}
#[test]
fn test_call_cc_ret_cc() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x97, 0xC4, 0x29, 0x02, 0xCC, 0x29, 0x02, 0xC6, 0x01, 0xCC, 0x2B, 0x02, 0xC4, 0x2B, 0x02, 0x07, 0xEC, 0x2D, 0x02, 0xE4, 0x2D, 0x02, 0xD6, 0x03, 0xF4, 0x2F, 0x02, 0xFC, 0x2F, 0x02, 0xD4, 0x31, 0x02, 0xDC, 0x31, 0x02, 0xC9, 0xC0, 0xC8, 0xC8, 0xC0, 0xE8, 0xE0, 0xF0, 0xF8, 0xD0, 0xD8, ];
cpu.mem.write(0x0204, &prog);
cpu.reg.set_pc(0x0204);
cpu.reg.set_sp(0x0100);
assert!(4 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(10==cpu.step(bus)); assert!(0x0208 == cpu.reg.pc());
assert!(17==cpu.step(bus)); assert!(0x0229 == cpu.reg.pc());
assert!(5 ==cpu.step(bus)); assert!(0x022A == cpu.reg.pc());
assert!(11==cpu.step(bus)); assert!(0x020B == cpu.reg.pc());
assert!(7 ==cpu.step(bus)); assert!(0x01 == cpu.reg.a());
assert!(10==cpu.step(bus)); assert!(0x0210 == cpu.reg.pc());
assert!(17==cpu.step(bus)); assert!(0x022B == cpu.reg.pc());
assert!(5 ==cpu.step(bus)); assert!(0x022C == cpu.reg.pc());
assert!(11==cpu.step(bus)); assert!(0x0213 == cpu.reg.pc());
assert!(4 ==cpu.step(bus)); assert!(0x02 == cpu.reg.a());
assert!(10==cpu.step(bus)); assert!(0x0217 == cpu.reg.pc());
assert!(17==cpu.step(bus)); assert!(0x022D == cpu.reg.pc());
assert!(5 ==cpu.step(bus)); assert!(0x022E == cpu.reg.pc());
assert!(11==cpu.step(bus)); assert!(0x021A == cpu.reg.pc());
assert!(7 ==cpu.step(bus)); assert!(0xFF == cpu.reg.a());
assert!(10==cpu.step(bus)); assert!(0x021F == cpu.reg.pc());
assert!(17==cpu.step(bus)); assert!(0x022F == cpu.reg.pc());
assert!(5 ==cpu.step(bus)); assert!(0x0230 == cpu.reg.pc());
assert!(11==cpu.step(bus)); assert!(0x0222 == cpu.reg.pc());
assert!(10==cpu.step(bus)); assert!(0x0225 == cpu.reg.pc());
assert!(17==cpu.step(bus)); assert!(0x0231 == cpu.reg.pc());
assert!(5 ==cpu.step(bus)); assert!(0x0232 == cpu.reg.pc());
assert!(11==cpu.step(bus)); assert!(0x0228 == cpu.reg.pc());
}
#[test]
fn test_halt() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x76, ];
cpu.mem.write(0x0000, &prog);
assert!(4==cpu.step(bus)); assert!(0x0000 == cpu.reg.pc()); assert!(cpu.halt);
assert!(4==cpu.step(bus)); assert!(0x0000 == cpu.reg.pc()); assert!(cpu.halt);
assert!(4==cpu.step(bus)); assert!(0x0000 == cpu.reg.pc()); assert!(cpu.halt);
}
#[test]
fn test_ex() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x21, 0x34, 0x12, 0x11, 0x78, 0x56, 0xEB, 0x3E, 0x11, 0x08, 0x3E, 0x22, 0x08, 0x01, 0xBC, 0x9A, 0xD9, 0x21, 0x11, 0x11, 0x11, 0x22, 0x22, 0x01, 0x33, 0x33, 0xD9, 0x31, 0x00, 0x01, 0xD5, 0xE3, 0xDD, 0x21, 0x99, 0x88, 0xDD, 0xE3, 0xFD, 0x21, 0x77, 0x66, 0xFD, 0xE3, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1234 == cpu.reg.hl());
assert!(10==cpu.step(bus)); assert!(0x5678 == cpu.reg.de());
assert!(4 ==cpu.step(bus)); assert!(0x1234 == cpu.reg.de()); assert!(0x5678 == cpu.reg.hl());
assert!(7 ==cpu.step(bus)); assert!(0x1100 == cpu.reg.af()); assert!(0x0000 == cpu.reg.af_());
assert!(4 ==cpu.step(bus)); assert!(0x0000 == cpu.reg.af()); assert!(0x1100 == cpu.reg.af_());
assert!(7 ==cpu.step(bus)); assert!(0x2200 == cpu.reg.af()); assert!(0x1100 == cpu.reg.af_());
assert!(4 ==cpu.step(bus)); assert!(0x1100 == cpu.reg.af()); assert!(0x2200 == cpu.reg.af_());
assert!(10==cpu.step(bus)); assert!(0x9ABC == cpu.reg.bc());
assert!(4 ==cpu.step(bus));
assert!(0x0000 == cpu.reg.hl()); assert!(0x5678 == cpu.reg.hl_());
assert!(0x0000 == cpu.reg.de()); assert!(0x1234 == cpu.reg.de_());
assert!(0x0000 == cpu.reg.bc()); assert!(0x9ABC == cpu.reg.bc_());
assert!(10==cpu.step(bus)); assert!(0x1111 == cpu.reg.hl());
assert!(10==cpu.step(bus)); assert!(0x2222 == cpu.reg.de());
assert!(10==cpu.step(bus)); assert!(0x3333 == cpu.reg.bc());
assert!(4 ==cpu.step(bus));
assert!(0x5678 == cpu.reg.hl()); assert!(0x1111 == cpu.reg.hl_());
assert!(0x1234 == cpu.reg.de()); assert!(0x2222 == cpu.reg.de_());
assert!(0x9ABC == cpu.reg.bc()); assert!(0x3333 == cpu.reg.bc_());
assert!(10==cpu.step(bus)); assert!(0x0100 == cpu.reg.sp());
assert!(11==cpu.step(bus)); assert!(0x1234 == cpu.mem.r16(0x00FE));
assert!(19==cpu.step(bus)); assert!(0x1234 == cpu.reg.hl()); assert!(0x5678 == cpu.mem.r16(0x00FE));
assert!(14==cpu.step(bus)); assert!(0x8899 == cpu.reg.ix());
assert!(23==cpu.step(bus)); assert!(0x5678 == cpu.reg.ix()); assert!(0x8899 == cpu.mem.r16(0x00FE));
assert!(14==cpu.step(bus)); assert!(0x6677 == cpu.reg.iy());
assert!(23==cpu.step(bus)); assert!(0x8899 == cpu.reg.iy()); assert!(0x6677 == cpu.mem.r16(0x00FE));
}
#[test]
fn test_jp_cc_nn() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x97, 0xC2, 0x0C, 0x02, 0xCA, 0x0C, 0x02, 0x00, 0xC6, 0x01, 0xCA, 0x15, 0x02, 0xC2, 0x15, 0x02, 0x00, 0x07, 0xEA, 0x1D, 0x02, 0xE2, 0x1D, 0x02, 0x00, 0xC6, 0xFD, 0xF2, 0x26, 0x02, 0xFA, 0x26, 0x02, 0x00, 0xD2, 0x2D, 0x02, 0xDA, 0x2D, 0x02, 0x00, 0x00, ];
cpu.mem.write(0x0204, &prog);
cpu.reg.set_pc(0x0204);
assert!(4 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(10==cpu.step(bus)); assert!(0x0208 == cpu.reg.pc());
assert!(10==cpu.step(bus)); assert!(0x020C == cpu.reg.pc());
assert!(7 ==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(10==cpu.step(bus)); assert!(0x0211 == cpu.reg.pc());
assert!(10==cpu.step(bus)); assert!(0x0215 == cpu.reg.pc());
assert!(4 ==cpu.step(bus)); assert!(0x02 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(10==cpu.step(bus)); assert!(0x0219 == cpu.reg.pc());
assert!(10==cpu.step(bus)); assert!(0x021D == cpu.reg.pc());
assert!(7 ==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF));
assert!(10==cpu.step(bus)); assert!(0x0222 == cpu.reg.pc());
assert!(10==cpu.step(bus)); assert!(0x0226 == cpu.reg.pc());
assert!(10==cpu.step(bus)); assert!(0x022D == cpu.reg.pc());
}
#[test]
fn test_jp_jr() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x21, 0x16, 0x02, 0xDD, 0x21, 0x19, 0x02, 0xFD, 0x21, 0x21, 0x02, 0xC3, 0x14, 0x02, 0x18, 0x04, 0x18, 0xFC, 0xDD, 0xE9, 0xE9, 0xFD, 0xE9, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x18, 0xF8, 0x00 ];
cpu.mem.write(0x0204, &prog);
cpu.reg.set_pc(0x0204);
assert!(10==cpu.step(bus)); assert!(0x0216 == cpu.reg.hl());
assert!(14==cpu.step(bus)); assert!(0x0219 == cpu.reg.ix());
assert!(14==cpu.step(bus)); assert!(0x0221 == cpu.reg.iy());
assert!(10==cpu.step(bus)); assert!(0x0214 == cpu.reg.pc());
assert!(12==cpu.step(bus)); assert!(0x0212 == cpu.reg.pc());
assert!(12==cpu.step(bus)); assert!(0x0218 == cpu.reg.pc());
assert!(4 ==cpu.step(bus)); assert!(0x0216 == cpu.reg.pc());
assert!(8 ==cpu.step(bus)); assert!(0x0219 == cpu.reg.pc());
assert!(8 ==cpu.step(bus)); assert!(0x0221 == cpu.reg.pc());
assert!(12==cpu.step(bus)); assert!(0x021B == cpu.reg.pc());
assert!(12==cpu.step(bus)); assert!(0x0223 == cpu.reg.pc());
}
#[test]
fn test_ldi() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x02, 0x03 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0x11, 0x00, 0x20, 0x01, 0x03, 0x00, 0xED, 0xA0, 0xED, 0xA0, 0xED, 0xA0, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(16==cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x2001 == cpu.reg.de());
assert!(0x0002 == cpu.reg.bc());
assert!(0x01 == cpu.mem.r8(0x2000));
assert!(flags(&cpu, PF));
assert!(16==cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x2002 == cpu.reg.de());
assert!(0x0001 == cpu.reg.bc());
assert!(0x02 == cpu.mem.r8(0x2001));
assert!(flags(&cpu, PF));
assert!(16==cpu.step(bus));
assert!(0x1003 == cpu.reg.hl());
assert!(0x2003 == cpu.reg.de());
assert!(0x0000 == cpu.reg.bc());
assert!(0x03 == cpu.mem.r8(0x2002));
assert!(flags(&cpu, 0));
}
#[test]
fn test_ldir() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x02, 0x03 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0x11, 0x00, 0x20, 0x01, 0x03, 0x00, 0xED, 0xB0, 0x3E, 0x33, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(21==cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x2001 == cpu.reg.de());
assert!(0x0002 == cpu.reg.bc());
assert!(0x01 == cpu.mem.r8(0x2000));
assert!(flags(&cpu, PF));
assert!(21==cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x2002 == cpu.reg.de());
assert!(0x0001 == cpu.reg.bc());
assert!(0x02 == cpu.mem.r8(0x2001));
assert!(flags(&cpu, PF));
assert!(16==cpu.step(bus));
assert!(0x1003 == cpu.reg.hl());
assert!(0x2003 == cpu.reg.de());
assert!(0x0000 == cpu.reg.bc());
assert!(0x03 == cpu.mem.r8(0x2002));
assert!(flags(&cpu, 0));
cpu.step(bus); assert!(0x33 == cpu.reg.a());
}
#[test]
fn test_ldd() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x02, 0x03 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x02, 0x10, 0x11, 0x02, 0x20, 0x01, 0x03, 0x00, 0xED, 0xA8, 0xED, 0xA8, 0xED, 0xA8, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(16==cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x2001 == cpu.reg.de());
assert!(0x0002 == cpu.reg.bc());
assert!(0x03 == cpu.mem.r8(0x2002));
assert!(flags(&cpu, PF));
assert!(16==cpu.step(bus));
assert!(0x1000 == cpu.reg.hl());
assert!(0x2000 == cpu.reg.de());
assert!(0x0001 == cpu.reg.bc());
assert!(0x02 == cpu.mem.r8(0x2001));
assert!(flags(&cpu, PF));
assert!(16==cpu.step(bus));
assert!(0x0FFF == cpu.reg.hl());
assert!(0x1FFF == cpu.reg.de());
assert!(0x0000 == cpu.reg.bc());
assert!(0x01 == cpu.mem.r8(0x2000));
assert!(flags(&cpu, 0));
}
#[test]
fn test_lddr() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x02, 0x03 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x02, 0x10, 0x11, 0x02, 0x20, 0x01, 0x03, 0x00, 0xED, 0xB8, 0x3E, 0x33, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(21==cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x2001 == cpu.reg.de());
assert!(0x0002 == cpu.reg.bc());
assert!(0x03 == cpu.mem.r8(0x2002));
assert!(flags(&cpu, PF));
assert!(21==cpu.step(bus));
assert!(0x1000 == cpu.reg.hl());
assert!(0x2000 == cpu.reg.de());
assert!(0x0001 == cpu.reg.bc());
assert!(0x02 == cpu.mem.r8(0x2001));
assert!(flags(&cpu, PF));
assert!(16==cpu.step(bus));
assert!(0x0FFF == cpu.reg.hl());
assert!(0x1FFF == cpu.reg.de());
assert!(0x0000 == cpu.reg.bc());
assert!(0x01 == cpu.mem.r8(0x2000));
assert!(flags(&cpu, 0));
cpu.step(bus); assert!(0x33 == cpu.reg.a());
}
#[test]
fn test_cpi() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x02, 0x03, 0x04 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0x01, 0x04, 0x00, 0x3e, 0x03, 0xed, 0xa1, 0xed, 0xa1, 0xed, 0xa1, 0xed, 0xa1, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(16 == cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x0003 == cpu.reg.bc());
assert!(flags(&cpu, PF|NF));
let f = cpu.reg.f() | CF;
cpu.reg.set_f(f);
assert!(16 == cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x0002 == cpu.reg.bc());
assert!(flags(&cpu, PF|NF|CF));
assert!(16 == cpu.step(bus));
assert!(0x1003 == cpu.reg.hl());
assert!(0x0001 == cpu.reg.bc());
assert!(flags(&cpu, ZF|PF|NF|CF));
assert!(16 == cpu.step(bus));
assert!(0x1004 == cpu.reg.hl());
assert!(0x0000 == cpu.reg.bc());
assert!(flags(&cpu, SF|HF|NF|CF));
}
#[test]
fn test_cpir() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x02, 0x03, 0x04 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0x01, 0x04, 0x00, 0x3e, 0x03, 0xed, 0xb1, 0xed, 0xb1, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(21 == cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x0003 == cpu.reg.bc());
assert!(flags(&cpu, PF|NF));
let f = cpu.reg.f() | CF;
cpu.reg.set_f(f);
assert!(21 == cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x0002 == cpu.reg.bc());
assert!(flags(&cpu, PF|NF|CF));
assert!(16 == cpu.step(bus));
assert!(0x1003 == cpu.reg.hl());
assert!(0x0001 == cpu.reg.bc());
assert!(flags(&cpu, ZF|PF|NF|CF));
assert!(16 == cpu.step(bus));
assert!(0x1004 == cpu.reg.hl());
assert!(0x0000 == cpu.reg.bc());
assert!(flags(&cpu, SF|HF|NF|CF));
}
#[test]
fn test_cpd() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x02, 0x03, 0x04 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x03, 0x10, 0x01, 0x04, 0x00, 0x3e, 0x02, 0xed, 0xa9, 0xed, 0xa9, 0xed, 0xa9, 0xed, 0xa9, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(16 == cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x0003 == cpu.reg.bc());
assert!(flags(&cpu, SF|HF|PF|NF));
let f = cpu.reg.f() | CF;
cpu.reg.set_f(f);
assert!(16 == cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x0002 == cpu.reg.bc());
assert!(flags(&cpu, SF|HF|PF|NF|CF));
assert!(16 == cpu.step(bus));
assert!(0x1000 == cpu.reg.hl());
assert!(0x0001 == cpu.reg.bc());
assert!(flags(&cpu, ZF|PF|NF|CF));
assert!(16 == cpu.step(bus));
assert!(0x0FFF == cpu.reg.hl());
assert!(0x0000 == cpu.reg.bc());
assert!(flags(&cpu, NF|CF));
}
#[test]
fn test_cpdr() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x02, 0x03, 0x04 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x03, 0x10, 0x01, 0x04, 0x00, 0x3e, 0x02, 0xed, 0xb9, 0xed, 0xb9, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(21 == cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x0003 == cpu.reg.bc());
assert!(flags(&cpu, SF|HF|PF|NF));
let f = cpu.reg.f() | CF;
cpu.reg.set_f(f);
assert!(21 == cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x0002 == cpu.reg.bc());
assert!(flags(&cpu, SF|HF|PF|NF|CF));
assert!(16 == cpu.step(bus));
assert!(0x1000 == cpu.reg.hl());
assert!(0x0001 == cpu.reg.bc());
assert!(flags(&cpu, ZF|PF|NF|CF));
assert!(16 == cpu.step(bus));
assert!(0x0FFF == cpu.reg.hl());
assert!(0x0000 == cpu.reg.bc());
assert!(flags(&cpu, NF|CF));
}
#[test]
fn test_add_adc_sbc_16() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x21, 0xFC, 0x00, 0x01, 0x08, 0x00, 0x11, 0xFF, 0xFF, 0x09, 0x19, 0xED, 0x4A, 0x29, 0x19, 0xED, 0x42, 0xDD, 0x21, 0xFC, 0x00, 0x31, 0x00, 0x10, 0xDD, 0x09, 0xDD, 0x19, 0xDD, 0x29, 0xDD, 0x39, 0xFD, 0x21, 0xFF, 0xFF, 0xFD, 0x09, 0xFD, 0x19, 0xFD, 0x29, 0xFD, 0x39, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x00FC == cpu.reg.hl());
assert!(10==cpu.step(bus)); assert!(0x0008 == cpu.reg.bc());
assert!(10==cpu.step(bus)); assert!(0xFFFF == cpu.reg.de());
assert!(11==cpu.step(bus)); assert!(0x0104 == cpu.reg.hl()); assert!(flags(&cpu, 0));
assert!(11==cpu.step(bus)); assert!(0x0103 == cpu.reg.hl()); assert!(flags(&cpu, HF|CF));
assert!(15==cpu.step(bus)); assert!(0x010C == cpu.reg.hl()); assert!(flags(&cpu, 0));
assert!(11==cpu.step(bus)); assert!(0x0218 == cpu.reg.hl()); assert!(flags(&cpu, 0));
assert!(11==cpu.step(bus)); assert!(0x0217 == cpu.reg.hl()); assert!(flags(&cpu, HF|CF));
assert!(15==cpu.step(bus)); assert!(0x020E == cpu.reg.hl()); assert!(flags(&cpu, NF));
assert!(14==cpu.step(bus)); assert!(0x00FC == cpu.reg.ix());
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.sp());
assert!(15==cpu.step(bus)); assert!(0x0104 == cpu.reg.ix()); assert!(flags(&cpu, 0));
assert!(15==cpu.step(bus)); assert!(0x0103 == cpu.reg.ix()); assert!(flags(&cpu, HF|CF));
assert!(15==cpu.step(bus)); assert!(0x0206 == cpu.reg.ix()); assert!(flags(&cpu, 0));
assert!(15==cpu.step(bus)); assert!(0x1206 == cpu.reg.ix()); assert!(flags(&cpu, 0));
assert!(14==cpu.step(bus)); assert!(0xFFFF == cpu.reg.iy());
assert!(15==cpu.step(bus)); assert!(0x0007 == cpu.reg.iy()); assert!(flags(&cpu, HF|CF));
assert!(15==cpu.step(bus)); assert!(0x0006 == cpu.reg.iy()); assert!(flags(&cpu, HF|CF));
assert!(15==cpu.step(bus)); assert!(0x000C == cpu.reg.iy()); assert!(flags(&cpu, 0));
assert!(15==cpu.step(bus)); assert!(0x100C == cpu.reg.iy()); assert!(flags(&cpu, 0));
}
#[test]
fn ld_hlddixiy_inn() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08
];
cpu.mem.write(0x1000, &data);
let prog = [
0x2A, 0x00, 0x10, 0xED, 0x4B, 0x01, 0x10, 0xED, 0x5B, 0x02, 0x10, 0xED, 0x6B, 0x03, 0x10, 0xED, 0x7B, 0x04, 0x10, 0xDD, 0x2A, 0x05, 0x10, 0xFD, 0x2A, 0x06, 0x10, ];
cpu.mem.write(0x0000, &prog);
assert!(16==cpu.step(bus)); assert!(0x0201 == cpu.reg.hl());
assert!(20==cpu.step(bus)); assert!(0x0302 == cpu.reg.bc());
assert!(20==cpu.step(bus)); assert!(0x0403 == cpu.reg.de());
assert!(20==cpu.step(bus)); assert!(0x0504 == cpu.reg.hl());
assert!(20==cpu.step(bus)); assert!(0x0605 == cpu.reg.sp());
assert!(20==cpu.step(bus)); assert!(0x0706 == cpu.reg.ix());
assert!(20==cpu.step(bus)); assert!(0x0807 == cpu.reg.iy());
}
#[test]
fn ld_inn_hlddixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x21, 0x01, 0x02, 0x22, 0x00, 0x10, 0x01, 0x34, 0x12, 0xED, 0x43, 0x02, 0x10, 0x11, 0x78, 0x56, 0xED, 0x53, 0x04, 0x10, 0x21, 0xBC, 0x9A, 0xED, 0x63, 0x06, 0x10, 0x31, 0x68, 0x13, 0xED, 0x73, 0x08, 0x10, 0xDD, 0x21, 0x21, 0x43, 0xDD, 0x22, 0x0A, 0x10, 0xFD, 0x21, 0x65, 0x87, 0xFD, 0x22, 0x0C, 0x10, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x0201 == cpu.reg.hl());
assert!(16==cpu.step(bus)); assert!(0x0201 == cpu.mem.r16(0x1000));
assert!(10==cpu.step(bus)); assert!(0x1234 == cpu.reg.bc());
assert!(20==cpu.step(bus)); assert!(0x1234 == cpu.mem.r16(0x1002));
assert!(10==cpu.step(bus)); assert!(0x5678 == cpu.reg.de());
assert!(20==cpu.step(bus)); assert!(0x5678 == cpu.mem.r16(0x1004));
assert!(10==cpu.step(bus)); assert!(0x9ABC == cpu.reg.hl());
assert!(20==cpu.step(bus)); assert!(0x9ABC == cpu.mem.r16(0x1006));
assert!(10==cpu.step(bus)); assert!(0x1368 == cpu.reg.sp());
assert!(20==cpu.step(bus)); assert!(0x1368 == cpu.mem.r16(0x1008));
assert!(14==cpu.step(bus)); assert!(0x4321 == cpu.reg.ix());
assert!(20==cpu.step(bus)); assert!(0x4321 == cpu.mem.r16(0x100A));
assert!(14==cpu.step(bus)); assert!(0x8765 == cpu.reg.iy());
assert!(20==cpu.step(bus)); assert!(0x8765 == cpu.mem.r16(0x100C));
}
#[test]
fn test_neg() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x01, 0xED, 0x44, 0xC6, 0x01, 0xED, 0x44, 0xD6, 0x80, 0xED, 0x44, 0xC6, 0x40, 0xED, 0x44, ];
cpu.mem.write(0x0000, &prog);
assert!(7==cpu.step(bus)); assert!(0x01 == cpu.reg.a());
assert!(8==cpu.step(bus)); assert!(0xFF == cpu.reg.a()); assert!(flags(&cpu, SF|HF|NF|CF));
assert!(7==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|HF|CF));
assert!(8==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(7==cpu.step(bus)); assert!(0x80 == cpu.reg.a()); assert!(flags(&cpu, SF|PF|NF|CF));
assert!(8==cpu.step(bus)); assert!(0x80 == cpu.reg.a()); assert!(flags(&cpu, SF|PF|NF|CF));
assert!(7==cpu.step(bus)); assert!(0xC0 == cpu.reg.a()); assert!(flags(&cpu, SF));
assert!(8==cpu.step(bus)); assert!(0x40 == cpu.reg.a()); assert!(flags(&cpu, NF|CF));
}
#[test]
fn test_ld_a_ir() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
cpu.iff1 = true;
cpu.iff2 = true;
cpu.reg.r = 0x34;
cpu.reg.i = 0x1;
cpu.reg.set_f(CF);
let prog = [
0xED, 0x57, 0x97, 0xED, 0x5F, ];
cpu.mem.write(0x0000, &prog);
assert!(9 == cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, PF|CF));
assert!(4 == cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|NF));
assert!(9 == cpu.step(bus)); assert!(0x39 == cpu.reg.a()); assert!(flags(&cpu, PF));
}
#[test]
fn test_ld_ir_a() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x45, 0xED, 0x47, 0xED, 0x4F, ];
cpu.mem.write(0x0000, &prog);
assert!(7==cpu.step(bus)); assert!(0x45 == cpu.reg.a());
assert!(9==cpu.step(bus)); assert!(0x45 == cpu.reg.i);
assert!(9==cpu.step(bus)); assert!(0x45 == cpu.reg.r);
}
#[test]
fn test_rlc_rl_rrc_rr_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x01, 0x06, 0xFF, 0x0E, 0x03, 0x16, 0xFE, 0x1E, 0x11, 0x26, 0x3F, 0x2E, 0x70,
0xCB, 0x0F, 0xCB, 0x07, 0xCB, 0x08, 0xCB, 0x00, 0xCB, 0x01, 0xCB, 0x09, 0xCB, 0x02, 0xCB, 0x0A, 0xCB, 0x0B, 0xCB, 0x03, 0xCB, 0x04, 0xCB, 0x0C, 0xCB, 0x05, 0xCB, 0x0D,
0xCB, 0x1F, 0xCB, 0x17, 0xCB, 0x18, 0xCB, 0x10, 0xCB, 0x11, 0xCB, 0x19, 0xCB, 0x12, 0xCB, 0x1A, 0xCB, 0x1B, 0xCB, 0x13, 0xCB, 0x14, 0xCB, 0x1C, 0xCB, 0x15, 0xCB, 0x1D, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..7 {
cpu.step(bus);
}
assert!(8==cpu.step(bus)); assert!(0x80 == cpu.reg.a()); assert!(flags(&cpu, SF|CF));
assert!(8==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, CF));
assert!(8==cpu.step(bus)); assert!(0xFF == cpu.reg.b()); assert!(flags(&cpu, SF|PF|CF));
assert!(8==cpu.step(bus)); assert!(0xFF == cpu.reg.b()); assert!(flags(&cpu, SF|PF|CF));
assert!(8==cpu.step(bus)); assert!(0x06 == cpu.reg.c()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0x03 == cpu.reg.c()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0xFD == cpu.reg.d()); assert!(flags(&cpu, SF|CF));
assert!(8==cpu.step(bus)); assert!(0xFE == cpu.reg.d()); assert!(flags(&cpu, SF|CF));
assert!(8==cpu.step(bus)); assert!(0x88 == cpu.reg.e()); assert!(flags(&cpu, SF|PF|CF));
assert!(8==cpu.step(bus)); assert!(0x11 == cpu.reg.e()); assert!(flags(&cpu, PF|CF));
assert!(8==cpu.step(bus)); assert!(0x7E == cpu.reg.h()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0x3F == cpu.reg.h()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0xE0 == cpu.reg.l()); assert!(flags(&cpu, SF));
assert!(8==cpu.step(bus)); assert!(0x70 == cpu.reg.l()); assert!(flags(&cpu, 0));
assert!(8==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|PF|CF));
assert!(8==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(8==cpu.step(bus)); assert!(0x7F == cpu.reg.b()); assert!(flags(&cpu, CF));
assert!(8==cpu.step(bus)); assert!(0xFF == cpu.reg.b()); assert!(flags(&cpu, SF|PF));
assert!(8==cpu.step(bus)); assert!(0x06 == cpu.reg.c()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0x03 == cpu.reg.c()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0xFC == cpu.reg.d()); assert!(flags(&cpu, SF|PF|CF));
assert!(8==cpu.step(bus)); assert!(0xFE == cpu.reg.d()); assert!(flags(&cpu, SF));
assert!(8==cpu.step(bus)); assert!(0x08 == cpu.reg.e()); assert!(flags(&cpu, CF));
assert!(8==cpu.step(bus)); assert!(0x11 == cpu.reg.e()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0x7E == cpu.reg.h()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0x3F == cpu.reg.h()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0xE0 == cpu.reg.l()); assert!(flags(&cpu, SF));
assert!(8==cpu.step(bus)); assert!(0x70 == cpu.reg.l()); assert!(flags(&cpu, 0));
}
#[test]
fn test_rrc_rlc_rr_rl_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0xFF, 0x11 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0xCB, 0x0E, 0x7E, 0xCB, 0x06, 0x7E, 0xDD, 0xCB, 0x01, 0x0E, 0xDD, 0x7E, 0x01, 0xDD, 0xCB, 0x01, 0x06, 0xDD, 0x7E, 0x01, 0xFD, 0xCB, 0xFF, 0x0E, 0xFD, 0x7E, 0xFF, 0xFD, 0xCB, 0xFF, 0x06, 0xFD, 0x7E, 0xFF, 0xCB, 0x1E, 0x7E, 0xCB, 0x16, 0x7E, 0xDD, 0xCB, 0x01, 0x1E, 0xDD, 0x7E, 0x01, 0xDD, 0xCB, 0x01, 0x16, 0xDD, 0x7E, 0x01, 0xFD, 0xCB, 0xFF, 0x16, 0xFD, 0x7E, 0xFF, 0xFD, 0xCB, 0xFF, 0x1E, 0xFD, 0x7E, 0xFF, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(15==cpu.step(bus)); assert!(0x80 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, SF|CF));
assert!(7 ==cpu.step(bus)); assert!(0x80 == cpu.reg.a());
assert!(15==cpu.step(bus)); assert!(0x01 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, CF));
assert!(7 ==cpu.step(bus)); assert!(0x01 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0xFF == cpu.mem.r8(0x1001)); assert!(flags(&cpu, SF|PF|CF));
assert!(19==cpu.step(bus)); assert!(0xFF == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0xFF == cpu.mem.r8(0x1001)); assert!(flags(&cpu, SF|PF|CF));
assert!(19==cpu.step(bus)); assert!(0xFF == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0x88 == cpu.mem.r8(0x1002)); assert!(flags(&cpu, SF|PF|CF));
assert!(19==cpu.step(bus)); assert!(0x88 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0x11 == cpu.mem.r8(0x1002)); assert!(flags(&cpu, PF|CF));
assert!(19==cpu.step(bus)); assert!(0x11 == cpu.reg.a());
assert!(15==cpu.step(bus)); assert!(0x80 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, SF|CF));
assert!(7 ==cpu.step(bus)); assert!(0x80 == cpu.reg.a());
assert!(15==cpu.step(bus)); assert!(0x01 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, CF));
assert!(7 ==cpu.step(bus)); assert!(0x01 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0xFF == cpu.mem.r8(0x1001)); assert!(flags(&cpu, SF|PF|CF));
assert!(19==cpu.step(bus)); assert!(0xFF == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0xFF == cpu.mem.r8(0x1001)); assert!(flags(&cpu, SF|PF|CF));
assert!(19==cpu.step(bus)); assert!(0xFF == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0x23 == cpu.mem.r8(0x1002)); assert!(flags(&cpu, 0));
assert!(19==cpu.step(bus)); assert!(0x23 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0x11 == cpu.mem.r8(0x1002)); assert!(flags(&cpu, PF|CF));
assert!(19==cpu.step(bus)); assert!(0x11 == cpu.reg.a());
}
#[test]
fn test_sla_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x01, 0x06, 0x80, 0x0E, 0xAA, 0x16, 0xFE, 0x1E, 0x7F, 0x26, 0x11, 0x2E, 0x00, 0xCB, 0x27, 0xCB, 0x20, 0xCB, 0x21, 0xCB, 0x22, 0xCB, 0x23, 0xCB, 0x24, 0xCB, 0x25, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..7 {
cpu.step(bus);
}
assert!(8==cpu.step(bus)); assert!(0x02 == cpu.reg.a()); assert!(flags(&cpu, 0));
assert!(8==cpu.step(bus)); assert!(0x00 == cpu.reg.b()); assert!(flags(&cpu, ZF|PF|CF));
assert!(8==cpu.step(bus)); assert!(0x54 == cpu.reg.c()); assert!(flags(&cpu, CF));
assert!(8==cpu.step(bus)); assert!(0xFC == cpu.reg.d()); assert!(flags(&cpu, SF|PF|CF));
assert!(8==cpu.step(bus)); assert!(0xFE == cpu.reg.e()); assert!(flags(&cpu, SF));
assert!(8==cpu.step(bus)); assert!(0x22 == cpu.reg.h()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0x00 == cpu.reg.l()); assert!(flags(&cpu, ZF|PF));
}
#[test]
fn test_sra_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x01, 0x06, 0x80, 0x0E, 0xAA, 0x16, 0xFE, 0x1E, 0x7F, 0x26, 0x11, 0x2E, 0x00, 0xCB, 0x2F, 0xCB, 0x28, 0xCB, 0x29, 0xCB, 0x2A, 0xCB, 0x2B, 0xCB, 0x2C, 0xCB, 0x2D, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..7 {
cpu.step(bus);
}
assert!(8==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|PF|CF));
assert!(8==cpu.step(bus)); assert!(0xC0 == cpu.reg.b()); assert!(flags(&cpu, SF|PF));
assert!(8==cpu.step(bus)); assert!(0xD5 == cpu.reg.c()); assert!(flags(&cpu, SF));
assert!(8==cpu.step(bus)); assert!(0xFF == cpu.reg.d()); assert!(flags(&cpu, SF|PF));
assert!(8==cpu.step(bus)); assert!(0x3F == cpu.reg.e()); assert!(flags(&cpu, PF|CF));
assert!(8==cpu.step(bus)); assert!(0x08 == cpu.reg.h()); assert!(flags(&cpu, CF));
assert!(8==cpu.step(bus)); assert!(0x00 == cpu.reg.l()); assert!(flags(&cpu, ZF|PF));
}
#[test]
fn test_srl_r() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x01, 0x06, 0x80, 0x0E, 0xAA, 0x16, 0xFE, 0x1E, 0x7F, 0x26, 0x11, 0x2E, 0x00, 0xCB, 0x3F, 0xCB, 0x38, 0xCB, 0x39, 0xCB, 0x3A, 0xCB, 0x3B, 0xCB, 0x3C, 0xCB, 0x3D, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..7 {
cpu.step(bus);
}
assert!(8==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(flags(&cpu, ZF|PF|CF));
assert!(8==cpu.step(bus)); assert!(0x40 == cpu.reg.b()); assert!(flags(&cpu, 0));
assert!(8==cpu.step(bus)); assert!(0x55 == cpu.reg.c()); assert!(flags(&cpu, PF));
assert!(8==cpu.step(bus)); assert!(0x7F == cpu.reg.d()); assert!(flags(&cpu, 0));
assert!(8==cpu.step(bus)); assert!(0x3F == cpu.reg.e()); assert!(flags(&cpu, PF|CF));
assert!(8==cpu.step(bus)); assert!(0x08 == cpu.reg.h()); assert!(flags(&cpu, CF));
assert!(8==cpu.step(bus)); assert!(0x00 == cpu.reg.l()); assert!(flags(&cpu, ZF|PF));
}
#[test]
fn test_sla_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x80, 0xAA ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0xCB, 0x26, 0x7E, 0xDD, 0xCB, 0x01, 0x26, 0xDD, 0x7E, 0x01, 0xFD, 0xCB, 0xFF, 0x26, 0xFD, 0x7E, 0xFF, ];
cpu.mem.write(0x0000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(15==cpu.step(bus)); assert!(0x02 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, 0));
assert!(7 ==cpu.step(bus)); assert!(0x02 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0x00 == cpu.mem.r8(0x1001)); assert!(flags(&cpu, ZF|PF|CF));
assert!(19==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0x54 == cpu.mem.r8(0x1002)); assert!(flags(&cpu, CF));
assert!(19==cpu.step(bus)); assert!(0x54 == cpu.reg.a());
}
#[test]
fn test_sra_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x80, 0xAA ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0xCB, 0x2E, 0x7E, 0xDD, 0xCB, 0x01, 0x2E, 0xDD, 0x7E, 0x01, 0xFD, 0xCB, 0xFF, 0x2E, 0xFD, 0x7E, 0xFF, ];
cpu.mem.write(0x000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(15==cpu.step(bus)); assert!(0x00 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, ZF|PF|CF));
assert!(7 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0xC0 == cpu.mem.r8(0x1001)); assert!(flags(&cpu, SF|PF));
assert!(19==cpu.step(bus)); assert!(0xC0 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0xD5 == cpu.mem.r8(0x1002)); assert!(flags(&cpu, SF));
assert!(19==cpu.step(bus)); assert!(0xD5 == cpu.reg.a());
}
#[test]
fn test_srl_ihlixiy() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x80, 0xAA ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0xDD, 0x21, 0x00, 0x10, 0xFD, 0x21, 0x03, 0x10, 0xCB, 0x3E, 0x7E, 0xDD, 0xCB, 0x01, 0x3E, 0xDD, 0x7E, 0x01, 0xFD, 0xCB, 0xFF, 0x3E, 0xFD, 0x7E, 0xFF, ];
cpu.mem.write(0x000, &prog);
for _ in 0..3 {
cpu.step(bus);
}
assert!(15==cpu.step(bus)); assert!(0x00 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, ZF|PF|CF));
assert!(7 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0x40 == cpu.mem.r8(0x1001)); assert!(flags(&cpu, 0));
assert!(19==cpu.step(bus)); assert!(0x40 == cpu.reg.a());
assert!(23==cpu.step(bus)); assert!(0x55 == cpu.mem.r8(0x1002)); assert!(flags(&cpu, PF));
assert!(19==cpu.step(bus)); assert!(0x55 == cpu.reg.a());
}
#[test]
fn test_rld_rrd() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x12, 0x21, 0x00, 0x10, 0x36, 0x34, 0xED, 0x67, 0xED, 0x6F, 0x7E, 0x3E, 0xFE, 0x36, 0x00, 0xED, 0x6F, 0xED, 0x67, 0x7E, 0x3E, 0x01, 0x36, 0x00, 0xED, 0x6F, 0xED, 0x67, 0x7E
];
cpu.mem.write(0x0000, &prog);
assert!(7 ==cpu.step(bus)); assert!(0x12 == cpu.reg.a());
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(10==cpu.step(bus)); assert!(0x34 == cpu.mem.r8(0x1000));
assert!(18==cpu.step(bus)); assert!(0x14 == cpu.reg.a()); assert!(0x23 == cpu.mem.r8(0x1000));
assert!(18==cpu.step(bus)); assert!(0x12 == cpu.reg.a()); assert!(0x34 == cpu.mem.r8(0x1000));
assert!(7 ==cpu.step(bus)); assert!(0x34 == cpu.reg.a());
assert!(7 ==cpu.step(bus)); assert!(0xFE == cpu.reg.a());
assert!(10==cpu.step(bus)); assert!(0x00 == cpu.mem.r8(0x1000));
assert!(18==cpu.step(bus)); assert!(0xF0 == cpu.reg.a()); assert!(0x0E == cpu.mem.r8(0x1000)); assert!(flags(&cpu, SF|PF));
assert!(18==cpu.step(bus)); assert!(0xFE == cpu.reg.a()); assert!(0x00 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, SF));
assert!(7 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
assert!(7 ==cpu.step(bus)); assert!(0x01 == cpu.reg.a());
assert!(10 ==cpu.step(bus)); assert!(0x00 == cpu.mem.r8(0x1000));
let f = cpu.reg.f() | CF;
cpu.reg.set_f(f);
assert!(18==cpu.step(bus)); assert!(0x00 == cpu.reg.a()); assert!(0x01 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, ZF|PF|CF));
assert!(18==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(0x00 == cpu.mem.r8(0x1000)); assert!(flags(&cpu, CF));
assert!(7 ==cpu.step(bus)); assert!(0x00 == cpu.reg.a());
}
#[test]
fn test_in() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x01, 0xDB, 0x03, 0xDB, 0x04, 0x01, 0x02, 0x02, 0xED, 0x78, 0x01, 0xFF, 0x05, 0xED, 0x50, 0x01, 0x05, 0x05, 0xED, 0x58, 0x01, 0x06, 0x01, 0xED, 0x60, 0x01, 0x00, 0x10, 0xED, 0x68, 0xED, 0x40, 0xED, 0x48, ];
cpu.mem.write(0x0000, &prog);
cpu.reg.set_f(HF|CF);
assert!(7 ==cpu.step(bus)); assert!(0x01 == cpu.reg.a()); assert!(flags(&cpu, HF|CF));
assert!(11==cpu.step(bus)); assert!(0x06 == cpu.reg.a()); assert!(flags(&cpu, HF|CF));
assert!(11==cpu.step(bus)); assert!(0x08 == cpu.reg.a()); assert!(flags(&cpu, HF|CF));
assert!(10==cpu.step(bus)); assert!(0x0202 == cpu.reg.bc());
assert!(12==cpu.step(bus)); assert!(0x04 == cpu.reg.a()); assert!(flags(&cpu, CF));
assert!(10==cpu.step(bus)); assert!(0x05FF == cpu.reg.bc());
assert!(12==cpu.step(bus)); assert!(0xFE == cpu.reg.d()); assert!(flags(&cpu, SF|CF));
assert!(10==cpu.step(bus)); assert!(0x0505 == cpu.reg.bc());
assert!(12==cpu.step(bus)); assert!(0x0A == cpu.reg.e()); assert!(flags(&cpu, PF|CF));
assert!(10==cpu.step(bus)); assert!(0x0106 == cpu.reg.bc());
assert!(12==cpu.step(bus)); assert!(0x0C == cpu.reg.h()); assert!(flags(&cpu, PF|CF));
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.bc());
assert!(12==cpu.step(bus)); assert!(0x00 == cpu.reg.l()); assert!(flags(&cpu, ZF|PF|CF));
assert!(12==cpu.step(bus)); assert!(0x00 == cpu.reg.b()); assert!(flags(&cpu, ZF|PF|CF));
assert!(12==cpu.step(bus)); assert!(0x00 == cpu.reg.c()); assert!(flags(&cpu, ZF|PF|CF));
}
#[test]
fn test_out() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x3E, 0x01, 0xD3, 0x01, 0xD3, 0x02, 0x01, 0x34, 0x12, 0x11, 0x78, 0x56, 0x21, 0xCD, 0xAB, 0xED, 0x79, 0xED, 0x41, 0xED, 0x49, 0xED, 0x51, 0xED, 0x59, 0xED, 0x61, 0xED, 0x69, ];
cpu.mem.write(0x0000, &prog);
assert!(7 ==cpu.step(bus)); assert!(0x01 == cpu.reg.a());
assert!(11==cpu.step(bus)); assert!(0x0101 == bus.port.get()); assert!(0x01 == bus.val.get());
assert!(11==cpu.step(bus)); assert!(0x0102 == bus.port.get()); assert!(0x01 == bus.val.get());
assert!(10==cpu.step(bus)); assert!(0x1234 == cpu.reg.bc());
assert!(10==cpu.step(bus)); assert!(0x5678 == cpu.reg.de());
assert!(10==cpu.step(bus)); assert!(0xABCD == cpu.reg.hl());
assert!(12==cpu.step(bus)); assert!(0x1234 == bus.port.get()); assert!(0x01 == bus.val.get());
assert!(12==cpu.step(bus)); assert!(0x1234 == bus.port.get()); assert!(0x12 == bus.val.get());
assert!(12==cpu.step(bus)); assert!(0x1234 == bus.port.get()); assert!(0x34 == bus.val.get());
assert!(12==cpu.step(bus)); assert!(0x1234 == bus.port.get()); assert!(0x56 == bus.val.get());
assert!(12==cpu.step(bus)); assert!(0x1234 == bus.port.get()); assert!(0x78 == bus.val.get());
assert!(12==cpu.step(bus)); assert!(0x1234 == bus.port.get()); assert!(0xAB == bus.val.get());
assert!(12==cpu.step(bus)); assert!(0x1234 == bus.port.get()); assert!(0xCD == bus.val.get());
}
#[test]
fn test_inir_indr() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let prog = [
0x21, 0x00, 0x10, 0x01, 0x02, 0x03, 0xED, 0xB2, 0x01, 0x03, 0x03, 0xED, 0xBA ];
cpu.mem.write(0x0000, &prog);
assert!(10 == cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(10 == cpu.step(bus)); assert!(0x0302 == cpu.reg.bc());
assert!(21==cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x0202 == cpu.reg.bc());
assert!(0x04 == cpu.mem.r8(0x1000));
assert!((cpu.reg.f() & ZF) == 0);
assert!(21==cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x0102 == cpu.reg.bc());
assert!(0x04 == cpu.mem.r8(0x1001));
assert!((cpu.reg.f() & ZF) == 0);
assert!(16==cpu.step(bus));
assert!(0x1003 == cpu.reg.hl());
assert!(0x0002 == cpu.reg.bc());
assert!(0x04 == cpu.mem.r8(0x1002));
assert!((cpu.reg.f() & ZF) != 0);
assert!(10==cpu.step(bus)); assert!(0x0303 == cpu.reg.bc());
assert!(21==cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x0203 == cpu.reg.bc());
assert!(0x06 == cpu.mem.r8(0x1003));
assert!((cpu.reg.f() & ZF) == 0);
assert!(21==cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x0103 == cpu.reg.bc());
assert!(0x06 == cpu.mem.r8(0x1002));
assert!((cpu.reg.f() & ZF) == 0);
assert!(16==cpu.step(bus));
assert!(0x1000 == cpu.reg.hl());
assert!(0x0003 == cpu.reg.bc());
assert!(0x06 == cpu.mem.r8(0x1001));
assert!((cpu.reg.f() & ZF) != 0);
}
#[test]
fn test_otir_otdr() {
let mut cpu = rz80::CPU::new_64k();
let bus = &TestBus::new();
let data = [ 0x01, 0x02, 0x03, 0x04 ];
cpu.mem.write(0x1000, &data);
let prog = [
0x21, 0x00, 0x10, 0x01, 0x02, 0x03, 0xED, 0xB3, 0x01, 0x03, 0x03, 0xED, 0xBB, ];
cpu.mem.write(0x0000, &prog);
assert!(10==cpu.step(bus)); assert!(0x1000 == cpu.reg.hl());
assert!(10==cpu.step(bus)); assert!(0x0302 == cpu.reg.bc());
assert!(21==cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x0202 == cpu.reg.bc());
assert!(0x0202 == bus.port.get()); assert!(0x01 == bus.val.get());
assert!((cpu.reg.f() & ZF) == 0);
assert!(21==cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x0102 == cpu.reg.bc());
assert!(0x0102 == bus.port.get()); assert!(0x02 == bus.val.get());
assert!((cpu.reg.f() & ZF) == 0);
assert!(16==cpu.step(bus));
assert!(0x1003 == cpu.reg.hl());
assert!(0x0002 == cpu.reg.bc());
assert!(0x0002 == bus.port.get()); assert!(0x03 == bus.val.get());
assert!((cpu.reg.f() & ZF) != 0);
assert!(10 == cpu.step(bus)); assert!(0x0303 == cpu.reg.bc());
assert!(21==cpu.step(bus));
assert!(0x1002 == cpu.reg.hl());
assert!(0x0203 == cpu.reg.bc());
assert!(0x0203 == bus.port.get()); assert!(0x04 == bus.val.get());
assert!((cpu.reg.f() & ZF) == 0);
assert!(21==cpu.step(bus));
assert!(0x1001 == cpu.reg.hl());
assert!(0x0103 == cpu.reg.bc());
assert!(0x0103 == bus.port.get()); assert!(0x03 == bus.val.get());
assert!((cpu.reg.f() & ZF) == 0);
assert!(16==cpu.step(bus));
assert!(0x1000 == cpu.reg.hl());
assert!(0x0003 == cpu.reg.bc());
assert!(0x0003 == bus.port.get()); assert!(0x02 == bus.val.get());
assert!((cpu.reg.f() & ZF) != 0);
}
}