#ifndef VBUAPI #define VBUAPI #endif #include #include #include /* Memory management */ #ifndef VBU_REALLOC #include #define VBU_REALLOC realloc #else extern void* VBU_REALLOC(void *, size_t); #endif /***************************** Library Functions *****************************/ /* Sign-extend an integer of variable width */ static int32_t SignExtend(int32_t value, int32_t bits) { #ifndef VB_SIGNED_PROPAGATE value &= ~((uint32_t) 0xFFFFFFFF << bits); bits = (int32_t) 1 << (bits - (int32_t) 1); return (value ^ bits) - bits; #else return value << (32 - bits) >> (32 - bits); #endif } /******************************** Sub-Modules ********************************/ #include "disassembler.c" /******************************* API Commands ********************************/ /* Determine the size in bytes of an instruction */ VBUAPI int vbuCodeSize(VB *sim, uint32_t address) { int opcode = vbRead(sim, address, VB_U16) >> 10 & 63; return opcode < 0x20 || opcode == 0x32 || opcode == 0x36 ? 2 : 4; } /* Initialize disassembler options with default settings */ VBUAPI VBU_DasmConfig* vbuDasmInit(VBU_DasmConfig *config) { config->bcondNotation = VBU_JOINED; config->conditionCase = VBU_LOWER; config->conditionCL = VBU_L; config->conditionEZ = VBU_Z; config->conditionNotation = VBU_NAMES; config->hexCase = VBU_UPPER; config->hexNotation = VBU_0X; config->immediateNotation = VBU_NONE; config->memoryNotation = VBU_OUTSIDE; config->mnemonicCase = VBU_UPPER; config->operandOrder = VBU_DEST_LAST; config->programCase = VBU_LOWER; config->programNotation = VBU_NAMES; config->setfNotation = VBU_SPLIT; config->systemCase = VBU_LOWER; config->systemNotation = VBU_NAMES; return config; } /* Disassemble from a simulation */ VBUAPI VBU_DasmLine* vbuDisassemble(VB *sim, uint32_t address, VBU_DasmConfig *config, unsigned length, int line) { return dasmDisassemble(sim, address, config, length, line); }