emu: factor out utils into own module
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -5,3 +5,4 @@ pub mod i8088;
|
|||||||
mod operands;
|
mod operands;
|
||||||
mod operations;
|
mod operations;
|
||||||
pub mod pc;
|
pub mod pc;
|
||||||
|
mod util;
|
||||||
|
|||||||
@@ -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> {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
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