emu: LOOP/LOOPZ/LOOPNZ ops

This commit is contained in:
2021-04-08 01:17:00 -07:00
parent 96c869f711
commit eca60fbe45
2 changed files with 31 additions and 3 deletions

View File

@@ -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
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,
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)

View File

@@ -271,6 +271,31 @@ where for<'a> FarPtr<'a>: RValue<T>
});
}
// 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<T>(mut dst: impl LValue<T>, src: impl RValue<T>) {
dst.write(src.read());
}