From d6e645cae7d4a5ebb0451d790c7546c3f2538b6f Mon Sep 17 00:00:00 2001 From: Jared Burce Date: Thu, 18 Mar 2021 01:43:22 -0700 Subject: [PATCH] emu: use wrapping_add in displacement address as operand can be neg --- src/emu/i8088.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/emu/i8088.rs b/src/emu/i8088.rs index 9cd199d..d208b68 100644 --- a/src/emu/i8088.rs +++ b/src/emu/i8088.rs @@ -133,19 +133,23 @@ macro_rules! step { (@displace8=($reg1:ident $(+ $reg2:ident)? ) $cookie:tt, $cpu:expr, $bus:expr, ($segment:ident, $repeat:ident, $prefix_loop:lifetime), $modrm:tt) => { { - let d8 = i8088::next_ip($cpu.cs.get(), &mut $cpu.ip, $bus); + let rel8 = i8088::next_ip($cpu.cs.get(), &mut $cpu.ip, $bus) as i8 as u16; step!(@arg $cookie, &mut FarPtr { bus: $bus, segment: $segment.unwrap(), - offset: $cpu.$reg1.get() $(+ $cpu.$reg2.get())? + d8 as u16 }) + offset: ($cpu.$reg1.get() $(+ $cpu.$reg2.get())?) + .wrapping_add(rel8) + }) } }; (@displace16=($reg1:ident $(+ $reg2:ident)? ) $cookie:tt, $cpu:expr, $bus:expr, ($segment:ident, $repeat:ident, $prefix_loop:lifetime), $modrm:tt) => { { - let d16 = i8088::next_ip16($cpu.cs.get(), &mut $cpu.ip, $bus); + let rel16 = i8088::next_ip16($cpu.cs.get(), &mut $cpu.ip, $bus); step!(@arg $cookie, &mut FarPtr { bus: $bus, segment: $segment.unwrap(), - offset: $cpu.$reg1.get() $(+ $cpu.$reg2.get())? + d16 }) + offset: ($cpu.$reg1.get() $(+ $cpu.$reg2.get())?) + .wrapping_add(rel16) + }) } }; (@flags $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => {