diff --git a/src/Spice86.Core/Emulator/ReverseEngineer/CSharpOverrideHelper.cs b/src/Spice86.Core/Emulator/ReverseEngineer/CSharpOverrideHelper.cs index ac35451db..5d798865a 100644 --- a/src/Spice86.Core/Emulator/ReverseEngineer/CSharpOverrideHelper.cs +++ b/src/Spice86.Core/Emulator/ReverseEngineer/CSharpOverrideHelper.cs @@ -704,6 +704,25 @@ public void CheckExternalEvents(ushort expectedReturnCs, ushort expectedReturnIp public void Interrupt(byte vectorNumber) { Machine.CallbackHandler.RunFromOverriden(vectorNumber); } + + /// + /// Defines C# functions for provided interrupt handlers so that when overriden code generates an interrupt, an override for it is found and executed. + /// Does not currently handle mouse code which has more than a callback + iret. + /// + public void SetProvidedInterruptHandlersAsOverridden() { + InterruptVectorTable ivt = new InterruptVectorTable(Memory); + for (byte i = 0; i < 0xFF; i++) { + SegmentedAddress handlerAddress = ivt[i]; + if (handlerAddress.Segment == 0 && handlerAddress.Offset == 0) { + continue; + } + int callback = i; + DefineFunction(handlerAddress.Segment, handlerAddress.Offset, (offset) => { + Machine.CallbackHandler.RunFromOverriden(callback); + return InterruptRet(); + }, false, $"provided_interrupt_handler_{ConvertUtils.ToHex(i)}"); + } + } /// /// Halt the program.