emu: factor out utils into own module
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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<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 {
|
||||
fn from(flags: u16) -> Self {
|
||||
Self {
|
||||
|
||||
@@ -5,3 +5,4 @@ pub mod i8088;
|
||||
mod operands;
|
||||
mod operations;
|
||||
pub mod pc;
|
||||
mod util;
|
||||
|
||||
@@ -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<T> {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
33
src/emu/util.rs
Normal file
33
src/emu/util.rs
Normal 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));
|
||||
}
|
||||
Reference in New Issue
Block a user