OPTABLE.H


/*++

Copyright (c) 1993 Digital Equipment Corporation

Module Name:

optable.h

Abstract:

Definitions for -
Table of operations, their names and charactersitics
Used by ntsd, windbg and acc's dissassembler

Author:

Miche Baker-Harvey (mbh) 10-Jan-1993

Revision History:

--*/

#ifndef _OPTABLE_
#define _OPTABLE_

//
// Each entry in the opTable is either for a
// + function - one option on a particular opcode
// + terminal opcode - an opcode without a function field
// the above two can both appear directly in disassembly
//
// + non terminal opcode - an opcode with a function field:
// these entries do not represent values which can be
// executed directly: they require a function entry.
//
// + invalid opcode - this is an opcode reserved to digital
//

typedef enum ENTRY_TYPE {

INVALID_ETYPE,
NON_TERMINAL_ETYPE,
TERMINAL_ETYPE,
FUNCTION_ETYPE,
NOT_AN_ETYPE

} ENTRY_TYPE;


#define NO_FUNC (ULONG)-1

typedef ULONG (* PFOPPARSE)();

typedef struct _OPTBLENTRY {

union {

struct {

PUCHAR _pszName; // Name of the instruction
PFOPPARSE _parsFunc; // Function to parse operands

} s0; // functions and terminal opcodes

struct {

struct _OPTBLENTRY * _funcTable; // Describes funcs for opcode
ULONG _funcTableSize; // Number of possible funcs

} s1; // non-terminal opcodes

} u;

//
// These fields describe the instruction
//

ULONG opCode; // Top 6 bits of a 32-bit alpha instr
ULONG funcCode; // Function; meaning is opcode dependent
ULONG iType; // type of the instr: branch, fp, mem...
// values are ALPHA_* in alphaops.h

ENTRY_TYPE eType; // type of this entry in the opTable

} OPTBLENTRY, * POPTBLENTRY;

//
// MBH - hack workaround:
// I tried to do this with nameless functions and structures;
// it works just fine on ALPHA, but dies on 386, so use this
// ugly hack instead.
// The name "pszAlphaName" is used instead of the more obvious
// "pszName" because other structures contain pszName.
//
#define pszAlphaName u.s0._pszName
#define parsFunc u.s0._parsFunc
#define funcTable u.s1._funcTable
#define funcTableSize u.s1._funcTableSize

POPTBLENTRY findNonTerminalEntry(ULONG);
POPTBLENTRY findStringEntry(PUCHAR);
POPTBLENTRY findOpCodeEntry(ULONG);
char * findFuncName(POPTBLENTRY, ULONG);
char * findFlagName(ULONG, ULONG);
void printTable();
void opTableInit();

//
// This structure is used for the floating point flag names.
//

#define FPFLAGS_NOT_AN_ENTRY 0xffffffff

typedef struct _FPFLAGS {

ULONG flags; // the flags on the opcode
PUCHAR flagname; // the string mnemonic for the flags

} FPFLAGS, * PFPFLAGS;


#endif // _OPTABLE_