Add write-after-cycles, reset handling
This commit is contained in:
96
inc/pub/libhmmmm/mem.h
Normal file
96
inc/pub/libhmmmm/mem.h
Normal file
@@ -0,0 +1,96 @@
|
||||
#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;
|
||||
uint64_t* memreadCellAddrs;
|
||||
uint8_t* memwriteWordLengths;
|
||||
uint8_t* memwriteCellSegments;
|
||||
uint64_t* memwriteCellAddrs;
|
||||
void** 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); \
|
||||
*((__cell_t*)__mem->memwriteValues[__mem->memwriteLen]) = (__cell_t)(__val); \
|
||||
__mem->memwriteLen += 1; \
|
||||
}
|
||||
|
||||
|
||||
#endif // ifndef __HMMMM_PUB_MEM_H__
|
||||
Reference in New Issue
Block a user