use asmachina::{MachineW};
#[test]
fn test_interrupt_disable_enable() {
let mut machine = MachineW::new();
machine.interrupts_enabled = true;
let dns_instruction = (0b01000 << 11) | 0;
machine.memory[0] = dns_instruction;
machine.l = 0;
machine.is_running = true;
assert!(machine.step().is_ok());
assert_eq!(machine.interrupts_enabled, false);
}
#[test]
fn test_interrupt_mask_operations() {
let mut machine = MachineW::new();
let msk_instruction = (0b01100 << 11) | 0xFF; machine.memory[0] = msk_instruction;
machine.l = 0;
machine.is_running = true;
assert!(machine.step().is_ok());
assert_eq!(machine.interrupt_mask, 0xFF);
let czm_instruction = (0b01011 << 11) | 0;
machine.memory[1] = czm_instruction;
machine.l = 1;
assert!(machine.step().is_ok());
assert_eq!(machine.interrupt_mask, 0);
}
#[test]
fn test_interrupt_handling() {
let mut machine = MachineW::new();
machine.memory[0] = (0b00001 << 11) | 10; machine.memory[1] = (0b00111 << 11) | 0;
machine.memory[100] = (0b00001 << 11) | 20; machine.memory[101] = (0b01101 << 11) | 0;
machine.memory[10] = 5; machine.memory[20] = 15;
machine.l = 0;
machine.ak = 10;
machine.is_running = true;
machine.trigger_interrupt(100);
let initial_ws = machine.ws;
assert!(machine.step().is_ok());
assert_eq!(machine.l, 100); assert_eq!(machine.interrupts_enabled, false); assert_eq!(machine.ws, initial_ws - 2);
assert_eq!(machine.memory[(initial_ws - 1) as usize], 0); assert_eq!(machine.memory[initial_ws as usize], 10);
assert!(machine.step().is_ok()); assert_eq!(machine.ak, 25); assert_eq!(machine.l, 101);
assert!(machine.step().is_ok()); assert_eq!(machine.interrupts_enabled, true); assert_eq!(machine.ws, initial_ws); assert_eq!(machine.l, 0); assert_eq!(machine.ak, 10);
assert!(machine.step().is_ok()); assert_eq!(machine.ak, 15); assert_eq!(machine.l, 1); }