forked from KolibriOS/kolibrios
226 lines
6.0 KiB
C
226 lines
6.0 KiB
C
|
/* dZ80 Disassembler Header */
|
||
|
|
||
|
#ifndef _MIDISSZ80_
|
||
|
#define _MIDISSZ80_
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#ifndef _DZ80_EXCLUDE_SCRIPT
|
||
|
#include "lua.h"
|
||
|
#else
|
||
|
#define LUA_VERSION "(scripting not included)"
|
||
|
#endif
|
||
|
|
||
|
#define DZ80_WWW "http://www.inkland.org"
|
||
|
#define DZ80_EMAIL "dz80@inkland.org"
|
||
|
|
||
|
#define Z80MEMSIZE 65536
|
||
|
|
||
|
#define D_CUSTOMSTRING_MAXLEN 6
|
||
|
|
||
|
#define DISFLAG_OPCODEDUMP 0x01
|
||
|
#define DISFLAG_ADDRDUMP 0x02
|
||
|
#define DISFLAG_UPPER 0x04
|
||
|
#define DISFLAG_SINGLE 0x08 /* Disassemble a single instruction */
|
||
|
#define DISFLAG_VERBOSE 0x10
|
||
|
#define DISFLAG_QUIET 0x20
|
||
|
#define DISFLAG_LABELLED 0x40
|
||
|
#define DISFLAG_REFINPORT 0x80
|
||
|
#define DISFLAG_REFOUTPORT 0x100
|
||
|
#define DISFLAG_REFADDR 0x200
|
||
|
#define DISFLAG_REFINDIRECT 0x400
|
||
|
#define DISFLAG_REFLIMITRANGE 0x800
|
||
|
#define DISFLAG_USELABELADDRS 0x1000
|
||
|
#define DISFLAG_RELCOMMENT 0x2000 /* Relative jump comments */
|
||
|
#define DISFLAG_LINECOMMANDS 0x4000 /* Process line commands (auto blank lines) */
|
||
|
#define DISFLAG_CALLBACK 0x8000 /* Access memory through a callback */
|
||
|
|
||
|
/* Reference listing stuff */
|
||
|
#define DISFLAG_ANYREF (DISFLAG_REFINPORT | DISFLAG_REFOUTPORT | DISFLAG_REFADDR | DISFLAG_REFINDIRECT)
|
||
|
|
||
|
/* parametersModified flags (used by the GUI when importing a config file) */
|
||
|
#define DPM_STARTADDR 0x0001
|
||
|
#define DPM_ENDADDR 0x0002
|
||
|
#define DPM_HDRSIZE 0x0004
|
||
|
#define DPM_FILESTARTADDR 0x0008
|
||
|
#define DPM_CPUTYPE 0x0010
|
||
|
#define DPM_RADIX 0x0020
|
||
|
#define DPM_NUMPREFIX 0x0040
|
||
|
#define DPM_NUMSUFFIX 0x0080
|
||
|
#define DPM_OPMAP 0x0100
|
||
|
|
||
|
/* Configuration file name */
|
||
|
#define CONFIGFILENAME "dz80.ini"
|
||
|
|
||
|
enum dz80Cpus
|
||
|
{
|
||
|
DCPU_Z80GB,
|
||
|
DCPU_Z80,
|
||
|
DCPU_Z180,
|
||
|
|
||
|
DCPU_TOTAL
|
||
|
};
|
||
|
|
||
|
|
||
|
enum dz80Passes
|
||
|
{
|
||
|
DPASS_INIT,
|
||
|
DPASS_WRITE,
|
||
|
DPASS_ANALYSE,
|
||
|
|
||
|
DPASS_TOTAL
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
enum dz80Errors
|
||
|
{
|
||
|
DERR_NONE,
|
||
|
DERR_OUTOFMEM,
|
||
|
DERR_COULDNTCREATEFILE,
|
||
|
DERR_COULDNTWRITETOFILE,
|
||
|
DERR_BADOPCODELENGTH,
|
||
|
DERR_INVALIDPARAMS,
|
||
|
DERR_SCRIPTERROR,
|
||
|
DERR_WRONGARGUMENTTYPE,
|
||
|
DERR_COULDNTOPENFILE,
|
||
|
DERR_SCRIPTING_NA,
|
||
|
|
||
|
DERR_TOTAL
|
||
|
};
|
||
|
|
||
|
|
||
|
enum DRADIX
|
||
|
{
|
||
|
DRADIX_HEX,
|
||
|
DRADIX_DECIMAL,
|
||
|
DRADIX_OCTAL,
|
||
|
|
||
|
DRADIX_TOTAL,
|
||
|
|
||
|
DRADIX_DEFAULT = DRADIX_HEX
|
||
|
};
|
||
|
|
||
|
|
||
|
enum DISREF_TYPES
|
||
|
{
|
||
|
DISREF_INPORT,
|
||
|
DISREF_OUTPORT,
|
||
|
DISREF_ADDR,
|
||
|
DISREF_INDIRECT,
|
||
|
|
||
|
DISREF_TOTAL
|
||
|
};
|
||
|
|
||
|
|
||
|
typedef struct DISREFADDR
|
||
|
{
|
||
|
WORD RefAddress;
|
||
|
struct DISREFADDR *pNext;
|
||
|
} DISREFADDR;
|
||
|
|
||
|
typedef struct DISREF
|
||
|
{
|
||
|
WORD RefType; /* Reference type */
|
||
|
WORD Addr; /* Memory or port address */
|
||
|
WORD Hits; /* Number of times referenced */
|
||
|
DISREFADDR *pRefAddrHead; /* Pointer to the list of referenced addresses */
|
||
|
DISREFADDR *pRefAddrTail; /* Pointer to the last referenced address */
|
||
|
|
||
|
struct DISREF *pPrev;
|
||
|
struct DISREF *pNext;
|
||
|
} DISREF;
|
||
|
|
||
|
|
||
|
typedef struct DISZ80
|
||
|
{
|
||
|
BYTE *mem0Start; /* Pointer to Z80's zero address */
|
||
|
BYTE (*memCB)(void *ctx, WORD addr); /* Indirect access through callback (DISFLAG_CALLBACK) */
|
||
|
WORD start; /* Starting disassembler address */
|
||
|
WORD end; /* Ending disassembler address */
|
||
|
DWORD flags; /* See DISFLAG_ defines */
|
||
|
DWORD flagsModified; /* Which bits have been modified via config files */
|
||
|
DWORD parametersModified; /* Which other parameters have been modified via config file */
|
||
|
int numInstructions; /* How many instructions were disassembled */
|
||
|
int createdRefOK; /* Set to TRUE if created .ref file OK */
|
||
|
char srcFileName[_MAX_PATH]; /* Used only to display the source filename in the report header */
|
||
|
char outFileName[_MAX_PATH]; /* Destination assembler file */
|
||
|
char opMapFileName[_MAX_PATH]; /* Opcode map file name */
|
||
|
char refFileName[_MAX_PATH]; /* Reference file name */
|
||
|
char scriptFileName[_MAX_PATH]; /* Lua script file name */
|
||
|
|
||
|
/* CPU type */
|
||
|
BYTE cpuType; /* See the DCPU_ enums */
|
||
|
|
||
|
/* New flexible number formats */
|
||
|
BYTE layoutRadix; /* Do ya want hex with that? */
|
||
|
char layoutComment[D_CUSTOMSTRING_MAXLEN]; /* The string used as a comment marker */
|
||
|
char layoutNumberPrefix[D_CUSTOMSTRING_MAXLEN];
|
||
|
char layoutNumberSuffix[D_CUSTOMSTRING_MAXLEN];
|
||
|
char layoutDefineByte[D_CUSTOMSTRING_MAXLEN];/* Default of "db" */
|
||
|
|
||
|
/* Pointer to the function callbacks */
|
||
|
void (*fnProgressCallback)(struct DISZ80 *d);
|
||
|
void (*fnErrorMessage)(char *msg);
|
||
|
void (*fnOutputMessage)(char *msg);
|
||
|
|
||
|
/* dZ80 private workspace stuff - hands off ;) */
|
||
|
char hexDisBuf[32]; /* Holds the hex. code bytes (easy one!) */
|
||
|
char disBuf[128]; /* Holds the disassembly */
|
||
|
char commentBuf[128];
|
||
|
WORD lastDisPC, lastRefAddr, disStart, disEnd;
|
||
|
int op, realop, lineCmd;
|
||
|
BYTE *Z80MemBase;
|
||
|
BYTE (*Z80MemCB)(void *ctx, WORD addr);
|
||
|
signed char IXIYDisp; /* The IXIY displacement (-128 to 127) */
|
||
|
int Z80Flags;
|
||
|
int currentPass, totalPasses;
|
||
|
int numRecursions;
|
||
|
BYTE *fnMap, *opMap;
|
||
|
DISREF *pRefHead[DISREF_TOTAL];
|
||
|
DWORD numRefs[DISREF_TOTAL];
|
||
|
DWORD bytesToProcess, bytesProcessed;
|
||
|
FILE *outStream, *refStream;
|
||
|
int labelledOutput, dissingToConsole, haveTabbed;
|
||
|
int progressCounter;
|
||
|
WORD PC, lastPC;
|
||
|
BYTE *pTrapMap; /* Pointer to the trap map */
|
||
|
BYTE firstByte;
|
||
|
int haveWrapped;
|
||
|
int disBufIndex; /* Index into the disassembly buffer */
|
||
|
DWORD fileHeaderSize; /* The size of the file's header (to skip) */
|
||
|
WORD fileStartAddr; /* The Z80 address of the start of the file */
|
||
|
|
||
|
#ifndef _DZ80_EXCLUDE_SCRIPT
|
||
|
lua_State *ls; /* Pointer to the Lua state in which the scripts are run */
|
||
|
#endif
|
||
|
|
||
|
} DISZ80;
|
||
|
|
||
|
|
||
|
int dZ80_LoadConfiguration(DISZ80 *d, char *pConfigFile);
|
||
|
void dZ80_SetDefaultOptions(DISZ80 *d);
|
||
|
int dZ80_Disassemble(DISZ80 *d);
|
||
|
void dZ80_SetRadix(DISZ80 *d, int radix);
|
||
|
int dZ80_SingleDisassembly(DISZ80 *d);
|
||
|
void dZ80_InheritRadix(DISZ80 *dst, DISZ80 *src);
|
||
|
char *dZ80_GetVersionString(void);
|
||
|
void dZ80_StringToLower(char *s);
|
||
|
void dZ80_StringToUpper(char *s);
|
||
|
void dZ80_SafeStringCopy(char *dst, char *src, int dstSize);
|
||
|
const char *dZ80_GetErrorText(int errNum);
|
||
|
int dZ80_LoadZ80File(DISZ80 *d, DWORD *BytesLoaded);
|
||
|
void dZ80_Error(DISZ80 *d, char *msg);
|
||
|
void dZ80_ShowMsg(DISZ80 *d, char *msg);
|
||
|
int dZ80_AllocateOpMap(DISZ80 *d);
|
||
|
|
||
|
extern char *dZ80CpuTypeNames[DCPU_TOTAL];
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* _MIDISSZ80_ */
|