diff --git a/src/emulator/main.rs b/src/emulator/main.rs index f123e6c..e721ae0 100644 --- a/src/emulator/main.rs +++ b/src/emulator/main.rs @@ -18,6 +18,9 @@ pub struct EmulatorState { sp: u16, /// Memory pointer pc: u16, + /// Enable interrupts + ei: bool, + /// Memory map 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() { let mut state = EmulatorState { a: 0, @@ -98,6 +116,7 @@ fn main() { sp: 0, cc: ConditionCodes { z: true, s: true, p: true, c: true }, pc: 0, + ei: true, memory: [0; 8000], }; @@ -140,7 +159,18 @@ fn tick(state: &mut EmulatorState) { 0x88..=0x8f => arithmetic::adc(register_from_num(instruction & 0xf), state), // ADC 0xc6 => arithmetic::adi(next_byte(), state), // ADI 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;