emu: LOOP/LOOPZ/LOOPNZ ops
This commit is contained in:
@@ -563,10 +563,13 @@ impl i8088 {
|
|||||||
0x20 => shl[form=word3, flags, modrm16, reglo=c] / "2/23+", // SHL r/m16, CL
|
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
|
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
|
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
|
0xE3 => jcxz[reg=ip, reg=c, rel8] / "18/6", // JCXZ rel8
|
||||||
0xE9 => jmp[reg=ip, rel16] / 15, // JMP rel16
|
0xE9 => jmp[reg=ip, rel16] / 15, // JMP rel16
|
||||||
0xEB => jmp[reg=ip, rel8] / 15, // JMP rel8
|
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
|
0xF2 => nop[rep=NotEqual, prefix] / 0, // REPNE/REPNZ
|
||||||
0xF3 => nop[rep=Equal, prefix] / 0, // REP/REPE/REPZ
|
0xF3 => nop[rep=Equal, prefix] / 0, // REP/REPE/REPZ
|
||||||
0xF5 => cmc[flags] / 2, // CMC (Complement Carry Flag)
|
0xF5 => cmc[flags] / 2, // CMC (Complement Carry Flag)
|
||||||
|
|||||||
@@ -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>) {
|
pub fn mov<T>(mut dst: impl LValue<T>, src: impl RValue<T>) {
|
||||||
dst.write(src.read());
|
dst.write(src.read());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user