From 109d3a11183ba36b0d53abfe256a92886c66a1b8 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sat, 24 Dec 2016 18:06:39 -0500 Subject: [PATCH] longa/longi directives update m/x bits. --- disasm.cpp | 38 ++++++++++++++++++++++++++------------ dumpobj.cpp | 17 ++++++++++++++--- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/disasm.cpp b/disasm.cpp index 19ca2eb..625a786 100644 --- a/disasm.cpp +++ b/disasm.cpp @@ -53,8 +53,8 @@ static constexpr const int m_S = 0x0100; static constexpr const int m_X = 0x0200; static constexpr const int m_Y = 0x0400; -static constexpr const int m_M = 0x0010; -static constexpr const int m_I = 0x0020; +static constexpr const int m_M = 0x0020; +static constexpr const int m_I = 0x0010; static constexpr const int modes[] = { @@ -264,7 +264,7 @@ static constexpr const int modes[] = 1 | mImmediate | m_I, // c0 cpy #imm 1 | mDPI | m_X, // c1 cmp (dp,x) - 1 | mAbsolute, // c2 rep # + 1 | mImmediate, // c2 rep # 1 | mDP | m_S, // c3 cmp ,s 1 | mDP, // c4 cpy &data, unsigned &flags, unsigned &pc) { switch(attr & 0xf000) { case mImmediate: printf("\t#"); break; case mDP: printf("\t<"); break; - case mAbsolute: printf("\t|"); break; + case mDPI: printf("\t(<"); break; + case mDPIL: printf("\t[<"); break; + + case mRelative: + case mBlockMove: + printf("\t"); break; + + // cop, brk are treated as absolute. + case mAbsolute: + if (size == 1) printf("\t"); + else printf("\t|"); + break; case mAbsoluteLong: printf("\t>"); break; - case mAbsoluteI: printf("("); break; - case mDPIL: printf("[<"); break; + case mAbsoluteI: printf("\t("); break; } @@ -388,7 +398,7 @@ void disasm(const std::vector &data, unsigned &flags, unsigned &pc) { } // todo -- relative, block mode. - switch(size) { + switch (size) { case 0: break; case 1: printf("$%02x", arg); break; case 2: printf("$%04x", arg); break; @@ -423,11 +433,15 @@ void disasm(const std::vector &data, unsigned &flags, unsigned &pc) { switch(op) { case 0xc2: // REP - if (arg & 0x20) flags |= m_M; - if (arg & 0x10) flags |= m_I; + flags |= (arg & 0x30); + break; + //if (arg & 0x10) flags |= m_I; + //if (arg & 0x20) flags |= m_M; + break; case 0xe2: // SEP - if (arg & 0x20) flags &= ~m_M; - if (arg & 0x10) flags &= ~m_I; + flags &= ~(arg & 0x30); + //if (arg & 0x10) flags &= ~m_I; + //if (arg & 0x20) flags &= ~m_M; break; } diff --git a/dumpobj.cpp b/dumpobj.cpp index 1045e39..eaf10d3 100644 --- a/dumpobj.cpp +++ b/dumpobj.cpp @@ -193,7 +193,7 @@ void dump_obj(const char *name, int fd) std::vector tmp(iter, iter + op); iter += op; - printf("DATA: %02x\n", op); + //printf("DATA: %02x\n", op); disasm(tmp, flags, pc); continue; } @@ -230,6 +230,8 @@ void dump_obj(const char *name, int fd) break; case OP_SHR: printf(">> "); break; case OP_SHL: printf("<< "); break; + case OP_ADD: printf("+ "); break; + case OP_SUB: printf("- "); break; default: printf("\n"); errx(EX_DATAERR, "%s: unknown expression opcode %02x", name, op); @@ -263,21 +265,25 @@ void dump_obj(const char *name, int fd) }; uint16_t size = read_16(iter); - printf("\t;DEBUG\n"); + //printf("\t;DEBUG\n"); for (unsigned i = 0; i < size; ++i) { uint8_t op = read_8(iter); switch(op) { case D_LONGA_ON: + flags |= 0x20; printf("\tlonga\ton\n"); break; case D_LONGA_OFF: + flags &= ~0x20; printf("\tlonga\toff\n"); break; case D_LONGI_ON: + flags |= 0x10; printf("\tlongi\ton\n"); break; case D_LONGI_OFF: + flags &= ~0x10; printf("\tlongi\toff\n"); break; case D_C_FILE: { @@ -314,8 +320,13 @@ void dump_obj(const char *name, int fd) printf("\t.sect\t%d\n", section); break; } + case REC_ORG: { + uint32_t org = read_32(iter); + printf("\t.org\t$%04x\n", org); + break; + } + case REC_SPACE: - case REC_ORG: case REC_RELEXP: case REC_LINE: default: