Since the BIOS registers the whole range of possible interrupts, we register their stubs in an array-form so that the BIOS always registers INT n at the same place. We save 561 bytes of memory.

svn path=/trunk/; revision=63366
This commit is contained in:
Hermès Bélusca-Maïto 2014-05-19 01:12:25 +00:00
parent 65a58c440e
commit de36490031
5 changed files with 16 additions and 19 deletions

View file

@ -301,18 +301,14 @@ static VOID BiosHwSetup(VOID)
static VOID InitializeBiosInt32(VOID) static VOID InitializeBiosInt32(VOID)
{ {
USHORT i; USHORT i;
// USHORT Offset = 0;
/* Initialize the callback context */ /* Initialize the callback context */
InitializeContext(&BiosContext, BIOS_SEGMENT, 0x0000); InitializeContext(&BiosContext, BIOS_SEGMENT, 0x0000);
/* Register the BIOS 32-bit Interrupts */ /* Register the default BIOS 32-bit Interrupts */
for (i = 0x00; i <= 0xFF; i++) for (i = 0x00; i <= 0xFF; i++)
{ {
// Offset += RegisterInt32(MAKELONG(Offset, BIOS_SEGMENT), i, NULL, NULL); RegisterBiosInt32(i, NULL);
BiosContext.NextOffset += RegisterInt32(MAKELONG(BiosContext.NextOffset,
BiosContext.Segment),
i, NULL, NULL);
} }
/* Initialize the exception vector interrupts to a default Exception handler */ /* Initialize the exception vector interrupts to a default Exception handler */

View file

@ -30,11 +30,12 @@
/* FUNCTIONS ******************************************************************/ /* FUNCTIONS ******************************************************************/
extern CALLBACK16 BiosContext; extern CALLBACK16 BiosContext;
#define RegisterBiosInt32(IntNumber, IntHandler) \ #define RegisterBiosInt32(IntNumber, IntHandler) \
do { \ do { \
BiosContext.NextOffset += RegisterInt32(MAKELONG(BiosContext.NextOffset, \ RegisterInt32(BiosContext.TrampolineFarPtr + \
BiosContext.Segment), \ BiosContext.TrampolineSize + \
(IntNumber), (IntHandler), NULL); \ (IntNumber) * Int16To32StubSize, \
(IntNumber), (IntHandler), NULL); \
} while(0); } while(0);
VOID EnableHwIRQ(UCHAR hwirq, EMULATOR_INT32_PROC func); VOID EnableHwIRQ(UCHAR hwirq, EMULATOR_INT32_PROC func);

View file

@ -19,7 +19,7 @@
/* /*
* This is the list of registered BOP handlers. * This is the list of registered BOP handlers.
*/ */
EMULATOR_BOP_PROC BopProc[EMULATOR_MAX_BOP_NUM] = { NULL }; static EMULATOR_BOP_PROC BopProc[EMULATOR_MAX_BOP_NUM] = { NULL };
/* PUBLIC FUNCTIONS ***********************************************************/ /* PUBLIC FUNCTIONS ***********************************************************/

View file

@ -22,7 +22,7 @@
/* /*
* This is the list of registered 32-bit Interrupt handlers. * This is the list of registered 32-bit Interrupt handlers.
*/ */
EMULATOR_INT32_PROC Int32Proc[EMULATOR_MAX_INT32_NUM] = { NULL }; static EMULATOR_INT32_PROC Int32Proc[EMULATOR_MAX_INT32_NUM] = { NULL };
/* BOP Identifiers */ /* BOP Identifiers */
#define BOP_CONTROL 0xFF // Control BOP Handler #define BOP_CONTROL 0xFF // Control BOP Handler
@ -50,7 +50,7 @@ do { \
// //
/* 16-bit generic interrupt code for calling a 32-bit interrupt handler */ /* 16-bit generic interrupt code for calling a 32-bit interrupt handler */
BYTE Int16To32[] = static BYTE Int16To32[] =
{ {
0xFA, // cli 0xFA, // cli
@ -76,6 +76,7 @@ BYTE Int16To32[] =
0x44, 0x44, // inc sp, inc sp 0x44, 0x44, // inc sp, inc sp
0xCF, // iret 0xCF, // iret
}; };
const ULONG Int16To32StubSize = sizeof(Int16To32);
/* PUBLIC FUNCTIONS ***********************************************************/ /* PUBLIC FUNCTIONS ***********************************************************/
@ -85,9 +86,10 @@ InitializeContext(IN PCALLBACK16 Context,
IN USHORT Offset) IN USHORT Offset)
{ {
Context->TrampolineFarPtr = MAKELONG(Offset, Segment); Context->TrampolineFarPtr = MAKELONG(Offset, Segment);
Context->TrampolineSize = max(CALL16_TRAMPOLINE_SIZE,
INT16_TRAMPOLINE_SIZE);
Context->Segment = Segment; Context->Segment = Segment;
Context->NextOffset = Offset + max(CALL16_TRAMPOLINE_SIZE, Context->NextOffset = Offset + Context->TrampolineSize;
INT16_TRAMPOLINE_SIZE);
} }
VOID VOID

View file

@ -15,17 +15,15 @@
/* 32-bit Interrupt Identifiers */ /* 32-bit Interrupt Identifiers */
#define EMULATOR_MAX_INT32_NUM 0xFF + 1 #define EMULATOR_MAX_INT32_NUM 0xFF + 1
#define INT_HANDLER_OFFSET 0x1000
#define COMMON_STUB_OFFSET 0x2000
typedef struct _CALLBACK16 typedef struct _CALLBACK16
{ {
ULONG TrampolineFarPtr; // Where the trampoline zone is placed ULONG TrampolineFarPtr; // Where the trampoline zone is placed
ULONG TrampolineSize; // Size of the trampoline zone
USHORT Segment; USHORT Segment;
USHORT NextOffset; USHORT NextOffset;
} CALLBACK16, *PCALLBACK16; } CALLBACK16, *PCALLBACK16;
extern const ULONG Int16To32StubSize;
/* FUNCTIONS ******************************************************************/ /* FUNCTIONS ******************************************************************/