emu: use wrapping_add in displacement address as operand can be neg
This commit is contained in:
@@ -133,19 +133,23 @@ macro_rules! step {
|
|||||||
(@displace8=($reg1:ident $(+ $reg2:ident)? ) $cookie:tt, $cpu:expr, $bus:expr,
|
(@displace8=($reg1:ident $(+ $reg2:ident)? ) $cookie:tt, $cpu:expr, $bus:expr,
|
||||||
($segment:ident, $repeat:ident, $prefix_loop:lifetime),
|
($segment:ident, $repeat:ident, $prefix_loop:lifetime),
|
||||||
$modrm:tt) => { {
|
$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,
|
step!(@arg $cookie, &mut FarPtr { bus: $bus,
|
||||||
segment: $segment.unwrap(),
|
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,
|
(@displace16=($reg1:ident $(+ $reg2:ident)? ) $cookie:tt, $cpu:expr, $bus:expr,
|
||||||
($segment:ident, $repeat:ident, $prefix_loop:lifetime),
|
($segment:ident, $repeat:ident, $prefix_loop:lifetime),
|
||||||
$modrm:tt) => { {
|
$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,
|
step!(@arg $cookie, &mut FarPtr { bus: $bus,
|
||||||
segment: $segment.unwrap(),
|
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) => {
|
(@flags $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user