From 6c456df3bed848a1f8cab1f873cc9c7cbe747c04 Mon Sep 17 00:00:00 2001 From: Sean Date: Sun, 16 Feb 2020 22:18:50 -0700 Subject: [PATCH] started on map file --- disasm.c | 175 ++++++++++++++++++++++++++++++++++++++++------------- map.h | 6 +- src/map.cc | 25 ++++++++ src/map.h | 2 +- src/omf.cc | 6 +- src/omf.h | 1 + 6 files changed, 170 insertions(+), 45 deletions(-) create mode 100644 src/map.cc diff --git a/disasm.c b/disasm.c index 9b49012..489ed2b 100644 --- a/disasm.c +++ b/disasm.c @@ -83,6 +83,7 @@ void disassemble(uint8_t *data, size_t len, Map *map) { const char *inst = opcodes[opcode].inst; Address mode = opcodes[opcode].address; + OpType type = opcodes[opcode].type; if (smart || dos8) { mode = DB; @@ -101,6 +102,8 @@ void disassemble(uint8_t *data, size_t len, Map *map) { width--; } addr += width; + flags &= IsFlags; // clear changed flags + MapFlags oldFlags = flags; for (int i = 0; i < width; i++) { printf(" %02x", start[i]); @@ -115,13 +118,26 @@ void disassemble(uint8_t *data, size_t len, Map *map) { const char *comments = NULL; uint8_t oprlen = 0; + uint8_t oper = 0; switch (mode) { case IMP: break; case IMM: - printf("#$%02x", *ptr++); + oper = *ptr++; + printf("#$%02x", oper); oprlen = 4; + if (opcode == 0xe2) { + flags |= oper & IsFlags; + } else if (opcode == 0xc2) { + flags &= ~oper; + } + if ((flags ^ oldFlags) & IsX8) { + flags |= IsX8Changed; + } + if ((flags ^ oldFlags) & IsM8) { + flags |= IsM8Changed; + } break; case IMMM: if (flags & (IsEmu | IsM8)) { @@ -154,8 +170,13 @@ void disassemble(uint8_t *data, size_t len, Map *map) { break; case ABS: val = r16(ptr); ptr += 2; - printf("$%04x", val); - oprlen = 5; + if (type == JUMP || type == CALL) { + val |= addr & 0xff0000; // K + } else { + val |= flags & 0xff0000; // B + } + printf("$%02x/%04x", val >> 16, val & 0xffff); + oprlen = 8; comments = addressLookup(val, map); break; case ABL: @@ -166,14 +187,24 @@ void disassemble(uint8_t *data, size_t len, Map *map) { break; case ABX: val = r16(ptr); ptr += 2; - printf("$%04x, x", val); - oprlen = 8; + if (type == JUMP || type == CALL) { + val |= addr & 0xff0000; // K + } else { + val |= flags & 0xff0000; // B + } + printf("$%02x/%04x, x", val >> 16, val & 0xffff); + oprlen = 11; comments = addressLookup(val, map); break; case ABY: val = r16(ptr); ptr += 2; - printf("$%04x, y", val); - oprlen = 8; + if (type == JUMP || type == CALL) { + val |= addr & 0xff0000; // K + } else { + val |= flags & 0xff0000; // B + } + printf("$%02x/%04x, y", val >> 16, val & 0xffff); + oprlen = 11; comments = addressLookup(val, map); break; case ABLX: @@ -184,8 +215,13 @@ void disassemble(uint8_t *data, size_t len, Map *map) { break; case AIX: val = r16(ptr); ptr += 2; - printf("($%04x, x)", val); - oprlen = 10; + if (type == JUMP || type == CALL) { + val |= addr & 0xff0000; // K + } else { + val |= flags & 0xff0000; // B + } + printf("($%02x/%04x, x)", val >> 16, val & 0xffff); + oprlen = 13; comments = addressLookup(val, map); break; case ZP: @@ -206,8 +242,13 @@ void disassemble(uint8_t *data, size_t len, Map *map) { break; case IND: val = r16(ptr); ptr += 2; - printf("($%04x)", val); - oprlen = 7; + if (type == JUMP || type == CALL) { + val |= addr & 0xff0000; // K + } else { + val |= flags & 0xff0000; // B + } + printf("($%02x/%04x)", val >> 16, val & 0xffff); + oprlen = 10; comments = addressLookup(val, map); break; case INZ: @@ -268,6 +309,7 @@ void disassemble(uint8_t *data, size_t len, Map *map) { break; } + if (smart) { comments = smartportLookup(opcode); smart = false; @@ -281,6 +323,58 @@ void disassemble(uint8_t *data, size_t len, Map *map) { dos16 = false; } + // track plb + if (opcode == 0xab) { // plb, was it previously a9 xx 48? + bool bset = false; + ptr -= 4; + uint8_t lda = *ptr++; + uint8_t b = *ptr++; + uint8_t pha = *ptr++; + ptr++; + if (lda == 0xa9 && pha == 0x48) { + flags &= 0xffff; + flags |= b << 16; // set B + bset = true; + } + if (!bset) { + ptr -= 2; + uint8_t phk = *ptr++; + ptr++; + if (phk == 0x4b) { + flags &= 0xffff; + flags |= addr & 0xff0000; // B = K + bset = true; + } + } + if (!bset) { + ptr -= 7; + uint8_t lda = *ptr++; + uint8_t b = r16(ptr); ptr += 2; + ptr += 2; // sep #20 + uint8_t pha = *ptr++; + ptr++; + if (lda == 0xa9 && pha == 0x48) { + flags &= 0xffff; + flags |= b << 16; // set B + bset = true; + } + } + } + + if (opcode == 0x18) { + if (*ptr == 0xfb) { // clc xce = 16 bit mode + flags &= 0xffffff ^ IsEmu; + } + } + if (opcode == 0x38) { + if (*ptr == 0xfb) { // sec xce = 8 bit mode + flags |= IsEmu; + } + } + if ((flags ^ oldFlags) & IsEmu) { + flags |= IsEmuChanged; + } + if (opcode == 0xa2) { // ldx if (*ptr == 0x22) { // jsl if (r24(ptr + 1) == 0xe10000) { // jsl el/0000 @@ -302,42 +396,41 @@ void disassemble(uint8_t *data, size_t len, Map *map) { } } + if (flags & (IsEmuChanged | IsM8Changed | IsX8Changed)) { + for (int i = oprlen; i < 16; i++) { + printf(" "); + } + printf("; "); + } + + if (flags & IsEmuChanged) { + if (flags & IsEmu) { + printf(" 8-bit mode"); + } else { + printf(" 16-bit mode"); + } + } + if (flags & IsM8Changed) { + if (flags & IsM8) { + printf(" a.b"); + } else { + printf(" a.w"); + } + } + if (flags & IsX8Changed) { + if (flags & IsX8) { + printf(" x.b"); + } else { + printf(" x.w"); + } + } + if (comments != NULL) { for (int i = oprlen; i < 16; i++) { printf(" "); } printf("; %s", comments); } - - uint16_t nextFlags = map->mem[addr - map->minMemory]; - if (((flags ^ nextFlags) & (IsEmu | IsM8 | IsX8)) && comments == NULL && - (nextFlags & IsOpcode)) { - for (int i = oprlen; i < 16; i++) { - printf(" "); - } - printf(";"); - if ((flags ^ nextFlags) & IsEmu) { - if (nextFlags & IsEmu) { - printf(" 8-bit mode"); - } else { - printf(" 16-bit mode"); - } - } - if ((flags ^ nextFlags) & IsM8) { - if (nextFlags & IsM8) { - printf(" a.b"); - } else { - printf(" a.w"); - } - } - if ((flags ^ nextFlags) & IsX8) { - if (nextFlags & IsX8) { - printf(" x.b"); - } else { - printf(" x.w"); - } - } - } printf("\n"); } else { uint32_t dlen = 0; diff --git a/map.h b/map.h index 9ed9d0d..2320854 100644 --- a/map.h +++ b/map.h @@ -13,7 +13,11 @@ typedef enum { IsOperand = 0x04, IsX8 = 0x10, IsM8 = 0x20, - IsEmu = 0x100 + IsEmu = 0x100, + IsFlags = 0xff013f, + IsX8Changed = 0x200, + IsM8Changed = 0x400, + IsEmuChanged = 0x2000, } MapFlags; typedef struct Rule { diff --git a/src/map.cc b/src/map.cc new file mode 100644 index 0000000..69520eb --- /dev/null +++ b/src/map.cc @@ -0,0 +1,25 @@ +/** @copyright 2020 Sean Kasun */ +#include "map.h" +#include +#include + +Map::Map(const char *filename, uint32_t org, uint32_t flags) { + std::string mapname = filename; + mapname += ".regs"; + std::ifstream f(mapname, std::ios::in | std::ios::binary | std::ios::ate); + if (!f.is_open()) { + Symbol symbol; + symbol.org = org; + symbol.flags = flags; + symbols.push_back(symbol); + return; + } + std::streamoff len = f.tellg(); + char *data = new char[len + 1]; + f.seekg(0, std::ios::beg); + f.read(data, len); + f.close(); + data[len] = 0; + ConfigFile c(data, len); + +} diff --git a/src/map.h b/src/map.h index 12dad24..25707ca 100644 --- a/src/map.h +++ b/src/map.h @@ -6,5 +6,5 @@ class Map { public: - Map(const char *filename, uint32_t org, int32_t flags); + Map(const char *filename, uint32_t org, uint32_t flags); }; diff --git a/src/omf.cc b/src/omf.cc index 8664b23..2ebb8fa 100644 --- a/src/omf.cc +++ b/src/omf.cc @@ -1,5 +1,6 @@ /** @copyright 2020 Sean Kasun */ #include "omf.h" +#include OMF::OMF(const Map &map) : map(map) { } @@ -10,6 +11,8 @@ bool OMF::load(const char *filename) { if (!isOMF()) { Segment seg; seg.bytecnt = handle->length; + seg.kind = 0; // code + seg.mapped = map.org; segments.push_back(seg); } else { if (!loadSegments()) { @@ -105,7 +108,7 @@ bool OMF::mapSegments() { return true; } // use a memory map that denotes runs of available ram - std::vector memory; + std::set memory; memory.push_back(0x10000); // min memory.push_back(0xf80000); // max // first map any segments that know where they belong @@ -138,7 +141,6 @@ bool OMF::mapSegments() { if (seg.mapped < memory[0]) { // below the minimum memory[0] = seg.mapped; // calc new min } - std::sort(memory.begin(), memory.end()); } } diff --git a/src/omf.h b/src/omf.h index b927201..0ce368f 100644 --- a/src/omf.h +++ b/src/omf.h @@ -3,6 +3,7 @@ #include "handle.h" #include "map.h" +#include struct Segment { int32_t bytecnt;