use crate::alu;
use crate::bus::Bus;
use crate::cpu::Cpu;
#[rustfmt::skip]
const PAGE2_CYCLES: [u8; 256] = {
let mut t = [0u8; 256];
t[0x3E] = 20; t[0x3F] = 20; t[0x83] = 5; t[0x8C] = 5; t[0x93] = 7; t[0x9C] = 7; t[0xA3] = 7; t[0xAC] = 7; t[0xB3] = 8; t[0xBC] = 8; t[0xC3] = 5; t[0xD3] = 7; t[0xE3] = 7; t[0xF3] = 8; t
};
pub fn execute(cpu: &mut Cpu, bus: &mut impl Bus, opcode: u8) {
cpu.cycles += PAGE2_CYCLES[opcode as usize] as u64;
match opcode {
0x3E => {
cpu.push_entire_state(bus);
cpu.reg.pc = bus.read_word(crate::cpu::VEC_FIRQ);
}
0x3F => {
cpu.reg.cc.set_entire(true);
cpu.push_entire_state(bus);
cpu.reg.pc = bus.read_word(crate::cpu::VEC_SWI3);
}
0x83 => {
let v = cpu.fetch_word(bus);
let u = cpu.reg.u;
alu::sub16(u, v, &mut cpu.reg.cc);
}
0x93 => {
let addr = cpu.addr_direct(bus);
let v = bus.read_word(addr);
let u = cpu.reg.u;
alu::sub16(u, v, &mut cpu.reg.cc);
}
0xA3 => {
let (addr, ex) = cpu.addr_indexed(bus);
cpu.cycles += ex as u64;
let v = bus.read_word(addr);
let u = cpu.reg.u;
alu::sub16(u, v, &mut cpu.reg.cc);
}
0xB3 => {
let addr = cpu.addr_extended(bus);
let v = bus.read_word(addr);
let u = cpu.reg.u;
alu::sub16(u, v, &mut cpu.reg.cc);
}
0x8C => {
let v = cpu.fetch_word(bus);
let s = cpu.reg.s;
alu::sub16(s, v, &mut cpu.reg.cc);
}
0x9C => {
let addr = cpu.addr_direct(bus);
let v = bus.read_word(addr);
let s = cpu.reg.s;
alu::sub16(s, v, &mut cpu.reg.cc);
}
0xAC => {
let (addr, ex) = cpu.addr_indexed(bus);
cpu.cycles += ex as u64;
let v = bus.read_word(addr);
let s = cpu.reg.s;
alu::sub16(s, v, &mut cpu.reg.cc);
}
0xBC => {
let addr = cpu.addr_extended(bus);
let v = bus.read_word(addr);
let s = cpu.reg.s;
alu::sub16(s, v, &mut cpu.reg.cc);
}
0xC3 => {
let v = cpu.fetch_word(bus);
let u = cpu.reg.u | 0xFF00;
let _r = alu::add16(u, v, &mut cpu.reg.cc);
}
0xD3 => {
let addr = cpu.addr_direct(bus);
let v = bus.read_word(addr);
let u = cpu.reg.u | 0xFF00;
let _r = alu::add16(u, v, &mut cpu.reg.cc);
}
0xE3 => {
let (addr, ex) = cpu.addr_indexed(bus);
cpu.cycles += ex as u64;
let v = bus.read_word(addr);
let u = cpu.reg.u | 0xFF00;
let _r = alu::add16(u, v, &mut cpu.reg.cc);
}
0xF3 => {
let addr = cpu.addr_extended(bus);
let v = bus.read_word(addr);
let u = cpu.reg.u | 0xFF00;
let _r = alu::add16(u, v, &mut cpu.reg.cc);
}
_ => {
cpu.illegal = true;
}
}
}