diff --git a/src/emu/i8088.rs b/src/emu/i8088.rs index b13ab8d..679eb92 100644 --- a/src/emu/i8088.rs +++ b/src/emu/i8088.rs @@ -563,10 +563,13 @@ impl i8088 { 0x20 => shl[form=word3, flags, modrm16, reglo=c] / "2/23+", // SHL r/m16, CL 0x28 => shr[form=word3, flags, modrm16, reglo=c] / "2/23+", // SHR r/m16, CL 0x38 => sar[form=word3, flags, modrm16, reglo=c] / "2/23+" }, // SAR r/m16, CL - 0xE3 => jcxz[reg=ip, reg=c, rel8] / "18/6", // JCXZ rel8 + 0xE0 => loopnz[flags, reg=ip, reg=c, rel8] / "18/6", // LOOPNZ/LOOPNE rel8 + 0xE1 => loopz[flags, reg=ip, reg=c, rel8] / "18/6", // LOOPZ/LOOPE rel8 + 0xE2 => looop[reg=ip, reg=c, rel8] / "17/5", // LOOP rel8 + 0xE3 => jcxz[reg=ip, reg=c, rel8] / "18/6", // JCXZ rel8 0xE9 => jmp[reg=ip, rel16] / 15, // JMP rel16 - 0xEB => jmp[reg=ip, rel8] / 15, // JMP rel8 - 0xE8 => call[reg=ip, bus, regval=ss, reg=sp, rel16] / 23, + 0xEB => jmp[reg=ip, rel8] / 15, // JMP rel8 + 0xE8 => call[reg=ip, bus, regval=ss, reg=sp, rel16] / 23, // CALL rel16 0xF2 => nop[rep=NotEqual, prefix] / 0, // REPNE/REPNZ 0xF3 => nop[rep=Equal, prefix] / 0, // REP/REPE/REPZ 0xF5 => cmc[flags] / 2, // CMC (Complement Carry Flag) diff --git a/src/emu/operations.rs b/src/emu/operations.rs index 6475377..b0ae4c8 100644 --- a/src/emu/operations.rs +++ b/src/emu/operations.rs @@ -271,6 +271,31 @@ where for<'a> FarPtr<'a>: RValue }); } +// loop is a rust keyword and I don't wanna put r# everywhere +pub fn looop(mut ip: Reg, mut cx: Reg, rel8: u16) { + let count = cx.read().wrapping_sub(1); + cx.write(count); + if count != 0 { + ip.write(ip.read().wrapping_add(rel8)); + } +} + +pub fn loopnz(flags: &mut Flags, mut ip: Reg, mut cx: Reg, rel8: u16) { + let count = cx.read().wrapping_sub(1); + cx.write(count); + if count != 0 && !flags.zf() { + ip.write(ip.read().wrapping_add(rel8)); + } +} + +pub fn loopz(flags: &mut Flags, mut ip: Reg, mut cx: Reg, rel8: u16) { + let count = cx.read().wrapping_sub(1); + cx.write(count); + if count != 0 && flags.zf() { + ip.write(ip.read().wrapping_add(rel8)); + } +} + pub fn mov(mut dst: impl LValue, src: impl RValue) { dst.write(src.read()); }