emu: near/short JUMP instructions. Use u16+wrapping_add for all rels

This commit is contained in:
2021-03-18 02:09:46 -07:00
parent d6e645cae7
commit c8d6a3312a
2 changed files with 121 additions and 3 deletions

View File

@@ -89,8 +89,8 @@ pub fn peek(addr: &(impl Address + RValue<u8>)) {
println!("PEEK: @{:#X} = {:#X} ({})", addr.addr(), addr.read(), addr.read());
}
pub fn call(ip: &mut Reg, bus: &mut Bus, ss: u16, sp: &mut Reg, addr: i16) {
let target = ip.read().wrapping_add(addr as u16);
pub fn call(ip: &mut Reg, bus: &mut Bus, ss: u16, sp: &mut Reg, rel16: u16) {
let target = ip.read().wrapping_add(rel16);
push(bus, ss, sp, ip.read());
ip.write(target);
}
@@ -142,6 +142,100 @@ pub fn int(cpu: &mut i8088, bus: &mut Bus, num: &u8) {
}
}
pub fn ja(flags: &Flags, ip: &mut Reg, rel8: u16) {
if !flags.cf && !flags.zf {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jae(flags: &Flags, ip: &mut Reg, rel8: u16) {
if !flags.cf {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jb(flags: &Flags, ip: &mut Reg, rel8: u16) {
if flags.cf {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jbe(flags: &Flags, ip: &mut Reg, rel8: u16) {
if flags.cf || flags.zf {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jcxz(ip: &mut Reg, cx: &mut Reg, rel8: u16) {
if cx.read() == 0 {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jg(flags: &Flags, ip: &mut Reg, rel8: u16) {
if flags.zf && flags.sf == flags.of {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jge(flags: &Flags, ip: &mut Reg, rel8: u16) {
if flags.sf == flags.of {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jl(flags: &Flags, ip: &mut Reg, rel8: u16) {
if flags.sf != flags.of {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jle(flags: &Flags, ip: &mut Reg, rel8: u16) {
if flags.zf || flags.sf != flags.of {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jmp(ip: &mut Reg, rel: u16) {
ip.write(ip.read().wrapping_add(rel));
}
pub fn jno(flags: &Flags, ip: &mut Reg, rel8: u16) {
if !flags.of {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jns(flags: &Flags, ip: &mut Reg, rel8: u16) {
if !flags.sf {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jnz(flags: &Flags, ip: &mut Reg, rel8: u16) {
if !flags.zf {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jo(flags: &Flags, ip: &mut Reg, rel8: u16) {
if flags.of {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn js(flags: &Flags, ip: &mut Reg, rel8: u16) {
if flags.sf {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn jz(flags: &Flags, ip: &mut Reg, rel8: u16) {
if flags.zf {
ip.write(ip.read().wrapping_add(rel8));
}
}
pub fn lea(dst: &mut Reg, addr: &FarPtr) {
dst.write(addr.offset)
}