librsmsx 0.4.4

a MSX emulator written in rust, a port from gomsx
Documentation
#![allow(dead_code)]

use crate::libs::memory::Memory;

use super::z80_base::Z80Data;

/// returns (high, low)
pub fn split_word(word: u16) -> (u8, u8) {
    ((word >> 8) as u8, (word & 0xff) as u8)
}

pub fn join_bytes(h: u8, l: u8) -> u16 {
    (l as u16) | ((h as u16) << 8)
}

pub fn tern_op_b(cond: bool, ret1: u8, ret2: u8) -> u8 {
    if cond {
        return ret1;
    }
    ret2
}

pub fn sign_extend(v: u8) -> i16 {
    i16::from(v as i8)
}

pub fn assert_pc(data: &Z80Data, addr: u16) {
    assert!(
        data.pc() == addr,
        "cur.pc:0x{:04x} ~= tgt.pc:0x{:04x}",
        data.pc(),
        addr
    );
}

pub fn read_word(memory: &Memory, addr: u16) -> u16 {
    let l = memory.read_byte(addr);
    let h = memory.read_byte(addr + 1);
    join_bytes(h, l)
}

pub fn peek_stack(data: &Z80Data, memory: &Memory, depth: usize) {
    let sp = data.sp;
    let mut s = format!("SP(0x{:04x}): ", sp);
    for i in 0..depth {
        s.push_str(format!("0x{:04x} ", read_word(memory, sp + 2 * i as u16)).as_str());
    }
    println!("{}", s);
}