forked from Lephenixnoir/hex-editor
122 lines
2.6 KiB
C
122 lines
2.6 KiB
C
#include "source.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <gint/defs/util.h>
|
|
|
|
static memory_region_t REGION_ROM = {
|
|
.start = 0x80000000,
|
|
.end = 0x82000000,
|
|
.writable = false,
|
|
.name = "ROM",
|
|
};
|
|
static memory_region_t REGION_RAM = {
|
|
.start = 0x8c000000,
|
|
.end = 0x8c800000,
|
|
.writable = true,
|
|
.name = "RAM",
|
|
};
|
|
static memory_region_t REGION_ILRAM = {
|
|
.start = 0xe5200000,
|
|
.end = 0xe5201000,
|
|
.writable = true,
|
|
.name = "ILRAM",
|
|
};
|
|
static memory_region_t REGION_XYRAM = {
|
|
.start = 0xe500e000,
|
|
.end = 0xe5012000,
|
|
.writable = true,
|
|
.name = "XRAM/YRAM",
|
|
};
|
|
static memory_region_t REGION_RS = {
|
|
.start = 0xfd800000,
|
|
.end = 0xfd800800,
|
|
.writable = false,
|
|
.name = "RS",
|
|
};
|
|
|
|
memory_region_t *memory_all_regions[] = {
|
|
®ION_ROM,
|
|
®ION_RAM,
|
|
®ION_ILRAM,
|
|
®ION_XYRAM,
|
|
®ION_RS,
|
|
NULL,
|
|
};
|
|
|
|
static ssize_t mr_read(void *_cookie, void *buf, off_t offset, size_t size)
|
|
{
|
|
memory_region_t *mr = _cookie;
|
|
int mr_size = mr->end - mr->start;
|
|
|
|
if(offset < 0 || offset >= mr_size)
|
|
return -1;
|
|
size = min(size, mr_size - offset);
|
|
|
|
memcpy(buf, (void *)mr->start + offset, size);
|
|
return size;
|
|
}
|
|
|
|
static bool mr_write(void *_cookie, void *data, size_t data_size, off_t offset,
|
|
size_t segment_size)
|
|
{
|
|
memory_region_t *mr = _cookie;
|
|
int mr_size = mr->end - mr->start;
|
|
if(data_size != segment_size)
|
|
return false;
|
|
|
|
if(offset < 0 || offset >= mr_size)
|
|
return -1;
|
|
data_size = min(data_size, mr_size - offset);
|
|
|
|
memcpy((void *)mr->start + offset, data, data_size);
|
|
return true;
|
|
}
|
|
|
|
static size_t mr_size(void *_cookie)
|
|
{
|
|
memory_region_t *mr = _cookie;
|
|
return mr->end - mr->start;
|
|
}
|
|
|
|
static bool mr_dirty(void *_cookie)
|
|
{
|
|
(void)_cookie;
|
|
return false;
|
|
}
|
|
|
|
static bool mr_save(void *_cookie, char const *outfile)
|
|
{
|
|
(void)_cookie;
|
|
return (outfile == NULL);
|
|
}
|
|
|
|
static void mr_close(void *_cookie)
|
|
{
|
|
(void)_cookie;
|
|
}
|
|
|
|
static source_intf_t mr_intf = {
|
|
.name = "Memory",
|
|
.close_on_return_to_menu = false,
|
|
.read = mr_read,
|
|
.write = mr_write,
|
|
.size = mr_size,
|
|
.dirty = mr_dirty,
|
|
.save = mr_save,
|
|
.close = mr_close,
|
|
};
|
|
|
|
source_t *source_memory_open(memory_region_t *region)
|
|
{
|
|
char path[128];
|
|
sprintf(path, "%s (%08X)", region->name, region->start);
|
|
source_t *source = source_open(&mr_intf, region, path);
|
|
if(!source)
|
|
return NULL;
|
|
|
|
source->cap = region->writable ? SOURCE_WRITE : 0;
|
|
source->address_base = region->start;
|
|
return source;
|
|
}
|