[NTVDM]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Mon, 11 Nov 2013 02:27:29 +0000 (02:27 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Mon, 11 Nov 2013 02:27:29 +0000 (02:27 +0000)
To make debugging easier, put the interrupt handlers at offset 0x1000,
and reserve 16 bytes for each. Also, move the common stub to offset
0x2000. That way the entry point of, for example, INT 0x21 is at
F000:1210.

svn path=/branches/ntvdm/; revision=60933

subsystems/ntvdm/int32.c
subsystems/ntvdm/int32.h

index 96a0b77..5372097 100644 (file)
@@ -131,11 +131,31 @@ VOID WINAPI InitializeInt32(WORD BiosSegment)
     LPDWORD IntVecTable = (LPDWORD)BaseAddress;
     LPBYTE  BiosCode    = (LPBYTE)SEG_OFF_TO_PTR(BiosSegment, 0);
     USHORT i;
     LPDWORD IntVecTable = (LPDWORD)BaseAddress;
     LPBYTE  BiosCode    = (LPBYTE)SEG_OFF_TO_PTR(BiosSegment, 0);
     USHORT i;
-    WORD CommonStub, BopSeqOffset, Offset;
+    WORD BopSeqOffset, Offset = 0;
 
 
-    CommonStub = Offset = 0;
+    /* Generate ISR stubs and fill the IVT */
+    for (i = 0x00; i <= 0xFF; i++)
+    {
+        Offset = INT_HANDLER_OFFSET + (i << 4);
+        IntVecTable[i] = MAKELONG(Offset, BiosSegment);
+
+        BiosCode[Offset++] = 0xFA; // cli
+
+        BiosCode[Offset++] = 0x6A; // push i
+        BiosCode[Offset++] = (UCHAR)i;
+
+        BiosCode[Offset++] = 0x6A; // push 0
+        BiosCode[Offset++] = 0x00;
+
+        BopSeqOffset = COMMON_STUB_OFFSET - (Offset + 3);
+
+        BiosCode[Offset++] = 0xE9; // jmp near BOP_SEQ
+        BiosCode[Offset++] = LOBYTE(BopSeqOffset);
+        BiosCode[Offset++] = HIBYTE(BopSeqOffset);
+    }
 
     /* Write the common stub code */
 
     /* Write the common stub code */
+    Offset = COMMON_STUB_OFFSET;
 
 // BOP_SEQ:
     BiosCode[Offset++] = 0xF8; // clc
 
 // BOP_SEQ:
     BiosCode[Offset++] = 0xF8; // clc
@@ -162,26 +182,6 @@ VOID WINAPI InitializeInt32(WORD BiosSegment)
     BiosCode[Offset++] = 0x04;
 
     BiosCode[Offset++] = 0xCF; // iret
     BiosCode[Offset++] = 0x04;
 
     BiosCode[Offset++] = 0xCF; // iret
-
-    /* Generate ISR stubs and fill the IVT */
-    for (i = 0x00; i <= 0xFF; i++)
-    {
-        IntVecTable[i] = MAKELONG(Offset, BiosSegment);
-
-        BiosCode[Offset++] = 0xFA; // cli
-
-        BiosCode[Offset++] = 0x6A; // push i
-        BiosCode[Offset++] = (UCHAR)i;
-
-        BiosCode[Offset++] = 0x6A; // push 0
-        BiosCode[Offset++] = 0x00;
-
-        BopSeqOffset = CommonStub - (Offset + 3);
-
-        BiosCode[Offset++] = 0xE9; // jmp near BOP_SEQ
-        BiosCode[Offset++] = LOBYTE(BopSeqOffset);
-        BiosCode[Offset++] = HIBYTE(BopSeqOffset);
-    }
 }
 
 VOID WINAPI RegisterInt32(BYTE IntNumber, EMULATOR_INT32_PROC IntHandler)
 }
 
 VOID WINAPI RegisterInt32(BYTE IntNumber, EMULATOR_INT32_PROC IntHandler)
index 0738b0d..ed6a840 100644 (file)
@@ -18,6 +18,9 @@
 /* 32-bit Interrupt Identifiers */
 #define EMULATOR_MAX_INT32_NUM  0xFF + 1
 
 /* 32-bit Interrupt Identifiers */
 #define EMULATOR_MAX_INT32_NUM  0xFF + 1
 
+#define INT_HANDLER_OFFSET 0x1000
+#define COMMON_STUB_OFFSET 0x2000
+
 /* FUNCTIONS ******************************************************************/
 
 typedef VOID (WINAPI *EMULATOR_INT32_PROC)(LPWORD Stack);
 /* FUNCTIONS ******************************************************************/
 
 typedef VOID (WINAPI *EMULATOR_INT32_PROC)(LPWORD Stack);