180 lines
2.6 KiB
C
180 lines
2.6 KiB
C
/*++
|
||
|
||
Copyright (c) 1994 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
miscops.c
|
||
|
||
Abstract:
|
||
|
||
This module implements the code to emulate miscellaneous opcodes.
|
||
|
||
Author:
|
||
|
||
David N. Cutler (davec) 22-Sep-1994
|
||
|
||
Environment:
|
||
|
||
Kernel mode only.
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "nthal.h"
|
||
#include "emulate.h"
|
||
|
||
VOID
|
||
XmBoundOp (
|
||
PRXM_CONTEXT P
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function emulates a bound opcode.
|
||
|
||
Arguments:
|
||
|
||
P - Supplies a pointer to an emulator context structure.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
union {
|
||
LONG Long;
|
||
SHORT Word;
|
||
} LowerBound;
|
||
|
||
union {
|
||
LONG Long;
|
||
SHORT Word;
|
||
} UpperBound;
|
||
|
||
ULONG Offset;
|
||
|
||
//
|
||
// Get lower and upper bounds and check index against index value.
|
||
//
|
||
|
||
Offset = P->SrcValue.Long;
|
||
XmSetSourceValue(P, XmGetOffsetAddress(P, Offset));
|
||
LowerBound.Long = P->SrcValue.Long;
|
||
XmSetSourceValue(P, XmGetOffsetAddress(P, Offset + P->DataType + 1));
|
||
UpperBound.Long = P->SrcValue.Long;
|
||
if (P->DataType == LONG_DATA) {
|
||
if (((LONG)(*P->DstLong) < LowerBound.Long) ||
|
||
((LONG)(*P->DstLong) > (UpperBound.Long + (LONG)(P->DataType + 1)))) {
|
||
longjmp(&P->JumpBuffer[0], XM_INDEX_OUT_OF_BOUNDS);
|
||
}
|
||
|
||
} else {
|
||
if (((SHORT)(*P->DstWord) < LowerBound.Word) ||
|
||
((SHORT)(*P->DstWord) > (UpperBound.Word + (SHORT)(P->DataType + 1)))) {
|
||
longjmp(&P->JumpBuffer[0], XM_INDEX_OUT_OF_BOUNDS);
|
||
}
|
||
}
|
||
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
XmBswapOp (
|
||
PRXM_CONTEXT P
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function emulates a bswap opcode.
|
||
|
||
Arguments:
|
||
|
||
P - Supplies a pointer to an emulator context structure.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
ULONG Result;
|
||
|
||
//
|
||
// Swap bytes and set result value.
|
||
//
|
||
|
||
Result = (P->SrcValue.Long << 24) | ((P->SrcValue.Long & 0xff00) << 8) |
|
||
(P->SrcValue.Long >> 24) | ((P->SrcValue.Long >> 8) & 0xff00);
|
||
|
||
XmStoreResult(P, Result);
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
XmIllOp (
|
||
PRXM_CONTEXT P
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function emulates an illegal opcode.
|
||
|
||
Arguments:
|
||
|
||
P - Supplies a pointer to an emulator context structure.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
//
|
||
// Raise an illegal opcode exception.
|
||
//
|
||
|
||
longjmp(&P->JumpBuffer[0], XM_ILLEGAL_INSTRUCTION_OPCODE);
|
||
return;
|
||
}
|
||
|
||
VOID
|
||
XmNopOp (
|
||
PRXM_CONTEXT P
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function emulates a nop opcode.
|
||
|
||
Arguments:
|
||
|
||
P - Supplies a pointer to an emulator context structure.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
|
||
{
|
||
|
||
return;
|
||
}
|