96 lines
2.9 KiB
C
96 lines
2.9 KiB
C
#ifndef __HMMMM_PUB_MEM_H__
|
|
#define __HMMMM_PUB_MEM_H__
|
|
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
|
|
#define GET_BIT(n, b) ((uint8_t)((n >> b) & 1))
|
|
|
|
#define MEM_ACCESS_INTERCEPT_BUF_SIZE 64
|
|
|
|
// Internal mem handlers
|
|
typedef void* (*mem_h_read_func)(uint64_t ident, uint64_t addr, void* rawCells);
|
|
typedef void (*mem_h_write_func)(uint64_t ident, uint64_t addr, void* rawCells, void* data);
|
|
|
|
typedef struct {
|
|
mem_h_read_func func;
|
|
uint64_t ident;
|
|
} mem_h_read_handler;
|
|
typedef struct {
|
|
mem_h_write_func func;
|
|
uint64_t ident;
|
|
} mem_h_write_handler;
|
|
|
|
typedef struct
|
|
{
|
|
void* rawCells;
|
|
void** cells;
|
|
uint64_t smartAddrReadMask;
|
|
uint64_t smartAddrWriteMask;
|
|
mem_h_read_handler* smartAddrReadHandlers;
|
|
mem_h_write_handler* smartAddrWriteHandlers;
|
|
char** memsegNames;
|
|
uint64_t* memsegShifts;
|
|
uint64_t* memsegSizes;
|
|
uint8_t* memsegCellSizes;
|
|
uint64_t* memreadCellAddrs;
|
|
uint8_t* memwriteCellSegments;
|
|
uint64_t* memwriteCellAddrs;
|
|
uint64_t* memwriteValues;
|
|
uint8_t memreadLen;
|
|
uint8_t memwriteLen;
|
|
} device_mem_t;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
uint64_t start;
|
|
uint64_t len;
|
|
uint8_t wordLen;
|
|
char* name;
|
|
} memseg_spec_t;
|
|
|
|
|
|
// External handlers
|
|
typedef void* (*ext_h_read_func)(uint64_t addr, void* rawCells, void* devContext);
|
|
typedef void (*ext_h_write_func)(uint64_t addr, void* rawCells, void* data, void* devContext);
|
|
|
|
|
|
|
|
#define READ_MEM(__tgt, __mem, __segno, __addr, __cell_t) \
|
|
{\
|
|
uint64_t __globalAddr = __mem->memsegShifts[__segno] + __addr; \
|
|
if (__mem->smartAddrReadHandlers[__globalAddr].func != NULL) \
|
|
{ \
|
|
/* __tgt = *(__cell_t*)__mem->smartAddrReadHandlers[__globalAddr].func(__mem->smartAddrReadHandlers[__globalAddr].ident, __addr, __mem->rawCells + __mem->memsegShifts[__segno]);*/ \
|
|
__tgt = 0;\
|
|
} \
|
|
else \
|
|
{ \
|
|
__tgt = ((__cell_t*)__mem->cells[__segno])[__addr]; \
|
|
} \
|
|
__mem->memreadCellAddrs[__mem->memreadLen] = __globalAddr; \
|
|
__mem->memreadLen += 1; \
|
|
}
|
|
|
|
#define WRITE_MEM(__mem, __segno, __addr, __cell_t, __val) \
|
|
{ \
|
|
uint64_t __globalAddr = ((uint64_t)(__mem->memsegShifts[__segno]) + (uint64_t)(__addr)); \
|
|
if (0 && __mem->smartAddrWriteHandlers[__globalAddr].func != NULL) \
|
|
{ \
|
|
/*__cell_t __dat = (__cell_t)(__val);*/ \
|
|
/*__mem->smartAddrWriteHandlers[__globalAddr].func(__mem->smartAddrWriteHandlers[__globalAddr].ident, __addr, __mem->rawCells + __mem->memsegShifts[__segno], (void*)&__dat);*/ \
|
|
} \
|
|
else if(0) \
|
|
{ \
|
|
((__cell_t*)__mem->cells[__segno])[__addr] = (__cell_t)(__val); \
|
|
} \
|
|
__mem->memwriteCellAddrs[__mem->memwriteLen] = __addr; \
|
|
__mem->memwriteCellSegments[__mem->memwriteLen] = __segno; \
|
|
/*__mem->memwriteWordLengths[__mem->memwriteLen] = sizeof(__cell_t);*/ \
|
|
(__mem->memwriteValues[__mem->memwriteLen]) = (__cell_t)(__val); \
|
|
__mem->memwriteLen += 1; \
|
|
}
|
|
|
|
#endif // ifndef __HMMMM_PUB_MEM_H__
|