From e1a6feb6f56847fac59435dd65ed88978be38e3e Mon Sep 17 00:00:00 2001 From: Jared Burce Date: Sat, 6 Mar 2021 07:02:57 -0800 Subject: [PATCH] emu: Factor out hi/lo register access --- src/emu/dos.rs | 6 +++--- src/emu/i8088.rs | 35 ++++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/emu/dos.rs b/src/emu/dos.rs index 28603f1..3de8547 100644 --- a/src/emu/dos.rs +++ b/src/emu/dos.rs @@ -1,9 +1,9 @@ use emu::pc::Bus; -use emu::i8088::i8088; +use emu::i8088::{i8088, read_hi}; pub fn interrupt(cpu: &mut i8088, _bus: &mut Bus) { - let svc = cpu.a; + let svc = read_hi(cpu.a); match svc { - _ => unimplemented!("dos service: {:#02X}\ncpu: {:#X?}", svc, cpu) + _ => unimplemented!("dos service: AH={:02X}h\ncpu: {:#X?}", svc, cpu) } } diff --git a/src/emu/i8088.rs b/src/emu/i8088.rs index 683526d..41e6c3f 100644 --- a/src/emu/i8088.rs +++ b/src/emu/i8088.rs @@ -120,18 +120,13 @@ struct RegHi<'a> { impl<'a> LValue for RegHi<'a> { fn write(&mut self, val: u8) { - let mut buf = [0; 2]; - LittleEndian::write_u16(&mut buf, *self.reg); - buf[1] = val; - *self.reg = LittleEndian::read_u16(&buf); + write_hi(&mut self.reg, val); } } impl<'a> RValue for RegHi<'a> { fn read(&self) -> u8 { - let mut buf = [0; 2]; - LittleEndian::write_u16(&mut buf, *self.reg); - buf[1] as u8 + read_hi(*self.reg) } } @@ -220,6 +215,32 @@ pub const fn segoff_to_addr(segment: u16, offset: u16) -> usize { segaddr + offset as usize } +pub fn read_hi(val: u16) -> u8 { + let mut buf = [0; 2]; + LittleEndian::write_u16(&mut buf, val); + buf[1] as u8 +} + +pub fn read_lo(val: u16) -> u8 { + let mut buf = [0; 2]; + LittleEndian::write_u16(&mut buf, val); + buf[0] as u8 +} + +pub fn write_hi(reg: &mut u16, val: u8) { + let mut buf = [0; 2]; + LittleEndian::write_u16(&mut buf, *reg); + buf[1] = val; + *reg = LittleEndian::read_u16(&buf); +} + +pub fn write_lo(reg: &mut u16, val: u8) { + let mut buf = [0; 2]; + LittleEndian::write_u16(&mut buf, *reg); + buf[1] = val; + *reg = LittleEndian::read_u16(&buf); +} + impl i8088 { pub fn run(&mut self, bus: &mut Bus) { loop {