From ac7b3b16a1054602daa3bfe9d6326089bac631b3 Mon Sep 17 00:00:00 2001 From: Jared Burce Date: Fri, 12 Mar 2021 02:27:00 -0800 Subject: [PATCH] emu: factor out utils into own module --- src/emu/dos.rs | 3 ++- src/emu/i8088.rs | 34 ++-------------------------------- src/emu/mod.rs | 1 + src/emu/operands.rs | 3 ++- src/emu/operations.rs | 3 ++- src/emu/pc.rs | 5 +++-- src/emu/util.rs | 33 +++++++++++++++++++++++++++++++++ 7 files changed, 45 insertions(+), 37 deletions(-) create mode 100644 src/emu/util.rs diff --git a/src/emu/dos.rs b/src/emu/dos.rs index 70c6763..c811dbb 100644 --- a/src/emu/dos.rs +++ b/src/emu/dos.rs @@ -1,5 +1,6 @@ use emu::pc::Bus; -use emu::i8088::{i8088, read_hi, read_lo, segoff_to_addr}; +use emu::i8088::i8088; +use emu::util::{read_hi, read_lo, segoff_to_addr}; pub fn interrupt(cpu: &mut i8088, bus: &mut Bus) { let svc = read_hi(&cpu.a); diff --git a/src/emu/i8088.rs b/src/emu/i8088.rs index ffc23c3..e0c506a 100644 --- a/src/emu/i8088.rs +++ b/src/emu/i8088.rs @@ -3,9 +3,10 @@ use std::fmt::{Debug, Formatter}; use super::byteorder::{ByteOrder, LittleEndian}; -use emu::operands::{Addr, Reg, RegHi}; +use emu::operands::{Addr, Reg, RegHi, RegLo}; use emu::operations as ops; use emu::pc::Bus; +use emu::util::segoff_to_addr; #[allow(non_camel_case_types)] #[derive(Clone, Debug, Default)] @@ -302,37 +303,6 @@ impl i8088 { } } -pub const fn segoff_to_addr(segment: u16, offset: u16) -> usize { - let segaddr = (segment as usize) << 4; - segaddr + offset as usize -} - -pub fn read_hi(val: &Cell) -> u8 { - let mut buf = [0; 2]; - LittleEndian::write_u16(&mut buf, val.get()); - buf[1] as u8 -} - -pub fn read_lo(val: &Cell) -> u8 { - let mut buf = [0; 2]; - LittleEndian::write_u16(&mut buf, val.get()); - buf[0] as u8 -} - -pub fn write_hi(reg: &Cell, val: u8) { - let mut buf = [0; 2]; - LittleEndian::write_u16(&mut buf, reg.get()); - buf[1] = val; - reg.set(LittleEndian::read_u16(&buf)) -} - -pub fn write_lo(reg: &Cell, val: u8) { - let mut buf = [0; 2]; - LittleEndian::write_u16(&mut buf, reg.get()); - buf[1] = val; - reg.set(LittleEndian::read_u16(&buf)); -} - impl From for Flags { fn from(flags: u16) -> Self { Self { diff --git a/src/emu/mod.rs b/src/emu/mod.rs index 5c3d6c5..7f6a034 100644 --- a/src/emu/mod.rs +++ b/src/emu/mod.rs @@ -5,3 +5,4 @@ pub mod i8088; mod operands; mod operations; pub mod pc; +mod util; diff --git a/src/emu/operands.rs b/src/emu/operands.rs index 009c446..0f7bfb4 100644 --- a/src/emu/operands.rs +++ b/src/emu/operands.rs @@ -1,5 +1,6 @@ use std::cell::Cell; -use emu::i8088::{read_hi, read_lo, write_hi, write_lo}; + +use emu::util::{read_hi, read_lo, write_hi, write_lo}; use emu::pc::Bus; pub trait LValue { diff --git a/src/emu/operations.rs b/src/emu/operations.rs index ebf7112..594469f 100644 --- a/src/emu/operations.rs +++ b/src/emu/operations.rs @@ -1,8 +1,9 @@ use emu::byteorder::{ByteOrder, LittleEndian}; use emu::dos; -use emu::i8088::{i8088, segoff_to_addr}; +use emu::i8088::i8088; use emu::operands::{Address, LValue, Reg, RValue}; use emu::pc::Bus; +use emu::util::segoff_to_addr; pub fn show(cpu: &mut i8088) { println!("{:#X?}", cpu); diff --git a/src/emu/pc.rs b/src/emu/pc.rs index 465e7e0..e3ae23e 100644 --- a/src/emu/pc.rs +++ b/src/emu/pc.rs @@ -1,8 +1,9 @@ use std::cell::Cell; -use emu::i8088::{i8088, segoff_to_addr}; - use std::fmt::{Debug, Formatter}; +use emu::i8088::i8088; +use emu::util::segoff_to_addr; + const RAM_SIZE: usize = 128 * 1024; pub struct PC { diff --git a/src/emu/util.rs b/src/emu/util.rs new file mode 100644 index 0000000..c7d6b42 --- /dev/null +++ b/src/emu/util.rs @@ -0,0 +1,33 @@ +use std::cell::Cell; +use emu::byteorder::{ByteOrder, LittleEndian}; + +pub const fn segoff_to_addr(segment: u16, offset: u16) -> usize { + let segaddr = (segment as usize) << 4; + segaddr + offset as usize +} + +pub fn read_hi(val: &Cell) -> u8 { + let mut buf = [0; 2]; + LittleEndian::write_u16(&mut buf, val.get()); + buf[1] as u8 +} + +pub fn read_lo(val: &Cell) -> u8 { + let mut buf = [0; 2]; + LittleEndian::write_u16(&mut buf, val.get()); + buf[0] as u8 +} + +pub fn write_hi(reg: &Cell, val: u8) { + let mut buf = [0; 2]; + LittleEndian::write_u16(&mut buf, reg.get()); + buf[1] = val; + reg.set(LittleEndian::read_u16(&buf)) +} + +pub fn write_lo(reg: &Cell, val: u8) { + let mut buf = [0; 2]; + LittleEndian::write_u16(&mut buf, reg.get()); + buf[1] = val; + reg.set(LittleEndian::read_u16(&buf)); +}