1 /* dZ80 Disassembler Header */ 2 3 #ifndef _MIDISSZ80_ 4 #define _MIDISSZ80_ 5 6 #ifdef __cplusplus 7 extern "C" { 8 #endif 9 10 #ifndef _DZ80_EXCLUDE_SCRIPT 11 #include "lua.h" 12 #else 13 #define LUA_VERSION "(scripting not included)" 14 #endif 15 16 #define DZ80_WWW "http://www.inkland.org" 17 #define DZ80_EMAIL "dz80@inkland.org" 18 19 #define Z80MEMSIZE 65536 20 21 #define D_CUSTOMSTRING_MAXLEN 6 22 23 #define DISFLAG_OPCODEDUMP 0x01 24 #define DISFLAG_ADDRDUMP 0x02 25 #define DISFLAG_UPPER 0x04 26 #define DISFLAG_SINGLE 0x08 /* Disassemble a single instruction */ 27 #define DISFLAG_VERBOSE 0x10 28 #define DISFLAG_QUIET 0x20 29 #define DISFLAG_LABELLED 0x40 30 #define DISFLAG_REFINPORT 0x80 31 #define DISFLAG_REFOUTPORT 0x100 32 #define DISFLAG_REFADDR 0x200 33 #define DISFLAG_REFINDIRECT 0x400 34 #define DISFLAG_REFLIMITRANGE 0x800 35 #define DISFLAG_USELABELADDRS 0x1000 36 #define DISFLAG_RELCOMMENT 0x2000 /* Relative jump comments */ 37 #define DISFLAG_LINECOMMANDS 0x4000 /* Process line commands (auto blank lines) */ 38 #define DISFLAG_CALLBACK 0x8000 /* Access memory through a callback */ 39 40 /* Reference listing stuff */ 41 #define DISFLAG_ANYREF (DISFLAG_REFINPORT | DISFLAG_REFOUTPORT | DISFLAG_REFADDR | DISFLAG_REFINDIRECT) 42 43 /* parametersModified flags (used by the GUI when importing a config file) */ 44 #define DPM_STARTADDR 0x0001 45 #define DPM_ENDADDR 0x0002 46 #define DPM_HDRSIZE 0x0004 47 #define DPM_FILESTARTADDR 0x0008 48 #define DPM_CPUTYPE 0x0010 49 #define DPM_RADIX 0x0020 50 #define DPM_NUMPREFIX 0x0040 51 #define DPM_NUMSUFFIX 0x0080 52 #define DPM_OPMAP 0x0100 53 54 /* Configuration file name */ 55 #define CONFIGFILENAME "dz80.ini" 56 57 enum dz80Cpus 58 { 59 DCPU_Z80GB, 60 DCPU_Z80, 61 DCPU_Z180, 62 63 DCPU_TOTAL 64 }; 65 66 67 enum dz80Passes 68 { 69 DPASS_INIT, 70 DPASS_WRITE, 71 DPASS_ANALYSE, 72 73 DPASS_TOTAL 74 }; 75 76 77 78 enum dz80Errors 79 { 80 DERR_NONE, 81 DERR_OUTOFMEM, 82 DERR_COULDNTCREATEFILE, 83 DERR_COULDNTWRITETOFILE, 84 DERR_BADOPCODELENGTH, 85 DERR_INVALIDPARAMS, 86 DERR_SCRIPTERROR, 87 DERR_WRONGARGUMENTTYPE, 88 DERR_COULDNTOPENFILE, 89 DERR_SCRIPTING_NA, 90 91 DERR_TOTAL 92 }; 93 94 95 enum DRADIX 96 { 97 DRADIX_HEX, 98 DRADIX_DECIMAL, 99 DRADIX_OCTAL, 100 101 DRADIX_TOTAL, 102 103 DRADIX_DEFAULT = DRADIX_HEX 104 }; 105 106 107 enum DISREF_TYPES 108 { 109 DISREF_INPORT, 110 DISREF_OUTPORT, 111 DISREF_ADDR, 112 DISREF_INDIRECT, 113 114 DISREF_TOTAL 115 }; 116 117 118 typedef struct DISREFADDR 119 { 120 WORD RefAddress; 121 struct DISREFADDR *pNext; 122 } DISREFADDR; 123 124 typedef struct DISREF 125 { 126 WORD RefType; /* Reference type */ 127 WORD Addr; /* Memory or port address */ 128 WORD Hits; /* Number of times referenced */ 129 DISREFADDR *pRefAddrHead; /* Pointer to the list of referenced addresses */ 130 DISREFADDR *pRefAddrTail; /* Pointer to the last referenced address */ 131 132 struct DISREF *pPrev; 133 struct DISREF *pNext; 134 } DISREF; 135 136 137 typedef struct DISZ80 138 { 139 BYTE *mem0Start; /* Pointer to Z80's zero address */ 140 BYTE (*memCB)(void *ctx, WORD addr); /* Indirect access through callback (DISFLAG_CALLBACK) */ 141 WORD start; /* Starting disassembler address */ 142 WORD end; /* Ending disassembler address */ 143 DWORD flags; /* See DISFLAG_ defines */ 144 DWORD flagsModified; /* Which bits have been modified via config files */ 145 DWORD parametersModified; /* Which other parameters have been modified via config file */ 146 int numInstructions; /* How many instructions were disassembled */ 147 int createdRefOK; /* Set to TRUE if created .ref file OK */ 148 char srcFileName[_MAX_PATH]; /* Used only to display the source filename in the report header */ 149 char outFileName[_MAX_PATH]; /* Destination assembler file */ 150 char opMapFileName[_MAX_PATH]; /* Opcode map file name */ 151 char refFileName[_MAX_PATH]; /* Reference file name */ 152 char scriptFileName[_MAX_PATH]; /* Lua script file name */ 153 154 /* CPU type */ 155 BYTE cpuType; /* See the DCPU_ enums */ 156 157 /* New flexible number formats */ 158 BYTE layoutRadix; /* Do ya want hex with that? */ 159 char layoutComment[D_CUSTOMSTRING_MAXLEN]; /* The string used as a comment marker */ 160 char layoutNumberPrefix[D_CUSTOMSTRING_MAXLEN]; 161 char layoutNumberSuffix[D_CUSTOMSTRING_MAXLEN]; 162 char layoutDefineByte[D_CUSTOMSTRING_MAXLEN];/* Default of "db" */ 163 164 /* Pointer to the function callbacks */ 165 void (*fnProgressCallback)(struct DISZ80 *d); 166 void (*fnErrorMessage)(char *msg); 167 void (*fnOutputMessage)(char *msg); 168 169 /* dZ80 private workspace stuff - hands off ;) */ 170 char hexDisBuf[32]; /* Holds the hex. code bytes (easy one!) */ 171 char disBuf[128]; /* Holds the disassembly */ 172 char commentBuf[128]; 173 WORD lastDisPC, lastRefAddr, disStart, disEnd; 174 int op, realop, lineCmd; 175 BYTE *Z80MemBase; 176 BYTE (*Z80MemCB)(void *ctx, WORD addr); 177 signed char IXIYDisp; /* The IXIY displacement (-128 to 127) */ 178 int Z80Flags; 179 int currentPass, totalPasses; 180 int numRecursions; 181 BYTE *fnMap, *opMap; 182 DISREF *pRefHead[DISREF_TOTAL]; 183 DWORD numRefs[DISREF_TOTAL]; 184 DWORD bytesToProcess, bytesProcessed; 185 FILE *outStream, *refStream; 186 int labelledOutput, dissingToConsole, haveTabbed; 187 int progressCounter; 188 WORD PC, lastPC; 189 BYTE *pTrapMap; /* Pointer to the trap map */ 190 BYTE firstByte; 191 int haveWrapped; 192 int disBufIndex; /* Index into the disassembly buffer */ 193 DWORD fileHeaderSize; /* The size of the file's header (to skip) */ 194 WORD fileStartAddr; /* The Z80 address of the start of the file */ 195 196 #ifndef _DZ80_EXCLUDE_SCRIPT 197 lua_State *ls; /* Pointer to the Lua state in which the scripts are run */ 198 #endif 199 200 } DISZ80; 201 202 203 int dZ80_LoadConfiguration(DISZ80 *d, char *pConfigFile); 204 void dZ80_SetDefaultOptions(DISZ80 *d); 205 int dZ80_Disassemble(DISZ80 *d); 206 void dZ80_SetRadix(DISZ80 *d, int radix); 207 int dZ80_SingleDisassembly(DISZ80 *d); 208 void dZ80_InheritRadix(DISZ80 *dst, DISZ80 *src); 209 char *dZ80_GetVersionString(void); 210 void dZ80_StringToLower(char *s); 211 void dZ80_StringToUpper(char *s); 212 void dZ80_SafeStringCopy(char *dst, char *src, int dstSize); 213 const char *dZ80_GetErrorText(int errNum); 214 int dZ80_LoadZ80File(DISZ80 *d, DWORD *BytesLoaded); 215 void dZ80_Error(DISZ80 *d, char *msg); 216 void dZ80_ShowMsg(DISZ80 *d, char *msg); 217 int dZ80_AllocateOpMap(DISZ80 *d); 218 219 extern char *dZ80CpuTypeNames[DCPU_TOTAL]; 220 221 #ifdef __cplusplus 222 } 223 #endif 224 225 #endif /* _MIDISSZ80_ */ 226