mirror of https://github.com/lianthony/NT4.0
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
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);
|