emu: factor out utils into own module

This commit is contained in:
2021-03-12 02:27:00 -08:00
parent 27bc36f9d2
commit ac7b3b16a1
7 changed files with 45 additions and 37 deletions

View File

@@ -1,5 +1,6 @@
use emu::pc::Bus; 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) { pub fn interrupt(cpu: &mut i8088, bus: &mut Bus) {
let svc = read_hi(&cpu.a); let svc = read_hi(&cpu.a);

View File

@@ -3,9 +3,10 @@ use std::fmt::{Debug, Formatter};
use super::byteorder::{ByteOrder, LittleEndian}; 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::operations as ops;
use emu::pc::Bus; use emu::pc::Bus;
use emu::util::segoff_to_addr;
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
#[derive(Clone, Debug, Default)] #[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<u16>) -> u8 {
let mut buf = [0; 2];
LittleEndian::write_u16(&mut buf, val.get());
buf[1] as u8
}
pub fn read_lo(val: &Cell<u16>) -> u8 {
let mut buf = [0; 2];
LittleEndian::write_u16(&mut buf, val.get());
buf[0] as u8
}
pub fn write_hi(reg: &Cell<u16>, 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<u16>, 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<u16> for Flags { impl From<u16> for Flags {
fn from(flags: u16) -> Self { fn from(flags: u16) -> Self {
Self { Self {

View File

@@ -5,3 +5,4 @@ pub mod i8088;
mod operands; mod operands;
mod operations; mod operations;
pub mod pc; pub mod pc;
mod util;

View File

@@ -1,5 +1,6 @@
use std::cell::Cell; 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; use emu::pc::Bus;
pub trait LValue<T> { pub trait LValue<T> {

View File

@@ -1,8 +1,9 @@
use emu::byteorder::{ByteOrder, LittleEndian}; use emu::byteorder::{ByteOrder, LittleEndian};
use emu::dos; use emu::dos;
use emu::i8088::{i8088, segoff_to_addr}; use emu::i8088::i8088;
use emu::operands::{Address, LValue, Reg, RValue}; use emu::operands::{Address, LValue, Reg, RValue};
use emu::pc::Bus; use emu::pc::Bus;
use emu::util::segoff_to_addr;
pub fn show(cpu: &mut i8088) { pub fn show(cpu: &mut i8088) {
println!("{:#X?}", cpu); println!("{:#X?}", cpu);

View File

@@ -1,8 +1,9 @@
use std::cell::Cell; use std::cell::Cell;
use emu::i8088::{i8088, segoff_to_addr};
use std::fmt::{Debug, Formatter}; use std::fmt::{Debug, Formatter};
use emu::i8088::i8088;
use emu::util::segoff_to_addr;
const RAM_SIZE: usize = 128 * 1024; const RAM_SIZE: usize = 128 * 1024;
pub struct PC { pub struct PC {

33
src/emu/util.rs Normal file
View File

@@ -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<u16>) -> u8 {
let mut buf = [0; 2];
LittleEndian::write_u16(&mut buf, val.get());
buf[1] as u8
}
pub fn read_lo(val: &Cell<u16>) -> u8 {
let mut buf = [0; 2];
LittleEndian::write_u16(&mut buf, val.get());
buf[0] as u8
}
pub fn write_hi(reg: &Cell<u16>, 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<u16>, val: u8) {
let mut buf = [0; 2];
LittleEndian::write_u16(&mut buf, reg.get());
buf[1] = val;
reg.set(LittleEndian::read_u16(&buf));
}