mirror of
https://github.com/mrkite/regs.git
synced 2025-01-16 16:29:45 +00:00
segment mapping working
This commit is contained in:
parent
8197f75ce8
commit
9d903712bf
@ -1,11 +1,12 @@
|
|||||||
OBJS = main.o omf.o handle.o map.o
|
OBJS = main.o omf.o handle.o map.o
|
||||||
CXX = clang++
|
CXX = clang++
|
||||||
CXXFLAGS = -Wall -std=c++11
|
CXXFLAGS = -g -Wall -std=c++11
|
||||||
|
LDFLAGS = -largp
|
||||||
|
|
||||||
all: regs
|
all: regs
|
||||||
|
|
||||||
regs: $(OBJS)
|
regs: $(OBJS)
|
||||||
$(CXX) $(CXXFLAGS) $(LIBS) -o $@ -largp $^
|
$(CXX) $(CXXFLAGS) $(LIBS) -o $@ $^
|
||||||
|
|
||||||
%.o: %.cc
|
%.o: %.cc
|
||||||
$(CXX) -c $(CXXFLAGS) -o $@ $<
|
$(CXX) -c $(CXXFLAGS) -o $@ $<
|
||||||
|
@ -115,4 +115,5 @@ int main(int argc, char **argv) {
|
|||||||
std::cerr << "Failed to load " << arguments.filename << std::endl;
|
std::cerr << "Failed to load " << arguments.filename << std::endl;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
auto segments = omf.get();
|
||||||
}
|
}
|
||||||
|
@ -54,6 +54,13 @@ Map::Map(const char *filename, uint32_t org, uint32_t flags) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Map::addEntry(uint32_t entry) {
|
||||||
|
Entry e;
|
||||||
|
e.org = entry;
|
||||||
|
e.flags = 0;
|
||||||
|
entryPoints.push_back(e);
|
||||||
|
}
|
||||||
|
|
||||||
File::File(const std::string &filename) {
|
File::File(const std::string &filename) {
|
||||||
data = p = nullptr;
|
data = p = nullptr;
|
||||||
std::ifstream f(filename, std::ios::in | std::ios::binary | std::ios::ate);
|
std::ifstream f(filename, std::ios::in | std::ios::binary | std::ios::ate);
|
||||||
|
@ -32,6 +32,7 @@ struct Entry {
|
|||||||
class Map {
|
class Map {
|
||||||
public:
|
public:
|
||||||
Map(const char *filename, uint32_t org, uint32_t flags);
|
Map(const char *filename, uint32_t org, uint32_t flags);
|
||||||
|
void addEntry(uint32_t entry);
|
||||||
uint32_t org;
|
uint32_t org;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
40
src/omf.cc
40
src/omf.cc
@ -1,6 +1,6 @@
|
|||||||
/** @copyright 2020 Sean Kasun */
|
/** @copyright 2020 Sean Kasun */
|
||||||
#include "omf.h"
|
#include "omf.h"
|
||||||
#include <set>
|
#include <algorithm>
|
||||||
|
|
||||||
enum SegOp {
|
enum SegOp {
|
||||||
DONE = 0x00,
|
DONE = 0x00,
|
||||||
@ -16,6 +16,10 @@ enum SegOp {
|
|||||||
OMF::OMF(const Map &map) : map(map) {
|
OMF::OMF(const Map &map) : map(map) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool compareSegments(const Segment &a, const Segment &b) {
|
||||||
|
return a.mapped < b.mapped;
|
||||||
|
}
|
||||||
|
|
||||||
bool OMF::load(const char *filename) {
|
bool OMF::load(const char *filename) {
|
||||||
handle = TheHandle::createFromFile(filename);
|
handle = TheHandle::createFromFile(filename);
|
||||||
|
|
||||||
@ -24,6 +28,7 @@ bool OMF::load(const char *filename) {
|
|||||||
seg.bytecnt = handle->length;
|
seg.bytecnt = handle->length;
|
||||||
seg.kind = 0; // code
|
seg.kind = 0; // code
|
||||||
seg.mapped = map.org;
|
seg.mapped = map.org;
|
||||||
|
seg.data = handle;
|
||||||
segments.push_back(seg);
|
segments.push_back(seg);
|
||||||
} else {
|
} else {
|
||||||
if (!loadSegments()) {
|
if (!loadSegments()) {
|
||||||
@ -35,7 +40,15 @@ bool OMF::load(const char *filename) {
|
|||||||
if (!relocSegments()) {
|
if (!relocSegments()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// add the first entry point
|
||||||
|
for (auto &s : segments) {
|
||||||
|
if ((s.kind & 0x1f) == 0) { // code
|
||||||
|
map.addEntry(s.mapped + s.entry);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
std::sort(segments.begin(), segments.end(), compareSegments);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,7 +102,7 @@ bool OMF::loadSegments() {
|
|||||||
seg.lablen = 0xa;
|
seg.lablen = 0xa;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
handle->seek(ofs + dispname);
|
handle->seek(ofs + dispname + seg.lablen); // skip past load name
|
||||||
seg.name = handle->read(seg.lablen);
|
seg.name = handle->read(seg.lablen);
|
||||||
seg.offset = ofs + dispdata;
|
seg.offset = ofs + dispdata;
|
||||||
if (version == 1) { // convert to v2
|
if (version == 1) { // convert to v2
|
||||||
@ -120,9 +133,9 @@ bool OMF::mapSegments() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// use a memory map that denotes runs of available ram
|
// use a memory map that denotes runs of available ram
|
||||||
std::set<uint32_t> memory;
|
std::vector<uint32_t> memory;
|
||||||
memory.insert(0x10000); // min
|
memory.push_back(0x10000); // min
|
||||||
memory.insert(0xf80000); // max
|
memory.push_back(0x7f0000); // max
|
||||||
// first map any segments that know where they belong
|
// first map any segments that know where they belong
|
||||||
for (auto &seg : segments) {
|
for (auto &seg : segments) {
|
||||||
if (seg.org) {
|
if (seg.org) {
|
||||||
@ -143,8 +156,12 @@ bool OMF::mapSegments() {
|
|||||||
seg.segnum, seg.name.c_str());
|
seg.segnum, seg.name.c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
memory.insert(seg.mapped);
|
memory.push_back(seg.mapped);
|
||||||
memory.insert(seg.mapped + seg.length);
|
memory.push_back(seg.mapped + seg.length);
|
||||||
|
if (seg.mapped < memory[0]) { // below the minimum
|
||||||
|
memory[0] = seg.mapped; // new min
|
||||||
|
}
|
||||||
|
std::sort(memory.begin(), memory.end());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,8 +183,9 @@ bool OMF::mapSegments() {
|
|||||||
it++;
|
it++;
|
||||||
if (base < *it && *it - base >= seg.length) {
|
if (base < *it && *it - base >= seg.length) {
|
||||||
seg.mapped = base;
|
seg.mapped = base;
|
||||||
memory.insert(seg.mapped);
|
memory.push_back(seg.mapped);
|
||||||
memory.insert(seg.mapped + seg.length);
|
memory.push_back(seg.mapped + seg.length);
|
||||||
|
std::sort(memory.begin(), memory.end());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -354,3 +372,7 @@ void OMF::patch(std::vector<uint8_t> &array, uint32_t offset, uint8_t numBytes,
|
|||||||
array[offset + i] = value & 0xff;
|
array[offset + i] = value & 0xff;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<Segment> OMF::get() const {
|
||||||
|
return segments;
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user