Author: hbelusca Date: Sun Dec 15 16:30:28 2013 New Revision: 61278
URL: http://svn.reactos.org/svn/reactos?rev=61278&view=rev Log: [NTVDM] - As already done for interrupts and I/O ports, add a registering system for BOPs. - INT32: Move ControlBop to the 32-bit interrupts module where it is used only. - DOS: Add (un)documented BOP_DOS (0x50) and BOP_CMD(0x54) used respectively by NTIO.SYS/NTDOS.SYS and by COMMAND.COM. It appears that they take an extra parameter (so, skip 1 byte-instruction after the BOP instruction as we do for the Control BOP 0xFF). See "Undocumented DOS 2nd edition" by Schulman et al., page 267.
Modified: branches/ntvdm/subsystems/ntvdm/bop.c branches/ntvdm/subsystems/ntvdm/bop.h branches/ntvdm/subsystems/ntvdm/dos.c branches/ntvdm/subsystems/ntvdm/int32.c branches/ntvdm/subsystems/ntvdm/int32.h
Modified: branches/ntvdm/subsystems/ntvdm/bop.c URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/ntvdm/bop.c?rev... ============================================================================== --- branches/ntvdm/subsystems/ntvdm/bop.c [iso-8859-1] (original) +++ branches/ntvdm/subsystems/ntvdm/bop.c [iso-8859-1] Sun Dec 15 16:30:28 2013 @@ -14,286 +14,18 @@ #include "emulator.h" #include "bop.h"
-#include "int32.h" -#include "registers.h" - /* PRIVATE VARIABLES **********************************************************/
/* * This is the list of registered BOP handlers. */ -EMULATOR_BOP_PROC BopProc[EMULATOR_MAX_BOP_NUM] = -{ - NULL, // 0x00 - NULL, // 0x01 - NULL, // 0x02 - NULL, // 0x03 - NULL, // 0x04 - NULL, // 0x05 - NULL, // 0x06 - NULL, // 0x07 - NULL, // 0x08 - NULL, // 0x09 - NULL, // 0x0A - NULL, // 0x0B - NULL, // 0x0C - NULL, // 0x0D - NULL, // 0x0E - NULL, // 0x0F - NULL, // 0x10 - NULL, // 0x11 - NULL, // 0x12 - NULL, // 0x13 - NULL, // 0x14 - NULL, // 0x15 - NULL, // 0x16 - NULL, // 0x17 - NULL, // 0x18 - NULL, // 0x19 - NULL, // 0x1A - NULL, // 0x1B - NULL, // 0x1C - NULL, // 0x1D - NULL, // 0x1E - NULL, // 0x1F - NULL, // 0x20 - NULL, // 0x21 - NULL, // 0x22 - NULL, // 0x23 - NULL, // 0x24 - NULL, // 0x25 - NULL, // 0x26 - NULL, // 0x27 - NULL, // 0x28 - NULL, // 0x29 - NULL, // 0x2A - NULL, // 0x2B - NULL, // 0x2C - NULL, // 0x2D - NULL, // 0x2E - NULL, // 0x2F - NULL, // 0x30 - NULL, // 0x31 - NULL, // 0x32 - NULL, // 0x33 - NULL, // 0x34 - NULL, // 0x35 - NULL, // 0x36 - NULL, // 0x37 - NULL, // 0x38 - NULL, // 0x39 - NULL, // 0x3A - NULL, // 0x3B - NULL, // 0x3C - NULL, // 0x3D - NULL, // 0x3E - NULL, // 0x3F - NULL, // 0x40 - NULL, // 0x41 - NULL, // 0x42 - NULL, // 0x43 - NULL, // 0x44 - NULL, // 0x45 - NULL, // 0x46 - NULL, // 0x47 - NULL, // 0x48 - NULL, // 0x49 - NULL, // 0x4A - NULL, // 0x4B - NULL, // 0x4C - NULL, // 0x4D - NULL, // 0x4E - NULL, // 0x4F - NULL, // 0x50 - NULL, // 0x51 - NULL, // 0x52 - NULL, // 0x53 - NULL, // 0x54 - NULL, // 0x55 - NULL, // 0x56 - NULL, // 0x57 - NULL, // 0x58 - NULL, // 0x59 - NULL, // 0x5A - NULL, // 0x5B - NULL, // 0x5C - NULL, // 0x5D - NULL, // 0x5E - NULL, // 0x5F - NULL, // 0x60 - NULL, // 0x61 - NULL, // 0x62 - NULL, // 0x63 - NULL, // 0x64 - NULL, // 0x65 - NULL, // 0x66 - NULL, // 0x67 - NULL, // 0x68 - NULL, // 0x69 - NULL, // 0x6A - NULL, // 0x6B - NULL, // 0x6C - NULL, // 0x6D - NULL, // 0x6E - NULL, // 0x6F - NULL, // 0x70 - NULL, // 0x71 - NULL, // 0x72 - NULL, // 0x73 - NULL, // 0x74 - NULL, // 0x75 - NULL, // 0x76 - NULL, // 0x77 - NULL, // 0x78 - NULL, // 0x79 - NULL, // 0x7A - NULL, // 0x7B - NULL, // 0x7C - NULL, // 0x7D - NULL, // 0x7E - NULL, // 0x7F - NULL, // 0x80 - NULL, // 0x81 - NULL, // 0x82 - NULL, // 0x83 - NULL, // 0x84 - NULL, // 0x85 - NULL, // 0x86 - NULL, // 0x87 - NULL, // 0x88 - NULL, // 0x89 - NULL, // 0x8A - NULL, // 0x8B - NULL, // 0x8C - NULL, // 0x8D - NULL, // 0x8E - NULL, // 0x8F - NULL, // 0x90 - NULL, // 0x91 - NULL, // 0x92 - NULL, // 0x93 - NULL, // 0x94 - NULL, // 0x95 - NULL, // 0x96 - NULL, // 0x97 - NULL, // 0x98 - NULL, // 0x99 - NULL, // 0x9A - NULL, // 0x9B - NULL, // 0x9C - NULL, // 0x9D - NULL, // 0x9E - NULL, // 0x9F - NULL, // 0xA0 - NULL, // 0xA1 - NULL, // 0xA2 - NULL, // 0xA3 - NULL, // 0xA4 - NULL, // 0xA5 - NULL, // 0xA6 - NULL, // 0xA7 - NULL, // 0xA8 - NULL, // 0xA9 - NULL, // 0xAA - NULL, // 0xAB - NULL, // 0xAC - NULL, // 0xAD - NULL, // 0xAE - NULL, // 0xAF - NULL, // 0xB0 - NULL, // 0xB1 - NULL, // 0xB2 - NULL, // 0xB3 - NULL, // 0xB4 - NULL, // 0xB5 - NULL, // 0xB6 - NULL, // 0xB7 - NULL, // 0xB8 - NULL, // 0xB9 - NULL, // 0xBA - NULL, // 0xBB - NULL, // 0xBC - NULL, // 0xBD - NULL, // 0xBE - NULL, // 0xBF - NULL, // 0xC0 - NULL, // 0xC1 - NULL, // 0xC2 - NULL, // 0xC3 - NULL, // 0xC4 - NULL, // 0xC5 - NULL, // 0xC6 - NULL, // 0xC7 - NULL, // 0xC8 - NULL, // 0xC9 - NULL, // 0xCA - NULL, // 0xCB - NULL, // 0xCC - NULL, // 0xCD - NULL, // 0xCE - NULL, // 0xCF - NULL, // 0xD0 - NULL, // 0xD1 - NULL, // 0xD2 - NULL, // 0xD3 - NULL, // 0xD4 - NULL, // 0xD5 - NULL, // 0xD6 - NULL, // 0xD7 - NULL, // 0xD8 - NULL, // 0xD9 - NULL, // 0xDA - NULL, // 0xDB - NULL, // 0xDC - NULL, // 0xDD - NULL, // 0xDE - NULL, // 0xDF - NULL, // 0xE0 - NULL, // 0xE1 - NULL, // 0xE2 - NULL, // 0xE3 - NULL, // 0xE4 - NULL, // 0xE5 - NULL, // 0xE6 - NULL, // 0xE7 - NULL, // 0xE8 - NULL, // 0xE9 - NULL, // 0xEA - NULL, // 0xEB - NULL, // 0xEC - NULL, // 0xED - NULL, // 0xEE - NULL, // 0xEF - NULL, // 0xF0 - NULL, // 0xF1 - NULL, // 0xF2 - NULL, // 0xF3 - NULL, // 0xF4 - NULL, // 0xF5 - NULL, // 0xF6 - NULL, // 0xF7 - NULL, // 0xF8 - NULL, // 0xF9 - NULL, // 0xFA - NULL, // 0xFB - NULL, // 0xFC - NULL, // 0xFD - NULL, // 0xFE - ControlBop // 0xFF -}; +EMULATOR_BOP_PROC BopProc[EMULATOR_MAX_BOP_NUM] = { NULL };
/* PUBLIC FUNCTIONS ***********************************************************/
-VOID WINAPI ControlBop(LPWORD Stack) +VOID WINAPI RegisterBop(BYTE BopCode, EMULATOR_BOP_PROC BopHandler) { - /* Get the Function Number and skip it */ - BYTE FuncNum = *(PBYTE)SEG_OFF_TO_PTR(getCS(), getIP()); - setIP(getIP() + 1); - - if (FuncNum == CTRL_BOP_INT32) - Int32Dispatch(Stack); - else - DPRINT1("Unassigned Control BOP Function: 0x%02X\n", FuncNum); + BopProc[BopCode] = BopHandler; }
VOID WINAPI EmulatorBiosOperation(PFAST486_STATE State, UCHAR BopCode)
Modified: branches/ntvdm/subsystems/ntvdm/bop.h URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/ntvdm/bop.h?rev... ============================================================================== --- branches/ntvdm/subsystems/ntvdm/bop.h [iso-8859-1] (original) +++ branches/ntvdm/subsystems/ntvdm/bop.h [iso-8859-1] Sun Dec 15 16:30:28 2013 @@ -14,17 +14,13 @@
/* BOP Identifiers */ #define EMULATOR_BOP 0xC4C4 - -#define EMULATOR_CTRL_BOP 0xFF // Control BOP Handler - #define CTRL_BOP_DEFLT 0x00 // Default Control BOP Function - #define EMULATOR_MAX_BOP_NUM 0xFF + 1
/* FUNCTIONS ******************************************************************/
typedef VOID (WINAPI *EMULATOR_BOP_PROC)(LPWORD Stack);
-VOID WINAPI ControlBop(LPWORD Stack); +VOID WINAPI RegisterBop(BYTE BopCode, EMULATOR_BOP_PROC BopHandler); VOID WINAPI EmulatorBiosOperation(PFAST486_STATE State, UCHAR BopCode);
#endif // _BOP_H_
Modified: branches/ntvdm/subsystems/ntvdm/dos.c URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/ntvdm/dos.c?rev... ============================================================================== --- branches/ntvdm/subsystems/ntvdm/dos.c [iso-8859-1] (original) +++ branches/ntvdm/subsystems/ntvdm/dos.c [iso-8859-1] Sun Dec 15 16:30:28 2013 @@ -14,6 +14,7 @@ #include "dos.h"
#include "bios.h" +#include "bop.h" #include "int32.h" #include "registers.h"
@@ -30,6 +31,10 @@ static BYTE DosAllocStrategy = DOS_ALLOC_BEST_FIT; static BOOLEAN DosUmbLinked = FALSE; static WORD DosErrorLevel = 0x0000; + +/* BOP Identifiers */ +#define BOP_DOS 0x50 // DOS System BOP (for NTIO.SYS and NTDOS.SYS) +#define BOP_CMD 0x54 // DOS Command Interpreter BOP (for COMMAND.COM)
/* PRIVATE FUNCTIONS **********************************************************/
@@ -1402,6 +1407,24 @@ } }
+VOID WINAPI DosSystemBop(LPWORD Stack) +{ + /* Get the Function Number and skip it */ + BYTE FuncNum = *(PBYTE)SEG_OFF_TO_PTR(getCS(), getIP()); + setIP(getIP() + 1); + + DPRINT1("Unknown DOS System BOP Function: 0x%02X\n", FuncNum); +} + +VOID WINAPI DosCmdInterpreterBop(LPWORD Stack) +{ + /* Get the Function Number and skip it */ + BYTE FuncNum = *(PBYTE)SEG_OFF_TO_PTR(getCS(), getIP()); + setIP(getIP() + 1); + + DPRINT1("Unknown DOS CMD Interpreter BOP Function: 0x%02X\n", FuncNum); +} + VOID WINAPI DosInt20h(LPWORD Stack) { /* This is the exit interrupt */ @@ -2628,6 +2651,10 @@ DosSystemFileTable[1] = GetStdHandle(STD_OUTPUT_HANDLE); DosSystemFileTable[2] = GetStdHandle(STD_ERROR_HANDLE);
+ /* Register the DOS BOPs */ + RegisterBop(BOP_DOS, DosSystemBop ); + RegisterBop(BOP_CMD, DosCmdInterpreterBop); + /* Register the DOS 32-bit Interrupts */ RegisterInt32(0x20, DosInt20h ); RegisterInt32(0x21, DosInt21h );
Modified: branches/ntvdm/subsystems/ntvdm/int32.c URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/ntvdm/int32.c?r... ============================================================================== --- branches/ntvdm/subsystems/ntvdm/int32.c [iso-8859-1] (original) +++ branches/ntvdm/subsystems/ntvdm/int32.c [iso-8859-1] Sun Dec 15 16:30:28 2013 @@ -36,6 +36,13 @@ * This is the list of registered 32-bit Interrupt handlers. */ EMULATOR_INT32_PROC Int32Proc[EMULATOR_MAX_INT32_NUM] = { NULL }; + +/* BOP Identifiers */ +#define BOP_CONTROL 0xFF // Control BOP Handler + #define BOP_CONTROL_DEFFUNC 0x00 // Default Control BOP Function + +/* 32-bit Interrupt dispatcher function code for the Control BOP Handler */ +#define BOP_CONTROL_INT32 0xFF
/* PUBLIC FUNCTIONS ***********************************************************/
@@ -127,6 +134,18 @@ DPRINT1("Unhandled 32-bit interrupt: 0x%02X, AX = 0x%04X\n", IntNum, getAX()); }
+VOID WINAPI ControlBop(LPWORD Stack) +{ + /* Get the Function Number and skip it */ + BYTE FuncNum = *(PBYTE)SEG_OFF_TO_PTR(getCS(), getIP()); + setIP(getIP() + 1); + + if (FuncNum == BOP_CONTROL_INT32) + Int32Dispatch(Stack); + else + DPRINT1("Unassigned Control BOP Function: 0x%02X\n", FuncNum); +} + VOID WINAPI InitializeInt32(WORD BiosSegment) { LPDWORD IntVecTable = (LPDWORD)BaseAddress; @@ -163,8 +182,8 @@
BiosCode[Offset++] = LOBYTE(EMULATOR_BOP); // BOP sequence BiosCode[Offset++] = HIBYTE(EMULATOR_BOP); - BiosCode[Offset++] = EMULATOR_CTRL_BOP; // Control BOP - BiosCode[Offset++] = CTRL_BOP_INT32; // 32-bit Interrupt dispatcher + BiosCode[Offset++] = BOP_CONTROL; // Control BOP + BiosCode[Offset++] = BOP_CONTROL_INT32; // 32-bit Interrupt dispatcher
BiosCode[Offset++] = 0x73; // jnc EXIT (offset +4) BiosCode[Offset++] = 0x04; @@ -183,6 +202,9 @@ BiosCode[Offset++] = 0x04;
BiosCode[Offset++] = 0xCF; // iret + + /* Register the Control BOP */ + RegisterBop(BOP_CONTROL, ControlBop); }
VOID WINAPI RegisterInt32(BYTE IntNumber, EMULATOR_INT32_PROC IntHandler)
Modified: branches/ntvdm/subsystems/ntvdm/int32.h URL: http://svn.reactos.org/svn/reactos/branches/ntvdm/subsystems/ntvdm/int32.h?r... ============================================================================== --- branches/ntvdm/subsystems/ntvdm/int32.h [iso-8859-1] (original) +++ branches/ntvdm/subsystems/ntvdm/int32.h [iso-8859-1] Sun Dec 15 16:30:28 2013 @@ -11,9 +11,6 @@ #define _INT32_H_
/* DEFINES ********************************************************************/ - -/* 32-bit Interrupt dispatcher function code for the Control BOP Handler */ -#define CTRL_BOP_INT32 0xFF
/* 32-bit Interrupt Identifiers */ #define EMULATOR_MAX_INT32_NUM 0xFF + 1