forked from Lea/invadeez
add EI, DI, HLT
This commit is contained in:
parent
1398de8181
commit
1f98c57eb0
|
@ -18,6 +18,9 @@ pub struct EmulatorState {
|
||||||
sp: u16,
|
sp: u16,
|
||||||
/// Memory pointer
|
/// Memory pointer
|
||||||
pc: u16,
|
pc: u16,
|
||||||
|
/// Enable interrupts
|
||||||
|
ei: bool,
|
||||||
|
/// Memory map
|
||||||
memory: [u8; 8000],
|
memory: [u8; 8000],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,6 +89,21 @@ fn set_register(register: Register, value: u8, state: &mut EmulatorState) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Print values of registers and flags to stdout
|
||||||
|
fn print_state(state: &EmulatorState) {
|
||||||
|
// State
|
||||||
|
println!("\nsp\tpc\tei");
|
||||||
|
println!("{}\t{}\t{}", state.sp, state.pc, state.ei);
|
||||||
|
|
||||||
|
// Registers
|
||||||
|
println!("\nB\tC\tD\tE\tH\tL\tA");
|
||||||
|
println!("{}\t{}\t{}\t{}\t{}\t{}\t{}", state.b, state.c, state.d, state.e, state.h, state.l, state.a);
|
||||||
|
|
||||||
|
// Flags
|
||||||
|
println!("\nz\ts\tp\tc");
|
||||||
|
println!("{}\t{}\t{}\t{}", state.cc.z, state.cc.s, state.cc.p, state.cc.c);
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mut state = EmulatorState {
|
let mut state = EmulatorState {
|
||||||
a: 0,
|
a: 0,
|
||||||
|
@ -98,6 +116,7 @@ fn main() {
|
||||||
sp: 0,
|
sp: 0,
|
||||||
cc: ConditionCodes { z: true, s: true, p: true, c: true },
|
cc: ConditionCodes { z: true, s: true, p: true, c: true },
|
||||||
pc: 0,
|
pc: 0,
|
||||||
|
ei: true,
|
||||||
memory: [0; 8000],
|
memory: [0; 8000],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -140,7 +159,18 @@ fn tick(state: &mut EmulatorState) {
|
||||||
0x88..=0x8f => arithmetic::adc(register_from_num(instruction & 0xf), state), // ADC
|
0x88..=0x8f => arithmetic::adc(register_from_num(instruction & 0xf), state), // ADC
|
||||||
0xc6 => arithmetic::adi(next_byte(), state), // ADI
|
0xc6 => arithmetic::adi(next_byte(), state), // ADI
|
||||||
0xce => arithmetic::aci(next_byte(), state), // ACI
|
0xce => arithmetic::aci(next_byte(), state), // ACI
|
||||||
_ => not_implemented(state),
|
|
||||||
|
|
||||||
|
/* Special */
|
||||||
|
0xfb => state.ei = true, // EI
|
||||||
|
0xf3 => state.ei = false, // DI
|
||||||
|
0x76 => if state.ei { todo!() } else { // HLT
|
||||||
|
println!("HLT called after DI; exiting.");
|
||||||
|
print_state(state);
|
||||||
|
std::process::exit(0);
|
||||||
|
},
|
||||||
|
|
||||||
|
_ => not_implemented(state),
|
||||||
}
|
}
|
||||||
|
|
||||||
state.pc += 1;
|
state.pc += 1;
|
||||||
|
|
Loading…
Reference in a new issue