module gbaid.gba.halt; import gbaid.gba.io; import gbaid.gba.cpu; public class HaltHandler { private ARM7TDMI processor; private bool softwareHalted = false, dmaHalted = false; public this(IoRegisters* ioRegisters, ARM7TDMI processor) { this.processor = processor; ioRegisters.mapAddress(0x300, null, 0b1, 15).preWriteMonitor(&onHaltRequestPreWrite); } public void irqTriggered() { softwareHalted = false; updateState(); } public void dmaHalt(bool state) { dmaHalted = state; updateState(); } private void updateState() { processor.halt(softwareHalted || dmaHalted); } private bool onHaltRequestPreWrite(int mask, ref int haltMode) { if (haltMode) { // TODO: implement stop throw new Error("Stop unimplemented"); } else { softwareHalted = true; updateState(); } return true; } }