mirror of
https://github.com/mrkite/regs.git
synced 2024-09-27 07:54:51 +00:00
started on map file
This commit is contained in:
parent
0a3879f4a9
commit
6c456df3be
147
disasm.c
147
disasm.c
@ -83,6 +83,7 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
|
|
||||||
const char *inst = opcodes[opcode].inst;
|
const char *inst = opcodes[opcode].inst;
|
||||||
Address mode = opcodes[opcode].address;
|
Address mode = opcodes[opcode].address;
|
||||||
|
OpType type = opcodes[opcode].type;
|
||||||
|
|
||||||
if (smart || dos8) {
|
if (smart || dos8) {
|
||||||
mode = DB;
|
mode = DB;
|
||||||
@ -101,6 +102,8 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
width--;
|
width--;
|
||||||
}
|
}
|
||||||
addr += width;
|
addr += width;
|
||||||
|
flags &= IsFlags; // clear changed flags
|
||||||
|
MapFlags oldFlags = flags;
|
||||||
|
|
||||||
for (int i = 0; i < width; i++) {
|
for (int i = 0; i < width; i++) {
|
||||||
printf(" %02x", start[i]);
|
printf(" %02x", start[i]);
|
||||||
@ -115,13 +118,26 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
|
|
||||||
const char *comments = NULL;
|
const char *comments = NULL;
|
||||||
uint8_t oprlen = 0;
|
uint8_t oprlen = 0;
|
||||||
|
uint8_t oper = 0;
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case IMP:
|
case IMP:
|
||||||
break;
|
break;
|
||||||
case IMM:
|
case IMM:
|
||||||
printf("#$%02x", *ptr++);
|
oper = *ptr++;
|
||||||
|
printf("#$%02x", oper);
|
||||||
oprlen = 4;
|
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;
|
break;
|
||||||
case IMMM:
|
case IMMM:
|
||||||
if (flags & (IsEmu | IsM8)) {
|
if (flags & (IsEmu | IsM8)) {
|
||||||
@ -154,8 +170,13 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
break;
|
break;
|
||||||
case ABS:
|
case ABS:
|
||||||
val = r16(ptr); ptr += 2;
|
val = r16(ptr); ptr += 2;
|
||||||
printf("$%04x", val);
|
if (type == JUMP || type == CALL) {
|
||||||
oprlen = 5;
|
val |= addr & 0xff0000; // K
|
||||||
|
} else {
|
||||||
|
val |= flags & 0xff0000; // B
|
||||||
|
}
|
||||||
|
printf("$%02x/%04x", val >> 16, val & 0xffff);
|
||||||
|
oprlen = 8;
|
||||||
comments = addressLookup(val, map);
|
comments = addressLookup(val, map);
|
||||||
break;
|
break;
|
||||||
case ABL:
|
case ABL:
|
||||||
@ -166,14 +187,24 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
break;
|
break;
|
||||||
case ABX:
|
case ABX:
|
||||||
val = r16(ptr); ptr += 2;
|
val = r16(ptr); ptr += 2;
|
||||||
printf("$%04x, x", val);
|
if (type == JUMP || type == CALL) {
|
||||||
oprlen = 8;
|
val |= addr & 0xff0000; // K
|
||||||
|
} else {
|
||||||
|
val |= flags & 0xff0000; // B
|
||||||
|
}
|
||||||
|
printf("$%02x/%04x, x", val >> 16, val & 0xffff);
|
||||||
|
oprlen = 11;
|
||||||
comments = addressLookup(val, map);
|
comments = addressLookup(val, map);
|
||||||
break;
|
break;
|
||||||
case ABY:
|
case ABY:
|
||||||
val = r16(ptr); ptr += 2;
|
val = r16(ptr); ptr += 2;
|
||||||
printf("$%04x, y", val);
|
if (type == JUMP || type == CALL) {
|
||||||
oprlen = 8;
|
val |= addr & 0xff0000; // K
|
||||||
|
} else {
|
||||||
|
val |= flags & 0xff0000; // B
|
||||||
|
}
|
||||||
|
printf("$%02x/%04x, y", val >> 16, val & 0xffff);
|
||||||
|
oprlen = 11;
|
||||||
comments = addressLookup(val, map);
|
comments = addressLookup(val, map);
|
||||||
break;
|
break;
|
||||||
case ABLX:
|
case ABLX:
|
||||||
@ -184,8 +215,13 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
break;
|
break;
|
||||||
case AIX:
|
case AIX:
|
||||||
val = r16(ptr); ptr += 2;
|
val = r16(ptr); ptr += 2;
|
||||||
printf("($%04x, x)", val);
|
if (type == JUMP || type == CALL) {
|
||||||
oprlen = 10;
|
val |= addr & 0xff0000; // K
|
||||||
|
} else {
|
||||||
|
val |= flags & 0xff0000; // B
|
||||||
|
}
|
||||||
|
printf("($%02x/%04x, x)", val >> 16, val & 0xffff);
|
||||||
|
oprlen = 13;
|
||||||
comments = addressLookup(val, map);
|
comments = addressLookup(val, map);
|
||||||
break;
|
break;
|
||||||
case ZP:
|
case ZP:
|
||||||
@ -206,8 +242,13 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
break;
|
break;
|
||||||
case IND:
|
case IND:
|
||||||
val = r16(ptr); ptr += 2;
|
val = r16(ptr); ptr += 2;
|
||||||
printf("($%04x)", val);
|
if (type == JUMP || type == CALL) {
|
||||||
oprlen = 7;
|
val |= addr & 0xff0000; // K
|
||||||
|
} else {
|
||||||
|
val |= flags & 0xff0000; // B
|
||||||
|
}
|
||||||
|
printf("($%02x/%04x)", val >> 16, val & 0xffff);
|
||||||
|
oprlen = 10;
|
||||||
comments = addressLookup(val, map);
|
comments = addressLookup(val, map);
|
||||||
break;
|
break;
|
||||||
case INZ:
|
case INZ:
|
||||||
@ -268,6 +309,7 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (smart) {
|
if (smart) {
|
||||||
comments = smartportLookup(opcode);
|
comments = smartportLookup(opcode);
|
||||||
smart = false;
|
smart = false;
|
||||||
@ -281,6 +323,58 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
dos16 = false;
|
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 (opcode == 0xa2) { // ldx
|
||||||
if (*ptr == 0x22) { // jsl
|
if (*ptr == 0x22) { // jsl
|
||||||
if (r24(ptr + 1) == 0xe10000) { // jsl el/0000
|
if (r24(ptr + 1) == 0xe10000) { // jsl el/0000
|
||||||
@ -302,41 +396,40 @@ void disassemble(uint8_t *data, size_t len, Map *map) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (comments != NULL) {
|
if (flags & (IsEmuChanged | IsM8Changed | IsX8Changed)) {
|
||||||
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++) {
|
for (int i = oprlen; i < 16; i++) {
|
||||||
printf(" ");
|
printf(" ");
|
||||||
}
|
}
|
||||||
printf("; ");
|
printf("; ");
|
||||||
if ((flags ^ nextFlags) & IsEmu) {
|
}
|
||||||
if (nextFlags & IsEmu) {
|
|
||||||
|
if (flags & IsEmuChanged) {
|
||||||
|
if (flags & IsEmu) {
|
||||||
printf(" 8-bit mode");
|
printf(" 8-bit mode");
|
||||||
} else {
|
} else {
|
||||||
printf(" 16-bit mode");
|
printf(" 16-bit mode");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((flags ^ nextFlags) & IsM8) {
|
if (flags & IsM8Changed) {
|
||||||
if (nextFlags & IsM8) {
|
if (flags & IsM8) {
|
||||||
printf(" a.b");
|
printf(" a.b");
|
||||||
} else {
|
} else {
|
||||||
printf(" a.w");
|
printf(" a.w");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((flags ^ nextFlags) & IsX8) {
|
if (flags & IsX8Changed) {
|
||||||
if (nextFlags & IsX8) {
|
if (flags & IsX8) {
|
||||||
printf(" x.b");
|
printf(" x.b");
|
||||||
} else {
|
} else {
|
||||||
printf(" x.w");
|
printf(" x.w");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (comments != NULL) {
|
||||||
|
for (int i = oprlen; i < 16; i++) {
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
printf("; %s", comments);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
} else {
|
} else {
|
||||||
|
6
map.h
6
map.h
@ -13,7 +13,11 @@ typedef enum {
|
|||||||
IsOperand = 0x04,
|
IsOperand = 0x04,
|
||||||
IsX8 = 0x10,
|
IsX8 = 0x10,
|
||||||
IsM8 = 0x20,
|
IsM8 = 0x20,
|
||||||
IsEmu = 0x100
|
IsEmu = 0x100,
|
||||||
|
IsFlags = 0xff013f,
|
||||||
|
IsX8Changed = 0x200,
|
||||||
|
IsM8Changed = 0x400,
|
||||||
|
IsEmuChanged = 0x2000,
|
||||||
} MapFlags;
|
} MapFlags;
|
||||||
|
|
||||||
typedef struct Rule {
|
typedef struct Rule {
|
||||||
|
25
src/map.cc
Normal file
25
src/map.cc
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/** @copyright 2020 Sean Kasun */
|
||||||
|
#include "map.h"
|
||||||
|
#include <string>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
@ -6,5 +6,5 @@
|
|||||||
|
|
||||||
class Map {
|
class Map {
|
||||||
public:
|
public:
|
||||||
Map(const char *filename, uint32_t org, int32_t flags);
|
Map(const char *filename, uint32_t org, uint32_t flags);
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/** @copyright 2020 Sean Kasun */
|
/** @copyright 2020 Sean Kasun */
|
||||||
#include "omf.h"
|
#include "omf.h"
|
||||||
|
#include <set>
|
||||||
|
|
||||||
OMF::OMF(const Map &map) : map(map) {
|
OMF::OMF(const Map &map) : map(map) {
|
||||||
}
|
}
|
||||||
@ -10,6 +11,8 @@ bool OMF::load(const char *filename) {
|
|||||||
if (!isOMF()) {
|
if (!isOMF()) {
|
||||||
Segment seg;
|
Segment seg;
|
||||||
seg.bytecnt = handle->length;
|
seg.bytecnt = handle->length;
|
||||||
|
seg.kind = 0; // code
|
||||||
|
seg.mapped = map.org;
|
||||||
segments.push_back(seg);
|
segments.push_back(seg);
|
||||||
} else {
|
} else {
|
||||||
if (!loadSegments()) {
|
if (!loadSegments()) {
|
||||||
@ -105,7 +108,7 @@ 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::vector<uint32_t> memory;
|
std::set<uint32_t> memory;
|
||||||
memory.push_back(0x10000); // min
|
memory.push_back(0x10000); // min
|
||||||
memory.push_back(0xf80000); // max
|
memory.push_back(0xf80000); // max
|
||||||
// first map any segments that know where they belong
|
// first map any segments that know where they belong
|
||||||
@ -138,7 +141,6 @@ bool OMF::mapSegments() {
|
|||||||
if (seg.mapped < memory[0]) { // below the minimum
|
if (seg.mapped < memory[0]) { // below the minimum
|
||||||
memory[0] = seg.mapped; // calc new min
|
memory[0] = seg.mapped; // calc new min
|
||||||
}
|
}
|
||||||
std::sort(memory.begin(), memory.end());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user