emu: near/short JUMP instructions. Use u16+wrapping_add for all rels
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user