[NTVDM]: Initialize only the interrupt vectors that we really need, and nothing else. I also include a (by default disabled) option that activates extended debug features that may break some DOS apps (for example, initializing ALL of the non-handled interrupts to a default vector), to be used at your own risk.

svn path=/trunk/; revision=67594
This commit is contained in:
Hermès Bélusca-Maïto
2015-05-07 23:11:32 +00:00
parent e37ae6f6bd
commit 226f484ce6
2 changed files with 58 additions and 16 deletions
@@ -528,37 +528,72 @@ static VOID InitializeBiosInt32(VOID)
/* Initialize the callback context */
InitializeContext(&BiosContext, BIOS_SEGMENT, 0x0000);
/* Register the default BIOS 32-bit Interrupts */
for (i = 0x00; i <= 0xFF; i++)
{
RegisterBiosInt32(i, NULL);
}
/* Register the default BIOS interrupt vectors */
/* Initialize the exception vector interrupts to a default Exception handler */
for (i = 0; i < 8; i++)
/* Zero out all of the IVT (0x00 -- 0xFF) */
RtlZeroMemory(BaseAddress, 0x0100 * sizeof(ULONG));
#ifdef ADVANCED_DEBUGGING
// Initialize all the interrupt vectors to the default one.
for (i = 0x00; i <= 0xFF; i++)
RegisterBiosInt32(i, NULL);
#endif
/* Initialize the exception interrupt vectors to a default Exception handler */
for (i = 0x00; i <= 0x07; i++)
RegisterBiosInt32(i, BiosException);
/* Initialize HW vector interrupts to a default HW handler */
for (i = BIOS_PIC_MASTER_INT; i < BIOS_PIC_MASTER_INT + 8; i++)
/* Initialize HW interrupt vectors to a default HW handler */
for (i = BIOS_PIC_MASTER_INT; i < BIOS_PIC_MASTER_INT + 8; i++) // 0x08 -- 0x0F
RegisterBiosInt32(i, BiosHandleMasterPicIRQ);
for (i = BIOS_PIC_SLAVE_INT ; i < BIOS_PIC_SLAVE_INT + 8; i++)
for (i = BIOS_PIC_SLAVE_INT ; i < BIOS_PIC_SLAVE_INT + 8; i++) // 0x70 -- 0x77
RegisterBiosInt32(i, BiosHandleSlavePicIRQ);
/* Initialize software vector handlers */
// BIOS_VIDEO_INTERRUPT : 0x10 (vidbios32.c)
RegisterBiosInt32(BIOS_EQUIPMENT_INTERRUPT, BiosEquipmentService );
RegisterBiosInt32(BIOS_MEMORY_SIZE , BiosGetMemorySize );
// BIOS_DISK_INTERRUPT : 0x13 -- UNIMPLEMENTED
// BIOS_SERIAL_INTERRUPT : 0x14 -- UNIMPLEMENTED
RegisterBiosInt32(BIOS_MISC_INTERRUPT , BiosMiscService );
// BIOS_KBD_INTERRUPT : 0x16 (kbdbios32.c)
// BIOS_PRINTER_INTERRUPT: 0x17 -- UNIMPLEMENTED
RegisterBiosInt32(BIOS_ROM_BASIC , BiosRomBasic );
RegisterBiosInt32(BIOS_BOOTSTRAP_LOADER , BiosBootstrapLoader );
RegisterBiosInt32(BIOS_TIME_INTERRUPT , BiosTimeService );
// BIOS_KBD_CTRL_BREAK_INTERRUPT: 0x1B -- UNIMPLEMENTED
RegisterBiosInt32(BIOS_SYS_TIMER_INTERRUPT, BiosSystemTimerInterrupt);
/* Some interrupts are in fact addresses to tables */
((PULONG)BaseAddress)[0x1E] = (ULONG)NULL;
((PULONG)BaseAddress)[0x41] = (ULONG)NULL;
((PULONG)BaseAddress)[0x46] = (ULONG)NULL;
((PULONG)BaseAddress)[0x48] = (ULONG)NULL;
((PULONG)BaseAddress)[0x49] = (ULONG)NULL;
/* Vectors that should be implemented (see above) */
RegisterBiosInt32(0x13, NULL);
RegisterBiosInt32(0x14, NULL);
RegisterBiosInt32(0x17, NULL);
RegisterBiosInt32(0x1B, NULL);
RegisterBiosInt32(0x4A, NULL); // User Alarm Handler
RegisterBiosInt32(0x6D, NULL); // Video BIOS Entry Point
/* Relocated services by the BIOS (when needed) */
RegisterBiosInt32(0x40, NULL); // ROM BIOS Diskette Handler relocated by Hard Disk BIOS
RegisterBiosInt32(0x42, NULL); // Relocated Default INT 10h Video Services
/* Miscellaneous unimplemented vector handlers that should better have a default one */
RegisterBiosInt32(0x4B, NULL); // Virtual DMA Specification Services
RegisterBiosInt32(0x5C, NULL); // NetBIOS
// ROM-BASIC interrupts span from 0x80 up to 0xEF.
// They don't have any default handler at the moment.
/* Some vectors are in fact addresses to tables */
((PULONG)BaseAddress)[0x1D] = (ULONG)NULL; // Video Parameter Tables
((PULONG)BaseAddress)[0x1E] = (ULONG)NULL; // Diskette Parameters
((PULONG)BaseAddress)[0x1F] = (ULONG)NULL; // 8x8 Graphics Font
((PULONG)BaseAddress)[0x41] = (ULONG)NULL; // Hard Disk 0 Parameter Table Address
((PULONG)BaseAddress)[0x43] = (ULONG)NULL; // Character Table (EGA, MCGA, VGA)
((PULONG)BaseAddress)[0x46] = (ULONG)NULL; // Hard Disk 1 Drive Parameter Table Address
/* Tables that are always uninitialized */
((PULONG)BaseAddress)[0x44] = (ULONG)NULL; // ROM BIOS Character Font, Characters 00h-7Fh (PCjr)
((PULONG)BaseAddress)[0x48] = (ULONG)NULL; // Cordless Keyboard Translation (PCjr)
((PULONG)BaseAddress)[0x49] = (ULONG)NULL; // Non-Keyboard Scan-code Translation Table (PCJr)
}
static VOID InitializeBiosData(VOID)
+7
View File
@@ -52,6 +52,13 @@ DWORD WINAPI SetLastConsoleEventActive(VOID);
*/
// #define WIN2K_COMPLIANT
/*
* Activate this line if you want advanced hardcoded debug facilities
* (called interrupts, etc...), that break PC-AT compatibility.
* USE AT YOUR OWN RISK! (disabled by default)
*/
// #define ADVANCED_DEBUGGING
/* FUNCTIONS ******************************************************************/
extern HANDLE VdmTaskEvent;