From 178f7eec4d707a11417c490f725820f13c765a3c Mon Sep 17 00:00:00 2001 From: Kevin Ferrare Date: Tue, 23 Jan 2024 11:08:25 +0100 Subject: [PATCH] Add back Interrupt handler generation for overridden code. Without this, any interrupt fails because handler cannot be found. --- .../ReverseEngineer/CSharpOverrideHelper.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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.