From 3b0f6bfda84ea926bda513cc1ad6ea60dee53c3b Mon Sep 17 00:00:00 2001 From: Ulf Wohlers Date: Sat, 5 Jul 2003 14:05:05 +0000 Subject: [PATCH] Added CALLBACK_SetupAt Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1080 --- include/callback.h | 1 + src/cpu/callback.cpp | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/include/callback.h b/include/callback.h index 065dd9b5..ff4f5835 100644 --- a/include/callback.h +++ b/include/callback.h @@ -47,6 +47,7 @@ void CALLBACK_RunRealInt(Bit8u intnum); void CALLBACK_RunRealFar(Bit16u seg,Bit16u off); bool CALLBACK_Setup(Bitu callback,CallBack_Handler handler,Bitu type); +bool CALLBACK_SetupAt(Bitu callback,CallBack_Handler handler,Bitu type,Bitu linearAddress); bool CALLBACK_Free(Bitu callback); diff --git a/src/cpu/callback.cpp b/src/cpu/callback.cpp index cf8b77cf..fe649d03 100644 --- a/src/cpu/callback.cpp +++ b/src/cpu/callback.cpp @@ -148,6 +148,35 @@ bool CALLBACK_Setup(Bitu callback,CallBack_Handler handler,Bitu type) { return true; } +bool CALLBACK_SetupAt(Bitu callback,CallBack_Handler handler,Bitu type,Bitu linearAddress) { + if (callback>=CB_MAX) return false; + switch (type) { + case CB_RETF: + mem_writeb(linearAddress+0,(Bit8u)0xFE); //GRP 4 + mem_writeb(linearAddress+1,(Bit8u)0x38); //Extra Callback instruction + mem_writew(linearAddress+2, callback); //The immediate word + mem_writeb(linearAddress+4,(Bit8u)0xCB); //A RETF Instruction + break; + case CB_IRET: + mem_writeb(linearAddress+0,(Bit8u)0xFE); //GRP 4 + mem_writeb(linearAddress+1,(Bit8u)0x38); //Extra Callback instruction + mem_writew(linearAddress+2,callback); //The immediate word + mem_writeb(linearAddress+4,(Bit8u)0xCF); //An IRET Instruction + break; + case CB_IRET_STI: + mem_writeb(linearAddress+0,(Bit8u)0xFB); //STI + mem_writeb(linearAddress+1,(Bit8u)0xFE); //GRP 4 + mem_writeb(linearAddress+2,(Bit8u)0x38); //Extra Callback instruction + mem_writew(linearAddress+3, callback); //The immediate word + mem_writeb(linearAddress+5,(Bit8u)0xCF); //An IRET Instruction + break; + default: + E_Exit("CALLBACK:Setup:Illegal type %d",type); + } + CallBack_Handlers[callback]=handler; + return true; +} + void CALLBACK_Init(Section* sec) { Bitu i; for (i=0;i