1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/memory/region.cc Mon Mar 29 00:56:08 2021 +0200
1.3 @@ -0,0 +1,83 @@
1.4 +#include <string.h>
1.5 +#include <stdlib.h>
1.6 +
1.7 +#include "region.h"
1.8 +
1.9 +
1.10 +
1.11 +/* Initialise region state, indicating the size, file and position. */
1.12 +
1.13 +RegionState::RegionState(unsigned long size, fileid_t fileid, offset_t filepos)
1.14 +: size(size), fileid(fileid), filepos(filepos)
1.15 +{
1.16 +}
1.17 +
1.18 +void RegionState::fill(fileid_t fileid, offset_t filepos)
1.19 +{
1.20 + this->fileid = fileid;
1.21 + this->filepos = filepos;
1.22 +}
1.23 +
1.24 +
1.25 +
1.26 +/* Initialise a region having the given 'start' and 'end' addresses, with the
1.27 + 'end' being one location beyond the last address in the region. */
1.28 +
1.29 +Region::Region(offset_t start, offset_t end)
1.30 +: start(start), end(end), state(end - start)
1.31 +{
1.32 + /* Content state. */
1.33 +
1.34 + memset((void *) start, 0, end - start);
1.35 +}
1.36 +
1.37 +Region::~Region()
1.38 +{
1.39 + free((void *) start);
1.40 +}
1.41 +
1.42 +offset_t Region::size()
1.43 +{
1.44 + return end - start;
1.45 +}
1.46 +
1.47 +/* Debugging methods. */
1.48 +
1.49 +int Region::compare(Region *other)
1.50 +{
1.51 + if (start < other->start)
1.52 + return -1;
1.53 + else if (start > other->start)
1.54 + return 1;
1.55 + else
1.56 + return 0;
1.57 +}
1.58 +
1.59 +void Region::fill(fileid_t fileid, offset_t filepos)
1.60 +{
1.61 + state.fill(fileid, filepos);
1.62 +}
1.63 +
1.64 +void Region::flush()
1.65 +{
1.66 +}
1.67 +
1.68 +/* Simulation methods. */
1.69 +
1.70 +char *Region::read(offset_t offset)
1.71 +{
1.72 + if (offset < size())
1.73 + return (char *) start + offset;
1.74 + else
1.75 + return NULL;
1.76 +}
1.77 +
1.78 +void Region::write(const char *data, offset_t offset)
1.79 +{
1.80 + size_t length = strlen(data);
1.81 +
1.82 + if (offset + length < size())
1.83 + memcpy((void *) (start + offset), data, length + 1);
1.84 +}
1.85 +
1.86 +// vim: tabstop=4 expandtab shiftwidth=4