Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

159 lines
4.2 KiB

// This file contains the definitions needed for the 68000 Intermediate
// Assembly Language.
// Immediate value structure
#pragma warning (disable:4069) // suppress warning about long double
typedef union _IMMED_VAL {
char b; // byte value
short w; // word value
long l; // long value
float s; // single precision value
double d; // double precision value
long double x; // extended precision value
long pc; // program counter value
long rl; // register list value
} IMMED_VAL;
#pragma warning (default:4069) // reset
// Operand structure
typedef struct _OPER {
unsigned ea : 6; // Effective addressing mode
unsigned reg : 3; // Register number
unsigned reg2 : 3; // Register number of index reg/reg pair
unsigned fARegIndex : 1; // TRUE iff the index reg is an address reg
unsigned fLongIndex : 1; // TRUE iff both words of the index reg are used
unsigned pad : 2;
long disp; // Displacment
char *szLabel; // Pointer to label string
IMMED_VAL val; // Immediate value
} OPER;
// Intermediate assembly language instruction
typedef struct _IASM {
unsigned short op; // Opcode
unsigned coper : 2; // Number of operands
unsigned size : 6; // Size of the operation
OPER oper1;
OPER oper2;
} IASM;
// Modes for effective address calculations
#define modeDREG 0
#define modeAREG 1
#define modeINDIRECT 2
#define modePOSTINC 3
#define modePREDEC 4
#define modeDISP 5
#define modeINDEX 6
#define modeSPECIAL 7
#define modeSYMIMMED 20
#define modeLABEL 21
#define modeFREG 22
#define modeSREG 23
#define modeREGLIST 24
#define modeDREGPAIR 25
#define modeFREGPAIR 26
// Register formats for effective address calculations
#define regSHORTADDR 0
#define regLONGADDR 1
#define regPCDISP 2
#define regPCINDEX 3
#define regIMMED 4
#define regMAX 5
// Effective addressing modes
#define eaDREG modeDREG
#define eaAREG modeAREG
#define eaINDIRECT modeINDIRECT
#define eaPOSTINC modePOSTINC
#define eaPREDEC modePREDEC
#define eaDISP modeDISP
#define eaINDEX modeINDEX
#define eaSHORTADDR (modeSPECIAL + regSHORTADDR)
#define eaLONGADDR (modeSPECIAL + regLONGADDR)
#define eaPCDISP (modeSPECIAL + regPCDISP)
#define eaPCINDEX (modeSPECIAL + regPCINDEX)
#define eaBYTEIMMED (modeSPECIAL + regIMMED + sizeBYTE)
#define eaWORDIMMED (modeSPECIAL + regIMMED + sizeWORD)
#define eaLONGIMMED (modeSPECIAL + regIMMED + sizeLONG)
#if 0
#define eaSINGLEIMMED (modeSPECIAL + regIMMED + sizeSINGLE)
#define eaDOUBLEIMMED (modeSPECIAL + regIMMED + sizeDOUBLE)
#define eaEXTENDEDIMMED (modeSPECIAL + regIMMED + sizeEXTENDED)
#endif
#define eaSYMIMMED modeSYMIMMED
#define eaLABEL modeLABEL
#define eaFREG modeFREG
#define eaSREG modeSREG
#define eaREGLIST modeREGLIST
#define eaDREGPAIR modeDREGPAIR
#define eaFREGPAIR modeFREGPAIR
#define eaNULL (eaFREGPAIR + 1)
// Register numbers for special registers
#define regSR 0
#define regFPIAR 1
#define regFPSR 2
#define regCCR 3
#define regFPCR 4
#define regUSP 5
// Operation sizes
#define sizeBYTE 0
#define sizeWORD 1
#define sizeLONG 2
#define sizeNULL 3
#define sizeSINGLE 4
#define sizeDOUBLE 5
#define sizeEXTENDED 6
#define sizePACKED 7
// Opcodes
#define OPCODE(op, sz, fmt) op,
enum opcode {
#include "iasmop.h"
};
// Formating options
#define optDEFAULT 0
#define optUPPER 1
#define optRELLABEL 2
#define optALTREGLIST 4
// Maximum possible lengths
#define cbINSTRMAX 20
#define cchSZOPCODEMAX 12
#define cchSZOPERMAX 49
// Public entry points
unsigned CbBuildIasm(IASM *, unsigned long, const unsigned char *);
unsigned CchSzOpcode(IASM *, char *, short);
unsigned CchSzOper(OPER *, char *, short);