/* *********************************************************************** * * Example that shows how to use the APU just for user access * * Description * This example shows how to implement an APU library that implements accesses * to the USR: access class. * * This simple example just mirrors the memory of the real core, but inverts * all bits. * * (c) Lauterbach GmbH * http://www.lauterbach.com/ * * $Id$ * * *********************************************************************** */ #include "t32apu.h" #include #include enum { MEMORY_ACCESS_USER = 0 }; static int APUAPI CallbackMemoryRead(apuContext context, apuCallbackStruct *cbs, apuPtr proprietary) { apuWord i; int error; switch (cbs->x.memory.flags) { case MEMORY_ACCESS_USER: error = APU_ReadMemory(context, cbs->x.memory.address, T32_MEMORY_ACCESS_DATA, cbs->x.memory.data, cbs->x.memory.length, cbs->x.memory.width); if (error == APU_OK) { for (i = 0; i < cbs->x.memory.length; ++i) { cbs->x.memory.data[i] = ~cbs->x.memory.data[i]; } } return error; default: /* this should never happen */ APU_Printf(context, "access to unknown access class %d", cbs->x.memory.flags); return APU_FAIL; } } static int APUAPI CallbackMemoryWrite(apuContext context, apuCallbackStruct *cbs, apuPtr proprietary) { apuWord i; int error; uint8_t *data; switch (cbs->x.memory.flags) { case MEMORY_ACCESS_USER: data = (uint8_t *)malloc(cbs->x.memory.length); if (data == NULL) { return APU_FAIL; } for (i = 0; i < cbs->x.memory.length; ++i) { data[i] = ~cbs->x.memory.data[i]; } error = APU_WriteMemory(context, cbs->x.memory.address, T32_MEMORY_ACCESS_DATA, data, cbs->x.memory.length, cbs->x.memory.width); free(data); return error; default: /* this should never happen */ APU_Printf(context, "access to unknown access class %d", cbs->x.memory.flags); return APU_FAIL; } } int APUAPI APU_Init(apuContext context, apuCallbackStruct * cbs) { strcpy(cbs->x.init.modelname, __DATE__ " USRACCESS demo"); if (cbs->x.init.argc != 1) { APU_Warning(context, "parameters: none"); return APU_FAIL; } /* Define memory region for USRACCES. Doing this notifies TRACE32 that this * APU should intercept accesses to USR: addresses. */ APU_DefineMemory(context, MEMORY_ACCESS_USER, "USR", 1, 4); APU_RegisterMemoryReadCallback(context, CallbackMemoryRead, NULL); APU_RegisterMemoryWriteCallback(context, CallbackMemoryWrite, NULL); return APU_OK; }