emu: Pass [LR]Values by value instead of by &mut

I think this made sense originally because registers were being passed
as borrows directly out of the cpu struct. Now they have wrappers
around Cell refs, and those wrappers can be passed directly.
This commit is contained in:
2021-03-22 22:21:03 -07:00
parent 9b0b4efc40
commit cf9d2dd15d
2 changed files with 103 additions and 105 deletions

View File

@@ -97,7 +97,7 @@ macro_rules! step {
($segment:ident, $repeat:ident, $prefix_loop:lifetime),
$modrm:tt) => { {
let a16 = i8088::next_ip16($cpu.cs.get(), &mut $cpu.ip, $bus);
step!(@arg $cookie, &mut FarPtr { bus: $bus, segment: $segment.unwrap(), offset: a16 } )
step!(@arg $cookie, FarPtr { bus: $bus, segment: $segment.unwrap(), offset: a16 } )
} };
(@bus $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => {
@@ -110,47 +110,43 @@ macro_rules! step {
(@d8 $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => { {
let d8 = i8088::next_ip($cpu.cs.get(), &mut $cpu.ip, $bus);
step!(@arg $cookie, &d8)
step!(@arg $cookie, d8)
} };
(@d8_as_d16 $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => { {
let d8 = i8088::next_ip($cpu.cs.get(), &mut $cpu.ip, $bus);
step!(@arg $cookie, &(d8 as u16))
step!(@arg $cookie, d8 as u16)
} };
(@d16 $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => { {
let d16 = i8088::next_ip16($cpu.cs.get(), &mut $cpu.ip, $bus);
step!(@arg $cookie, &d16)
step!(@arg $cookie, d16)
} };
(@displace0=($reg1:ident $(+ $reg2:ident)? ) $cookie:tt, $cpu:expr, $bus:expr,
($segment:ident, $repeat:ident, $prefix_loop:lifetime),
$modrm:tt) => {
step!(@arg $cookie, &mut FarPtr { bus: $bus,
segment: $segment.unwrap(),
offset: $cpu.$reg1.get() $(+ $cpu.$reg2.get())? })
step!(@arg $cookie, FarPtr { bus: $bus,
segment: $segment.unwrap(),
offset: $cpu.$reg1.get() $(+ $cpu.$reg2.get())? })
};
(@displace8=($reg1:ident $(+ $reg2:ident)? ) $cookie:tt, $cpu:expr, $bus:expr,
($segment:ident, $repeat:ident, $prefix_loop:lifetime),
$modrm:tt) => { {
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())?)
.wrapping_add(rel8)
})
step!(@arg $cookie, FarPtr { bus: $bus,
segment: $segment.unwrap(),
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 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())?)
.wrapping_add(rel16)
})
step!(@arg $cookie, FarPtr { bus: $bus,
segment: $segment.unwrap(),
offset: ($cpu.$reg1.get() $(+ $cpu.$reg2.get())?).wrapping_add(rel16) })
} };
(@flags $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => {
@@ -211,14 +207,14 @@ macro_rules! step {
(@r16 $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, ($modrm_val:ident, $modrm:tt, $modrm16:tt, $modrm8:tt)) => {
// TODO: Should these also be passed into the macro like the modrm specs?
match $modrm_val >> 3 & 0x7 {
0 => step!(@arg $cookie, &mut Reg { reg: &$cpu.a } ),
1 => step!(@arg $cookie, &mut Reg { reg: &$cpu.c } ),
2 => step!(@arg $cookie, &mut Reg { reg: &$cpu.d } ),
3 => step!(@arg $cookie, &mut Reg { reg: &$cpu.b } ),
4 => step!(@arg $cookie, &mut Reg { reg: &$cpu.sp } ),
5 => step!(@arg $cookie, &mut Reg { reg: &$cpu.bp } ),
6 => step!(@arg $cookie, &mut Reg { reg: &$cpu.si } ),
7 => step!(@arg $cookie, &mut Reg { reg: &$cpu.di } ),
0 => step!(@arg $cookie, Reg { reg: &$cpu.a } ),
1 => step!(@arg $cookie, Reg { reg: &$cpu.c } ),
2 => step!(@arg $cookie, Reg { reg: &$cpu.d } ),
3 => step!(@arg $cookie, Reg { reg: &$cpu.b } ),
4 => step!(@arg $cookie, Reg { reg: &$cpu.sp } ),
5 => step!(@arg $cookie, Reg { reg: &$cpu.bp } ),
6 => step!(@arg $cookie, Reg { reg: &$cpu.si } ),
7 => step!(@arg $cookie, Reg { reg: &$cpu.di } ),
_ => unreachable!()
};
};
@@ -226,28 +222,28 @@ macro_rules! step {
(@r8 $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, ($modrm_val:ident, $modrm:tt, $modrm16:tt, $modrm8:tt)) => {
// TODO: Should these also be passed into the macro like the modrm specs?
match $modrm_val >> 3 & 0x7 {
0 => step!(@arg $cookie, &mut RegHi { reg: &$cpu.a } ),
1 => step!(@arg $cookie, &mut RegHi { reg: &$cpu.c } ),
2 => step!(@arg $cookie, &mut RegHi { reg: &$cpu.d } ),
3 => step!(@arg $cookie, &mut RegHi { reg: &$cpu.b } ),
4 => step!(@arg $cookie, &mut RegLo { reg: &$cpu.a } ),
5 => step!(@arg $cookie, &mut RegLo { reg: &$cpu.c } ),
6 => step!(@arg $cookie, &mut RegLo { reg: &$cpu.d } ),
7 => step!(@arg $cookie, &mut RegLo { reg: &$cpu.b } ),
0 => step!(@arg $cookie, RegHi { reg: &$cpu.a } ),
1 => step!(@arg $cookie, RegHi { reg: &$cpu.c } ),
2 => step!(@arg $cookie, RegHi { reg: &$cpu.d } ),
3 => step!(@arg $cookie, RegHi { reg: &$cpu.b } ),
4 => step!(@arg $cookie, RegLo { reg: &$cpu.a } ),
5 => step!(@arg $cookie, RegLo { reg: &$cpu.c } ),
6 => step!(@arg $cookie, RegLo { reg: &$cpu.d } ),
7 => step!(@arg $cookie, RegLo { reg: &$cpu.b } ),
_ => unreachable!()
};
};
(@reg=$reg:ident $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => {
step!(@arg $cookie, &mut Reg { reg: &$cpu.$reg });
step!(@arg $cookie, Reg { reg: &$cpu.$reg });
};
(@reghi=$reg:ident $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => {
step!(@arg $cookie, &mut RegHi { reg: &$cpu.$reg });
step!(@arg $cookie, RegHi { reg: &$cpu.$reg });
};
(@reglo=$reg:ident $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => {
step!(@arg $cookie, &mut RegLo { reg: &$cpu.$reg });
step!(@arg $cookie, RegLo { reg: &$cpu.$reg });
};
(@regval=$reg:ident $cookie:tt, $cpu:expr, $bus:expr, $prefix:tt, $modrm:tt) => {