1use crate::{
2 crc::Crc,
3 gb::{mem::Mem, CpuReg8, CpuTestHarness},
4};
5
6pub fn bit_ops(cpu: &mut impl CpuTestHarness) {
7 let mut crc = Crc::default();
8 let mut mem = Mem::default();
9
10 for (expected, instr) in INSTRS {
11 for f in [0x00, 0xf0] {
12 for n in 0..VALUES.len() {
13 for m in 0..VALUES.len() {
14 cpu.set_reg_8(CpuReg8::A, VALUES[n]); cpu.set_reg_8(CpuReg8::F, f);
16 cpu.set_reg_8(CpuReg8::B, VALUES[(m + 0) % VALUES.len()]); cpu.set_reg_8(CpuReg8::C, VALUES[(m + 1) % VALUES.len()]);
18 cpu.set_reg_8(CpuReg8::D, VALUES[(m + 4) % VALUES.len()]); cpu.set_reg_8(CpuReg8::E, VALUES[(m + 5) % VALUES.len()]);
20 cpu.set_reg_8(CpuReg8::H, VALUES[(m + 2) % VALUES.len()]); cpu.set_reg_8(CpuReg8::L, VALUES[(m + 3) % VALUES.len()]);
22
23 cpu.execute(&mut mem, instr);
24
25 crc.add(cpu);
26 }
27 }
28 }
29
30 assert_eq!(expected, crc.take_val(), "instr={:?}", instr);
31 }
32}
33
34const VALUES: [u8; 10] = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xff];
35
36const INSTRS: [(u32, &'static [u8]); 168] = [
37 (0x164a5146, &[0xcb, 0x40]), (0x4eb218d4, &[0xcb, 0x41]), (0xea15b5ed, &[0xcb, 0x42]), (0x3e666674, &[0xcb, 0x43]), (0x6a7ff3c2, &[0xcb, 0x44]), (0x2162ca63, &[0xcb, 0x45]), (0x83e41e72, &[0xcb, 0x47]), (0x1d41566a, &[0xcb, 0x48]), (0x38db9091, &[0xcb, 0x49]), (0x246c0a54, &[0xcb, 0x4a]), (0x5bea9e02, &[0xcb, 0x4b]), (0x80cba76d, &[0xcb, 0x4c]), (0x0ff30bb4, &[0xcb, 0x4d]), (0xbb753840, &[0xcb, 0x4f]), (0xe52b30af, &[0xcb, 0x50]), (0x33d097bd, &[0xcb, 0x51]), (0x0afdcb83, &[0xcb, 0x52]), (0x959321bb, &[0xcb, 0x53]), (0xf6a22f28, &[0xcb, 0x54]), (0xe5475f1b, &[0xcb, 0x55]), (0x63392ea3, &[0xcb, 0x57]), (0xbb02e06c, &[0xcb, 0x58]), (0xcbbaf178, &[0xcb, 0x59]), (0xe0499f2c, &[0xcb, 0x5a]), (0xbb02e06c, &[0xcb, 0x5b]), (0xfda92804, &[0xcb, 0x5c]), (0x932ed75e, &[0xcb, 0x5d]), (0x0008781b, &[0xcb, 0x5f]), (0x0afdcb83, &[0xcb, 0x60]), (0x959321bb, &[0xcb, 0x61]), (0x96201769, &[0xcb, 0x62]), (0x51b6b4c3, &[0xcb, 0x63]), (0x05c34ec1, &[0xcb, 0x64]), (0x9825d072, &[0xcb, 0x65]), (0xb799f044, &[0xcb, 0x67]), (0x0ff30bb4, &[0xcb, 0x68]), (0x246c0a54, &[0xcb, 0x69]), (0x9d2b1045, &[0xcb, 0x6a]), (0x27df3c86, &[0xcb, 0x6b]), (0x5bea9e02, &[0xcb, 0x6c]), (0x604fb6b7, &[0xcb, 0x6d]), (0xaae1e070, &[0xcb, 0x6f]), (0x6a7ff3c2, &[0xcb, 0x70]), (0x2162ca63, &[0xcb, 0x71]), (0x65417680, &[0xcb, 0x72]), (0x2cd43baa, &[0xcb, 0x73]), (0xea15b5ed, &[0xcb, 0x74]), (0x3e666674, &[0xcb, 0x75]), (0x43a0ffad, &[0xcb, 0x77]), (0xa4064c7b, &[0xcb, 0x78]), (0x44ee3215, &[0xcb, 0x79]), (0x3b68a643, &[0xcb, 0x7a]), (0xd4be5d6f, &[0xcb, 0x7b]), (0xef1b75da, &[0xcb, 0x7c]), (0x8f994d9b, &[0xcb, 0x7d]), (0x1da9e849, &[0xcb, 0x7f]), (0x3a581bf5, &[0xcb, 0x80]), (0x512d2592, &[0xcb, 0x81]), (0x05625c38, &[0xcb, 0x82]), (0xad63a9dd, &[0xcb, 0x83]), (0x372f78e3, &[0xcb, 0x84]), (0x62db1590, &[0xcb, 0x85]), (0x35e8e258, &[0xcb, 0x87]), (0xea5ac1bb, &[0xcb, 0x88]), (0xaa28fe06, &[0xcb, 0x89]), (0xbf645d4f, &[0xcb, 0x8a]), (0xb27fcf83, &[0xcb, 0x8b]), (0xbf90a9f9, &[0xcb, 0x8c]), (0x64b606dd, &[0xcb, 0x8d]), (0x24e08a25, &[0xcb, 0x8f]), (0x139540fa, &[0xcb, 0x90]), (0x0d936191, &[0xcb, 0x91]), (0x0b0ea869, &[0xcb, 0x92]), (0x1adffdae, &[0xcb, 0x93]), (0x11d898d4, &[0xcb, 0x94]), (0x6616e961, &[0xcb, 0x95]), (0x2c1f82bd, &[0xcb, 0x97]), (0x772674e2, &[0xcb, 0x98]), (0x256ae413, &[0xcb, 0x99]), (0x4f8aded7, &[0xcb, 0x9a]), (0xbc477b1f, &[0xcb, 0x9b]), (0xe731dbda, &[0xcb, 0x9c]), (0x392c062b, &[0xcb, 0x9d]), (0x0b1cfc15, &[0xcb, 0x9f]), (0x0fa03b1a, &[0xcb, 0xa0]), (0x1cd8e555, &[0xcb, 0xa1]), (0xb87f6c6d, &[0xcb, 0xa2]), (0xaf9cad14, &[0xcb, 0xa3]), (0x4060b692, &[0xcb, 0xa4]), (0x2f6de676, &[0xcb, 0xa5]), (0x6d45ca9e, &[0xcb, 0xa7]), (0x35479754, &[0xcb, 0xa8]), (0x635039ee, &[0xcb, 0xa9]), (0xab8a8c47, &[0xcb, 0xaa]), (0x106df718, &[0xcb, 0xab]), (0x0c74a6b7, &[0xcb, 0xac]), (0xf59c2411, &[0xcb, 0xad]), (0x16fb5d64, &[0xcb, 0xaf]), (0xc6591c65, &[0xcb, 0xb0]), (0x5230e3b9, &[0xcb, 0xb1]), (0x9eb8e41d, &[0xcb, 0xb2]), (0x6f7b2fa3, &[0xcb, 0xb3]), (0x41242003, &[0xcb, 0xb4]), (0xb822f74c, &[0xcb, 0xb5]), (0xe375a792, &[0xcb, 0xb7]), (0xfd5ef21d, &[0xcb, 0xb8]), (0x34f3a4b7, &[0xcb, 0xb9]), (0xca37f7bf, &[0xcb, 0xba]), (0x4dd42267, &[0xcb, 0xbb]), (0x58991ade, &[0xcb, 0xbc]), (0x129165b2, &[0xcb, 0xbd]), (0x08658cf2, &[0xcb, 0xbf]), (0xd39be269, &[0xcb, 0xc0]), (0xf1718c94, &[0xcb, 0xc1]), (0x532922d8, &[0xcb, 0xc2]), (0x55d96ae8, &[0xcb, 0xc3]), (0xef42243e, &[0xcb, 0xc4]), (0x02ac1238, &[0xcb, 0xc5]), (0x2c7d8435, &[0xcb, 0xc7]), (0xe2ac34c2, &[0xcb, 0xc8]), (0x31e0aa4b, &[0xcb, 0xc9]), (0x13f2a08f, &[0xcb, 0xca]), (0x987b4fa8, &[0xcb, 0xcb]), (0xd43b1602, &[0xcb, 0xcc]), (0xa458098d, &[0xcb, 0xcd]), (0x17ca46ff, &[0xcb, 0xcf]), (0x0278aa08, &[0xcb, 0xd0]), (0xe172cf4a, &[0xcb, 0xd1]), (0x895255a8, &[0xcb, 0xd2]), (0x4ed6fdf8, &[0xcb, 0xd3]), (0xc68fe722, &[0xcb, 0xd4]), (0x3cbbf180, &[0xcb, 0xd5]), (0x4a4a1b09, &[0xcb, 0xd7]), (0x54fda106, &[0xcb, 0xd8]), (0x27d8bfe4, &[0xcb, 0xd9]), (0x90422314, &[0xcb, 0xda]), (0x14557bb3, &[0xcb, 0xdb]), (0x92ee2277, &[0xcb, 0xdc]), (0x8c7637e9, &[0xcb, 0xdd]), (0xc7b7cf7d, &[0xcb, 0xdf]), (0x481790d2, &[0xcb, 0xe0]), (0x19bc52bb, &[0xcb, 0xe1]), (0xdc9f91aa, &[0xcb, 0xe2]), (0x24c9aa0d, &[0xcb, 0xe3]), (0xabdf45c8, &[0xcb, 0xe4]), (0x9ea883b3, &[0xcb, 0xe5]), (0x2f62aa0f, &[0xcb, 0xe7]), (0xba28c0c4, &[0xcb, 0xe8]), (0x69995632, &[0xcb, 0xe9]), (0x624b77c9, &[0xcb, 0xea]), (0xddb6ff6b, &[0xcb, 0xeb]), (0x007a4642, &[0xcb, 0xec]), (0x4d67e9da, &[0xcb, 0xed]), (0x92b59c46, &[0xcb, 0xef]), (0x03f6b504, &[0xcb, 0xf0]), (0x47a23c01, &[0xcb, 0xf1]), (0xd64a1540, &[0xcb, 0xf2]), (0x2fbc3904, &[0xcb, 0xf3]), (0x5939e1e9, &[0xcb, 0xf4]), (0x12a46a9b, &[0xcb, 0xf5]), (0x30992397, &[0xcb, 0xf7]), (0xad70a69e, &[0xcb, 0xf8]), (0x1fd61bc7, &[0xcb, 0xf9]), (0x5bd21505, &[0xcb, 0xfa]), (0xcc5a0f29, &[0xcb, 0xfb]), (0x68a2990a, &[0xcb, 0xfc]), (0x9ced585d, &[0xcb, 0xfd]), (0x74cd82b9, &[0xcb, 0xff]), ];