summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mcs51/mcs51dasm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mcs51/mcs51dasm.cpp')
-rw-r--r--src/devices/cpu/mcs51/mcs51dasm.cpp721
1 files changed, 319 insertions, 402 deletions
diff --git a/src/devices/cpu/mcs51/mcs51dasm.cpp b/src/devices/cpu/mcs51/mcs51dasm.cpp
index b96ae46a4a1..fce9b90208f 100644
--- a/src/devices/cpu/mcs51/mcs51dasm.cpp
+++ b/src/devices/cpu/mcs51/mcs51dasm.cpp
@@ -24,223 +24,215 @@
*****************************************************************************/
#include "emu.h"
-#include "debugger.h"
-#include "mcs51.h"
+#include "mcs51dasm.h"
+
+// Note: addresses >= 0x100 are bit addresses
+
+const mcs51_disassembler::mem_info mcs51_disassembler::default_names[] = {
+ { 0x00, "rb0r0" },
+ { 0x01, "rb0r1" },
+ { 0x02, "rb0r2" },
+ { 0x03, "rb0r3" },
+ { 0x04, "rb0r4" },
+ { 0x05, "rb0r5" },
+ { 0x06, "rb0r6" },
+ { 0x07, "rb0r7" },
+ { 0x08, "rb1r0" },
+ { 0x09, "rb1r1" },
+ { 0x0a, "rb1r2" },
+ { 0x0b, "rb1r3" },
+ { 0x0c, "rb1r4" },
+ { 0x0d, "rb1r5" },
+ { 0x0e, "rb1r6" },
+ { 0x0f, "rb1r7" },
+ { 0x10, "rb2r0" },
+ { 0x11, "rb2r1" },
+ { 0x12, "rb2r2" },
+ { 0x13, "rb2r3" },
+ { 0x14, "rb2r4" },
+ { 0x15, "rb2r5" },
+ { 0x16, "rb2r6" },
+ { 0x17, "rb2r7" },
+ { 0x18, "rb3r0" },
+ { 0x19, "rb3r1" },
+ { 0x1a, "rb3r2" },
+ { 0x1b, "rb3r3" },
+ { 0x1c, "rb3r4" },
+ { 0x1d, "rb3r5" },
+ { 0x1e, "rb3r6" },
+ { 0x1f, "rb3r7" },
+
+ { 0x80, "p0" },
+ { 0x81, "sp" },
+ { 0x82, "dpl" },
+ { 0x83, "dph" },
+ { 0x87, "pcon" },
+ { 0x88, "tcon" },
+ { 0x89, "tmod" },
+ { 0x8a, "tl0" },
+ { 0x8b, "tl1" },
+ { 0x8c, "th0" },
+ { 0x8d, "th1" },
+ { 0x90, "p1" },
+ { 0x98, "scon" },
+ { 0x99, "sbuf" },
+ { 0xa0, "p2" },
+ { 0xa8, "ie" },
+ { 0xb0, "p3" },
+ { 0xb8, "ip" },
+ { 0xd0, "psw" },
+ { 0xe0, "acc" },
+ { 0xf0, "b" },
+
+ { 0x188, "it0" },
+ { 0x189, "ie0" },
+ { 0x18a, "it1" },
+ { 0x18b, "ie1" },
+ { 0x18c, "tr0" },
+ { 0x18d, "tf0" },
+ { 0x18e, "tr1" },
+ { 0x18f, "tf1" },
+
+ { 0x198, "ri" },
+ { 0x199, "ti" },
+ { 0x19a, "rb8" },
+ { 0x19b, "tb8" },
+ { 0x19c, "ren" },
+ { 0x19d, "sm2" },
+ { 0x19e, "sm1" },
+ { 0x19f, "sm0" },
+
+ { 0x1a8, "ex0" },
+ { 0x1a9, "et0" },
+ { 0x1aa, "ex1" },
+ { 0x1ab, "et1" },
+ { 0x1ac, "es" },
+ { 0x1ad, "ie.5" },
+ { 0x1ae, "ie.6" },
+ { 0x1af, "ea" },
-enum
-{
- FEATURE_NONE = 0x00,
- FEATURE_I8052 = 0x01,
- FEATURE_CMOS = 0x02,
- FEATURE_I80C52 = 0x04,
- FEATURE_DS5002FP = 0x08,
- FEATURE_I83C751 = 0x08
+ /* FIXME: port 3 - depends on external circuits and not really
+ * implemented in the core. TBD */
+ { 0x1b0, "rxd" },
+ { 0x1b1, "txd" },
+ { 0x1b2, "int0" },
+ { 0x1b3, "int1" },
+ { 0x1b4, "t0" },
+ { 0x1b5, "t1" },
+ { 0x1b6, "wr" },
+ { 0x1b7, "rd" },
+
+ { 0x1b8, "px0" },
+ { 0x1b9, "pt0" },
+ { 0x1ba, "px1" },
+ { 0x1bb, "pt1" },
+ { 0x1bc, "ps" },
+ { 0x1bd, "ip.5" },
+ { 0x1be, "ip.6" },
+ { 0x1bf, "ip.7" },
+
+ { 0x1d0, "p" },
+ { 0x1d1, "psw.1" },
+ { 0x1d2, "ov" },
+ { 0x1d3, "rs0" },
+ { 0x1d4, "rs1" },
+ { 0x1d5, "f0" },
+ { 0x1d6, "ac" },
+ { 0x1d7, "cy" },
+
+ { -1 }
};
+const mcs51_disassembler::mem_info mcs51_disassembler::i8052_names[] = {
+ { 0xc8, "t2con" },
+ { 0xca, "rcap2l" },
+ { 0xcb, "rcap2h" },
+ { 0xcc, "tl2" },
+ { 0xcd, "th2" },
+
+ { 0x1ad, "et2" },
+ { 0x1bd, "pt2" },
+
+ { 0x1c8, "cprl2" },
+ { 0x1c9, "ct2" },
+ { 0x1ca, "tr2" },
+ { 0x1cb, "exen2" },
+ { 0x1cc, "tclk" },
+ { 0x1cd, "rclk" },
+ { 0x1ce, "exf2" },
+ { 0x1cf, "tf2" },
-#define SHOW_MEMORY_NAMES 1
+ { -1 }
+};
-#ifdef SHOW_MEMORY_NAMES
+const mcs51_disassembler::mem_info mcs51_disassembler::i80c52_names[] = {
+ { 0xb7, "iph" },
+ { 0xa9, "saddr" },
+ { 0xb9, "saden" },
-/*Display the memory address names for data & bit address access*/
+ { -1 }
+};
-//SFR Names
+const mcs51_disassembler::mem_info mcs51_disassembler::ds5002fp_names[] = {
+ { 0x8e, "pwcm" },
+ { 0x8f, "pwmp" },
+ { 0xc1, "crcr" },
+ { 0xc2, "crcl" },
+ { 0xc3, "crch" },
+ { 0xc6, "mcon" },
+ { 0xc7, "ta" },
+ { 0xcf, "rnr" },
+ { 0xd8, "rpctl" },
+ { 0xd9, "rps" },
+
+ { 0x1d8, "rg0" },
+ { 0x1d9, "rpc" },
+ { 0x1da, "dma" },
+ { 0x1db, "ibi" },
+ { 0x1dc, "ae" },
+ { 0x1dd, "exbs" },
+ { 0x1de, "d8.6" },
+ { 0x1df, "rnr" },
-static const struct {
- int feature;
- int addr;
- const char *name;
-} mem_name_feature[] =
-{
- { FEATURE_NONE, 0x00, "rb0r0" },
- { FEATURE_NONE, 0x01, "rb0r1" },
- { FEATURE_NONE, 0x02, "rb0r2" },
- { FEATURE_NONE, 0x03, "rb0r3" },
- { FEATURE_NONE, 0x04, "rb0r4" },
- { FEATURE_NONE, 0x05, "rb0r5" },
- { FEATURE_NONE, 0x06, "rb0r6" },
- { FEATURE_NONE, 0x07, "rb0r7" },
- { FEATURE_NONE, 0x08, "rb1r0" },
- { FEATURE_NONE, 0x09, "rb1r1" },
- { FEATURE_NONE, 0x0a, "rb1r2" },
- { FEATURE_NONE, 0x0b, "rb1r3" },
- { FEATURE_NONE, 0x0c, "rb1r4" },
- { FEATURE_NONE, 0x0d, "rb1r5" },
- { FEATURE_NONE, 0x0e, "rb1r6" },
- { FEATURE_NONE, 0x0f, "rb1r7" },
- { FEATURE_NONE, 0x10, "rb2r0" },
- { FEATURE_NONE, 0x11, "rb2r1" },
- { FEATURE_NONE, 0x12, "rb2r2" },
- { FEATURE_NONE, 0x13, "rb2r3" },
- { FEATURE_NONE, 0x14, "rb2r4" },
- { FEATURE_NONE, 0x15, "rb2r5" },
- { FEATURE_NONE, 0x16, "rb2r6" },
- { FEATURE_NONE, 0x17, "rb2r7" },
- { FEATURE_NONE, 0x18, "rb3r0" },
- { FEATURE_NONE, 0x19, "rb3r1" },
- { FEATURE_NONE, 0x1a, "rb3r2" },
- { FEATURE_NONE, 0x1b, "rb3r3" },
- { FEATURE_NONE, 0x1c, "rb3r4" },
- { FEATURE_NONE, 0x1d, "rb3r5" },
- { FEATURE_NONE, 0x1e, "rb3r6" },
- { FEATURE_NONE, 0x1f, "rb3r7" },
-
- { FEATURE_NONE, 0x80, "p0" },
- { FEATURE_NONE, 0x81, "sp" },
- { FEATURE_NONE, 0x82, "dpl" },
- { FEATURE_NONE, 0x83, "dph" },
- { FEATURE_NONE, 0x87, "pcon" },
- { FEATURE_NONE, 0x88, "tcon" },
- { FEATURE_NONE, 0x89, "tmod" },
- { FEATURE_NONE, 0x8a, "tl0" },
- { FEATURE_NONE, 0x8b, "tl1" },
- { FEATURE_NONE, 0x8c, "th0" },
- { FEATURE_NONE, 0x8d, "th1" },
- { FEATURE_NONE, 0x90, "p1" },
- { FEATURE_NONE, 0x98, "scon" },
- { FEATURE_NONE, 0x99, "sbuf" },
- { FEATURE_NONE, 0xa0, "p2" },
- { FEATURE_NONE, 0xa8, "ie" },
- { FEATURE_NONE, 0xb0, "p3" },
- { FEATURE_NONE, 0xb8, "ip" },
- { FEATURE_NONE, 0xd0, "psw" },
- { FEATURE_NONE, 0xe0, "acc" },
- { FEATURE_NONE, 0xf0, "b" },
-
- { FEATURE_I8052, 0xc8, "t2con" },
- { FEATURE_I8052, 0xca, "rcap2l" },
- { FEATURE_I8052, 0xcb, "rcap2h" },
- { FEATURE_I8052, 0xcc, "tl2" },
- { FEATURE_I8052, 0xcd, "th2" },
-
- { FEATURE_I80C52, 0xb7, "iph" },
- { FEATURE_I80C52, 0xa9, "saddr" },
- { FEATURE_I80C52, 0xb9, "saden" },
-
- { FEATURE_DS5002FP, 0x8e, "pwcm" },
- { FEATURE_DS5002FP, 0x8f, "pwmp" },
- { FEATURE_DS5002FP, 0xc1, "crcr" },
- { FEATURE_DS5002FP, 0xc2, "crcl" },
- { FEATURE_DS5002FP, 0xc3, "crch" },
- { FEATURE_DS5002FP, 0xc6, "mcon" },
- { FEATURE_DS5002FP, 0xc7, "ta" },
- { FEATURE_DS5002FP, 0xcf, "rnr" },
- { FEATURE_DS5002FP, 0xd8, "rpctl" },
- { FEATURE_DS5002FP, 0xd9, "rps" },
-
- { FEATURE_I83C751, 0x98, "i2con" },
- { FEATURE_I83C751, 0x99, "i2dat" },
- { FEATURE_I83C751, 0xd8, "i2cfg" },
- { FEATURE_I83C751, 0xf8, "i2sta" }, /* read only */
-
- /* bit addresses */
-
- { FEATURE_NONE, 0x188, "it0" },
- { FEATURE_NONE, 0x189, "ie0" },
- { FEATURE_NONE, 0x18a, "it1" },
- { FEATURE_NONE, 0x18b, "ie1" },
- { FEATURE_NONE, 0x18c, "tr0" },
- { FEATURE_NONE, 0x18d, "tf0" },
- { FEATURE_NONE, 0x18e, "tr1" },
- { FEATURE_NONE, 0x18f, "tf1" },
-
- { FEATURE_NONE, 0x198, "ri" },
- { FEATURE_NONE, 0x199, "ti" },
- { FEATURE_NONE, 0x19a, "rb8" },
- { FEATURE_NONE, 0x19b, "tb8" },
- { FEATURE_NONE, 0x19c, "ren" },
- { FEATURE_NONE, 0x19d, "sm2" },
- { FEATURE_NONE, 0x19e, "sm1" },
- { FEATURE_NONE, 0x19f, "sm0" },
-
- { FEATURE_I83C751, 0x198, "xstp" }, /* read: no function */
- { FEATURE_I83C751, 0x199, "xstr" }, /* read: MASTER */
- { FEATURE_I83C751, 0x19a, "cstp" }, /* read: STP */
- { FEATURE_I83C751, 0x19b, "cstr" }, /* read: STR */
- { FEATURE_I83C751, 0x19c, "carl" }, /* read: ARL */
- { FEATURE_I83C751, 0x19d, "cdr" }, /* read: DRDY */
- { FEATURE_I83C751, 0x19e, "idle" }, /* read: ATN */
- { FEATURE_I83C751, 0x19f, "cxa" }, /* read: RDAT */
-
- { FEATURE_NONE, 0x1a8, "ex0" },
- { FEATURE_NONE, 0x1a9, "et0" },
- { FEATURE_NONE, 0x1aa, "ex1" },
- { FEATURE_NONE, 0x1ab, "et1" },
- { FEATURE_NONE, 0x1ac, "es" },
- { FEATURE_NONE, 0x1ad, "ie.5" },
- { FEATURE_NONE, 0x1ae, "ie.6" },
- { FEATURE_NONE, 0x1af, "ea" },
-
- { FEATURE_I83C751, 0x1ac, "ei2" },
- { FEATURE_I8052, 0x1ad, "et2" },
+ { -1 }
+};
- /* FIXME: port 3 - depends on external circuits and not really
- * implemented in the core. TBD */
- { FEATURE_NONE, 0x1b0, "rxd" },
- { FEATURE_NONE, 0x1b1, "txd" },
- { FEATURE_NONE, 0x1b2, "int0" },
- { FEATURE_NONE, 0x1b3, "int1" },
- { FEATURE_NONE, 0x1b4, "t0" },
- { FEATURE_NONE, 0x1b5, "t1" },
- { FEATURE_NONE, 0x1b6, "wr" },
- { FEATURE_NONE, 0x1b7, "rd" },
-
- { FEATURE_NONE, 0x1b8, "px0" },
- { FEATURE_NONE, 0x1b9, "pt0" },
- { FEATURE_NONE, 0x1ba, "px1" },
- { FEATURE_NONE, 0x1bb, "pt1" },
- { FEATURE_NONE, 0x1bc, "ps" },
- { FEATURE_NONE, 0x1bd, "ip.5" },
- { FEATURE_NONE, 0x1be, "ip.6" },
- { FEATURE_NONE, 0x1bf, "ip.7" },
-
- { FEATURE_I8052, 0x1bd, "pt2" },
- { FEATURE_I83C751, 0x1bc, "pi2" },
-
- { FEATURE_I8052, 0x1c8, "cprl2" },
- { FEATURE_I8052, 0x1c9, "ct2" },
- { FEATURE_I8052, 0x1ca, "tr2" },
- { FEATURE_I8052, 0x1cb, "exen2" },
- { FEATURE_I8052, 0x1cc, "tclk" },
- { FEATURE_I8052, 0x1cd, "rclk" },
- { FEATURE_I8052, 0x1ce, "exf2" },
- { FEATURE_I8052, 0x1cf, "tf2" },
-
- { FEATURE_NONE, 0x1d0, "p" },
- { FEATURE_NONE, 0x1d1, "psw.1" },
- { FEATURE_NONE, 0x1d2, "ov" },
- { FEATURE_NONE, 0x1d3, "rs0" },
- { FEATURE_NONE, 0x1d4, "rs1" },
- { FEATURE_NONE, 0x1d5, "f0" },
- { FEATURE_NONE, 0x1d6, "ac" },
- { FEATURE_NONE, 0x1d7, "cy" },
-
- { FEATURE_DS5002FP, 0x1d8, "rg0" },
- { FEATURE_DS5002FP, 0x1d9, "rpc" },
- { FEATURE_DS5002FP, 0x1da, "dma" },
- { FEATURE_DS5002FP, 0x1db, "ibi" },
- { FEATURE_DS5002FP, 0x1dc, "ae" },
- { FEATURE_DS5002FP, 0x1dd, "exbs" },
- { FEATURE_DS5002FP, 0x1de, "d8.6" },
- { FEATURE_DS5002FP, 0x1df, "rnr" },
-
- { FEATURE_I83C751, 0x1d8, "ct0" },
- { FEATURE_I83C751, 0x1d9, "ct1" },
- { FEATURE_I83C751, 0x1da, "i2cfg.2" },
- { FEATURE_I83C751, 0x1db, "i2cfg.3" },
- { FEATURE_I83C751, 0x1dc, "tirun" },
- { FEATURE_I83C751, 0x1dd, "clrti" },
- { FEATURE_I83C751, 0x1de, "masterq" },
- { FEATURE_I83C751, 0x1df, "slaven" },
-
- { FEATURE_I83C751, 0x1f8, "xstp" },
- { FEATURE_I83C751, 0x1f9, "xstr" },
- { FEATURE_I83C751, 0x1fa, "makstp" },
- { FEATURE_I83C751, 0x1fb, "makstr" },
- { FEATURE_I83C751, 0x1fc, "xactv" },
- { FEATURE_I83C751, 0x1fd, "xdata" },
- { FEATURE_I83C751, 0x1fe, "idle" },
- { FEATURE_I83C751, 0x1ff, "i2sta.7" },
+const mcs51_disassembler::mem_info mcs51_disassembler::i8xc751_names[] = {
+ { 0x98, "i2con" },
+ { 0x99, "i2dat" },
+ { 0xd8, "i2cfg" },
+ { 0xf8, "i2sta" }, /* read only */
+
+ { 0x198, "xstp" }, /* read: no function */
+ { 0x199, "xstr" }, /* read: MASTER */
+ { 0x19a, "cstp" }, /* read: STP */
+ { 0x19b, "cstr" }, /* read: STR */
+ { 0x19c, "carl" }, /* read: ARL */
+ { 0x19d, "cdr" }, /* read: DRDY */
+ { 0x19e, "idle" }, /* read: ATN */
+ { 0x19f, "cxa" }, /* read: RDAT */
+
+ { 0x1ac, "ei2" },
+
+ { 0x1bc, "pi2" },
+
+ { 0x1d8, "ct0" },
+ { 0x1d9, "ct1" },
+ { 0x1da, "i2cfg.2" },
+ { 0x1db, "i2cfg.3" },
+ { 0x1dc, "tirun" },
+ { 0x1dd, "clrti" },
+ { 0x1de, "masterq" },
+ { 0x1df, "slaven" },
+
+ { 0x1f8, "xstp" },
+ { 0x1f9, "xstr" },
+ { 0x1fa, "makstp" },
+ { 0x1fb, "makstr" },
+ { 0x1fc, "xactv" },
+ { 0x1fd, "xdata" },
+ { 0x1fe, "idle" },
+ { 0x1ff, "i2sta.7" },
/* unknown
* "ibf", "obf", "idsm", "obfc", e8 - eb
@@ -250,97 +242,67 @@ static const struct {
{ -1 }
};
-static void init_mem_names(int feature_set, const char **mem_names)
+mcs51_disassembler::mcs51_disassembler()
{
- int i;
- int feature;
-
- /* Set defaults / i8051 */
- for (i = 0; feature = mem_name_feature[i].feature, feature >= 0; i++)
- {
- if ( feature == FEATURE_NONE )
- mem_names[mem_name_feature[i].addr] = mem_name_feature[i].name;
- }
-
- /* Set specific memory names */
- for (i = 0; feature = mem_name_feature[i].feature, feature >= 0; i++)
- {
- if (feature & feature_set)
- mem_names[mem_name_feature[i].addr] = mem_name_feature[i].name;
- }
+}
+void mcs51_disassembler::add_names(const mem_info *info)
+{
+ for(unsigned int i=0; info[i].addr >= 0; i++)
+ m_names[info[i].addr] = info[i].name;
}
-static const char *get_data_address( const char **mem_names, uint8_t arg )
+u32 mcs51_disassembler::opcode_alignment() const
{
- static char buffer_array[4][32];
- static int whichbuf;
- char *buffer = &buffer_array[++whichbuf % 4][0];
+ return 1;
+}
+
- if (mem_names[arg] == nullptr)
- sprintf(buffer,"$%02X",arg);
+std::string mcs51_disassembler::get_data_address( uint8_t arg ) const
+{
+ auto i = m_names.find(arg);
+ if (i == m_names.end())
+ return util::string_format("$%02X", arg);
else
- sprintf(buffer,"%s", mem_names[arg]);
- return buffer;
+ return i->second;
}
-static const char *get_bit_address( const char **mem_names, uint8_t arg )
+std::string mcs51_disassembler::get_bit_address( uint8_t arg ) const
{
- static char buffer[32];
-
if(arg < 0x80)
{
//Bit address 0-7F can be referred to as 20.0, 20.1, to 20.7 for address 0, and 2f.0,2f.1 to 2f.7 for address 7f
if(arg < 0x7f)
- sprintf(buffer,"$%02X.%d",(arg >> 3) | 0x20, arg & 0x07);
+ return util::string_format("$%02X.%d", (arg >> 3) | 0x20, arg & 0x07);
else
- sprintf(buffer,"$%02X",arg);
+ return util::string_format("$%02X", arg);
}
else
{
- if (mem_names[arg | 0x100] == nullptr)
+ auto i = m_names.find(arg | 0x100);
+ if (i == m_names.end())
{
- if (mem_names[arg & 0xf8] == nullptr)
- sprintf(buffer,"$%02X.%d", arg & 0xf8, arg & 0x07);
+ i = m_names.find(arg & 0xf8);
+ if (i == m_names.end())
+ return util::string_format("$%02X.%d", arg & 0xf8, arg & 0x07);
else
- sprintf(buffer,"%s.%d", mem_names[arg & 0xf8], arg & 0x07);
+ return util::string_format("%s.%d", i->second, arg & 0x07);
}
else
- sprintf(buffer,"%s", mem_names[arg | 0x100]);
+ return i->second;
}
- return buffer;
}
-#else
-
-/*Just display the actual memory address for data & bit address access*/
-
-static const char *get_data_address( uint8_t arg )
-{
- static char buffer[32];
- sprintf(buffer,"$%02X",arg);
- return buffer;
-}
-
-static const char *get_bit_address( uint8_t arg )
-{
- static char buffer[32];
- sprintf(buffer,"$%02X",arg);
- return buffer;
-}
-
-#endif
-
-static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram)
+offs_t mcs51_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
uint32_t flags = 0;
unsigned PC = pc;
- const char *sym, *sym2;
+ std::string sym, sym2;
uint8_t op, data;
uint16_t addr;
int8_t rel;
- op = oprom[PC++ - pc];
+ op = opcodes.r8(PC++);
switch( op )
{
//NOP
@@ -357,15 +319,15 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
case 0xa1:
case 0xc1:
case 0xe1:
- addr = opram[PC++ - pc];
+ addr = params.r8(PC++);
addr|= (PC & 0xf800) | ((op & 0xe0) << 3);
util::stream_format(stream, "ajmp $%04X", addr);
break;
//LJMP code addr
case 0x02: /* 1: 0000 0010 */
- addr = (opram[PC++ - pc]<<8) & 0xff00;
- addr|= opram[PC++ - pc];
+ addr = (params.r8(PC++)<<8) & 0xff00;
+ addr|= params.r8(PC++);
util::stream_format(stream, "ljmp $%04X", addr);
break;
@@ -381,7 +343,7 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//INC data addr
case 0x05: /* 1: 0000 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "inc %s", sym);
break;
@@ -405,8 +367,8 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//JBC bit addr, code addr
case 0x10: /* 1: 0001 0000 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
- rel = opram[PC++ - pc];
+ sym = get_bit_address(params.r8(PC++));
+ rel = params.r8(PC++);
util::stream_format(stream, "jbc %s,$%04X", sym, PC + rel);
break;
@@ -419,17 +381,17 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
case 0xb1:
case 0xd1:
case 0xf1:
- util::stream_format(stream, "acall $%04X", (PC & 0xf800) | ((op & 0xe0) << 3) | opram[PC - pc]);
+ util::stream_format(stream, "acall $%04X", (PC & 0xf800) | ((op & 0xe0) << 3) | params.r8(PC));
PC++;
- flags = DASMFLAG_STEP_OVER;
+ flags = STEP_OVER;
break;
//LCALL code addr
case 0x12: /* 1: 0001 0010 */
- addr = (opram[PC++ - pc]<<8) & 0xff00;
- addr|= opram[PC++ - pc];
+ addr = (params.r8(PC++)<<8) & 0xff00;
+ addr|= params.r8(PC++);
util::stream_format(stream, "lcall $%04X", addr);
- flags = DASMFLAG_STEP_OVER;
+ flags = STEP_OVER;
break;
//RRC A
@@ -444,7 +406,7 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//DEC data addr
case 0x15: /* 1: 0001 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "dec %s", sym);
break;
@@ -469,15 +431,15 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//JB bit addr, code addr
case 0x20: /* 1: 0010 0000 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
- rel = opram[PC++ - pc];
+ sym = get_bit_address(params.r8(PC++));
+ rel = params.r8(PC++);
util::stream_format(stream, "jb %s,$%04X", sym, (PC + rel));
break;
//RET
case 0x22: /* 1: 0010 0010 */
util::stream_format(stream, "ret");
- flags = DASMFLAG_STEP_OUT;
+ flags = STEP_OUT;
break;
//RL A
@@ -487,12 +449,12 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//ADD A, #data
case 0x24: /* 1: 0010 0100 */
- util::stream_format(stream, "add a,#$%02X", opram[PC++ - pc]);
+ util::stream_format(stream, "add a,#$%02X", params.r8(PC++));
break;
//ADD A, data addr
case 0x25: /* 1: 0010 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "add a,%s", sym);
break;
@@ -517,15 +479,15 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//JNB bit addr, code addr
case 0x30: /* 1: 0011 0000 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
- rel = opram[PC++ - pc];
+ sym = get_bit_address(params.r8(PC++));
+ rel = params.r8(PC++);
util::stream_format(stream, "jnb %s,$%04X", sym, (PC + rel));
break;
//RETI
case 0x32: /* 1: 0011 0010 */
util::stream_format(stream, "reti");
- flags = DASMFLAG_STEP_OUT;
+ flags = STEP_OUT;
break;
//RLC A
@@ -535,12 +497,12 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//ADDC A, #data
case 0x34: /* 1: 0011 0100 */
- util::stream_format(stream, "addc a,#$%02X", opram[PC++ - pc]);
+ util::stream_format(stream, "addc a,#$%02X", params.r8(PC++));
break;
//ADDC A, data addr
case 0x35: /* 1: 0011 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "addc a,%s", sym);
break;
@@ -564,31 +526,31 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//JC code addr
case 0x40: /* 1: 0100 0000 */
- rel = opram[PC++ - pc];
+ rel = params.r8(PC++);
util::stream_format(stream, "jc $%04X", PC + rel);
break;
//ORL data addr, A
case 0x42: /* 1: 0100 0010 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "orl %s,a", sym);
break;
//ORL data addr, #data
case 0x43: /* 1: 0100 0011 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
- util::stream_format(stream, "orl %s,#$%02X", sym, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
+ util::stream_format(stream, "orl %s,#$%02X", sym, params.r8(PC++));
break;
//Unable to Test
//ORL A, #data
case 0x44: /* 1: 0100 0100 */
- util::stream_format(stream, "orl a,#$%02X", opram[PC++ - pc]);
+ util::stream_format(stream, "orl a,#$%02X", params.r8(PC++));
break;
//ORL A, data addr
case 0x45: /* 1: 0100 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "orl a,%s", sym);
break;
@@ -612,32 +574,32 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//JNC code addr
case 0x50: /* 1: 0101 0000 */
- rel = opram[PC++ - pc];
+ rel = params.r8(PC++);
util::stream_format(stream, "jnc $%04X", PC + rel);
break;
//Unable to test
//ANL data addr, A
case 0x52: /* 1: 0101 0010 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "anl %s,a", sym);
break;
//Unable to test
//ANL data addr, #data
case 0x53: /* 1: 0101 0011 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
- util::stream_format(stream, "anl %s,#$%02X", sym, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
+ util::stream_format(stream, "anl %s,#$%02X", sym, params.r8(PC++));
break;
//ANL A, #data
case 0x54: /* 1: 0101 0100 */
- util::stream_format(stream, "anl a,#$%02X", opram[PC++ - pc]);
+ util::stream_format(stream, "anl a,#$%02X", params.r8(PC++));
break;
//ANL A, data addr
case 0x55: /* 1: 0101 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "anl a,%s", sym);
break;
@@ -662,31 +624,31 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//JZ code addr
case 0x60: /* 1: 0110 0000 */
- rel = opram[PC++ - pc];
+ rel = params.r8(PC++);
util::stream_format(stream, "jz $%04X", PC + rel);
break;
//Unable to test
//XRL data addr, A
case 0x62: /* 1: 0110 0010 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "xrl %s,a", sym);
break;
//XRL data addr, #data
case 0x63: /* 1: 0110 0011 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
- util::stream_format(stream, "xrl %s,#$%02X", sym, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
+ util::stream_format(stream, "xrl %s,#$%02X", sym, params.r8(PC++));
break;
//XRL A, #data
case 0x64: /* 1: 0110 0100 */
- util::stream_format(stream, "xrl a,#$%02X", opram[PC++ - pc]);
+ util::stream_format(stream, "xrl a,#$%02X", params.r8(PC++));
break;
//XRL A, data addr
case 0x65: /* 1: 0110 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "xrl a,%s", sym);
break;
@@ -711,14 +673,14 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//JNZ code addr
case 0x70: /* 1: 0111 0000 */
- rel = opram[PC++ - pc];
+ rel = params.r8(PC++);
util::stream_format(stream, "jnz $%04X", PC + rel);
break;
//Unable to test
//ORL C, bit addr
case 0x72: /* 1: 0111 0010 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
+ sym = get_bit_address(params.r8(PC++));
util::stream_format(stream, "orl c,%s", sym);
break;
@@ -730,20 +692,20 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//MOV A, #data
case 0x74: /* 1: 0111 0100 */
- util::stream_format(stream, "mov a,#$%02X", opram[PC++ - pc]);
+ util::stream_format(stream, "mov a,#$%02X", params.r8(PC++));
break;
//MOV data addr, #data
case 0x75: /* 1: 0111 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
- util::stream_format(stream, "mov %s,#$%02X", sym, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
+ util::stream_format(stream, "mov %s,#$%02X", sym, params.r8(PC++));
break;
//Unable to test
//MOV @R0/@R1, #data /* 1: 0111 011i */
case 0x76:
case 0x77:
- util::stream_format(stream, "mov @r%d,#$%02X", op&1, opram[PC++ - pc]);
+ util::stream_format(stream, "mov @r%d,#$%02X", op&1, params.r8(PC++));
break;
//MOV R0 to R7, #data /* 1: 0111 1rrr */
@@ -755,18 +717,18 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
case 0x7d:
case 0x7e:
case 0x7f:
- util::stream_format(stream, "mov r%d,#$%02X", (op & 7), opram[PC++ - pc]);
+ util::stream_format(stream, "mov r%d,#$%02X", (op & 7), params.r8(PC++));
break;
//SJMP code addr
case 0x80: /* 1: 1000 0000 */
- rel = opram[PC++ - pc];
+ rel = params.r8(PC++);
util::stream_format(stream, "sjmp $%04X", PC + rel);
break;
//ANL C, bit addr
case 0x82: /* 1: 1000 0010 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
+ sym = get_bit_address(params.r8(PC++));
util::stream_format(stream, "anl c,%s", sym);
break;
@@ -782,8 +744,8 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//MOV data addr, data addr (Note: 1st address is src, 2nd is dst, but the mov command works as mov dst,src)
case 0x85: /* 1: 1000 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
- sym2 = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
+ sym2 = get_data_address(params.r8(PC++));
util::stream_format(stream, "mov %s,%s", sym2, sym);
break;
@@ -791,7 +753,7 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//MOV data addr, @R0/@R1/* 1: 1000 011i */
case 0x86:
case 0x87:
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "mov %s,@r%d", sym, op&1);
break;
@@ -804,20 +766,20 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
case 0x8d:
case 0x8e:
case 0x8f:
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "mov %s,r%d", sym, op&7);
break;
//MOV DPTR, #data16
case 0x90: /* 1: 1001 0000 */
- addr = (opram[PC++ - pc]<<8) & 0xff00;
- addr|= opram[PC++ - pc];
+ addr = (params.r8(PC++)<<8) & 0xff00;
+ addr|= params.r8(PC++);
util::stream_format(stream, "mov dptr,#$%04X", addr);
break;
//MOV bit addr, C
case 0x92: /* 1: 1001 0010 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
+ sym = get_bit_address(params.r8(PC++));
util::stream_format(stream, "mov %s,c", sym);
break;
@@ -828,12 +790,12 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//SUBB A, #data
case 0x94: /* 1: 1001 0100 */
- util::stream_format(stream, "subb a,#$%02X", opram[PC++ - pc]);
+ util::stream_format(stream, "subb a,#$%02X", params.r8(PC++));
break;
//SUBB A, data addr
case 0x95: /* 1: 1001 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "subb a,%s", sym);
break;
@@ -859,13 +821,13 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//Unable to test
//ORL C, /bit addr
case 0xa0: /* 1: 1010 0000 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
+ sym = get_bit_address(params.r8(PC++));
util::stream_format(stream, "orl c,/%s", sym);
break;
//MOV C, bit addr
case 0xa2: /* 1: 1010 0010 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
+ sym = get_bit_address(params.r8(PC++));
util::stream_format(stream, "mov c,%s", sym);
break;
@@ -888,7 +850,7 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//MOV @R0/@R1, data addr /* 1: 1010 011i */
case 0xa6:
case 0xa7:
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "mov @r%d,%s", op&1, sym);
break;
@@ -901,19 +863,19 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
case 0xad:
case 0xae:
case 0xaf:
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "mov r%d,%s", op&7, sym);
break;
//ANL C,/bit addr
case 0xb0: /* 1: 1011 0000 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
+ sym = get_bit_address(params.r8(PC++));
util::stream_format(stream, "anl c,/%s", sym);
break;
//CPL bit addr
case 0xb2: /* 1: 1011 0010 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
+ sym = get_bit_address(params.r8(PC++));
util::stream_format(stream, "cpl %s", sym);
break;
@@ -925,15 +887,15 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//CJNE A, #data, code addr
case 0xb4: /* 1: 1011 0100 */
- data = opram[PC++ - pc];
- rel = opram[PC++ - pc];
+ data = params.r8(PC++);
+ rel = params.r8(PC++);
util::stream_format(stream, "cjne a,#$%02X,$%04X", data, PC + rel);
break;
//CJNE A, data addr, code addr
case 0xb5: /* 1: 1011 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
- rel = opram[PC++ - pc];
+ sym = get_data_address(params.r8(PC++));
+ rel = params.r8(PC++);
util::stream_format(stream, "cjne a,%s,$%04X", sym, PC + rel);
break;
@@ -941,8 +903,8 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//CJNE @R0/@R1, #data, code addr /* 1: 1011 011i */
case 0xb6:
case 0xb7:
- data = opram[PC++ - pc];
- rel = opram[PC++ - pc];
+ data = params.r8(PC++);
+ rel = params.r8(PC++);
util::stream_format(stream, "cjne @r%d,#$%02X,$%04X", op&1, data, PC + rel);
break;
@@ -955,20 +917,20 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
case 0xbd:
case 0xbe:
case 0xbf:
- data = opram[PC++ - pc];
- rel = opram[PC++ - pc];
+ data = params.r8(PC++);
+ rel = params.r8(PC++);
util::stream_format(stream, "cjne r%d,#$%02X,$%04X", op&7, data, PC + rel);
break;
//PUSH data addr
case 0xc0: /* 1: 1100 0000 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "push %s", sym);
break;
//CLR bit addr
case 0xc2: /* 1: 1100 0010 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
+ sym = get_bit_address(params.r8(PC++));
util::stream_format(stream, "clr %s", sym);
break;
@@ -984,7 +946,7 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//XCH A, data addr
case 0xc5: /* 1: 1100 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "xch a,%s", sym);
break;
@@ -1008,13 +970,13 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//POP data addr
case 0xd0: /* 1: 1101 0000 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "pop %s", sym);
break;
//SETB bit addr
case 0xd2: /* 1: 1101 0010 */
- sym = get_bit_address(mem_names, opram[PC++ - pc]);
+ sym = get_bit_address(params.r8(PC++));
util::stream_format(stream, "setb %s", sym);
break;
@@ -1031,10 +993,10 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//DJNZ data addr, code addr
case 0xd5: /* 1: 1101 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
- rel = opram[PC++ - pc];
+ sym = get_data_address(params.r8(PC++));
+ rel = params.r8(PC++);
util::stream_format(stream, "djnz %s,$%04X", sym, PC + rel);
- flags = DASMFLAG_STEP_OVER;
+ flags = STEP_OVER;
break;
//XCHD A, @R0/@R1 /* 1: 1101 011i */
@@ -1052,9 +1014,9 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
case 0xdd:
case 0xde:
case 0xdf:
- rel = opram[PC++ - pc];
+ rel = params.r8(PC++);
util::stream_format(stream, "djnz r%d,$%04X", op&7, (PC + rel));
- flags = DASMFLAG_STEP_OVER;
+ flags = STEP_OVER;
break;
//MOVX A,@DPTR
@@ -1076,7 +1038,7 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//MOV A, data addr
case 0xe5: /* 1: 1110 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "mov a,%s", sym);
break;
@@ -1118,7 +1080,7 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
//MOV data addr, A
case 0xf5: /* 1: 1111 0101 */
- sym = get_data_address(mem_names, opram[PC++ - pc]);
+ sym = get_data_address(params.r8(PC++));
util::stream_format(stream, "mov %s,a", sym);
break;
@@ -1144,70 +1106,25 @@ static offs_t mcs51_dasm( const char **mem_names, std::ostream &stream, offs_t p
util::stream_format(stream, "illegal");
}
- return (PC - pc) | flags | DASMFLAG_SUPPORTED;
+ return (PC - pc) | flags | SUPPORTED;
}
-CPU_DISASSEMBLE( i8051 )
+i8051_disassembler::i8051_disassembler() : mcs51_disassembler(default_names)
{
- static const char *mem_names[0x200];
- static int mem_names_initialized = 0;
-
- if (!mem_names_initialized)
- {
- init_mem_names( FEATURE_NONE, mem_names);
- mem_names_initialized = 1;
- }
- return mcs51_dasm(mem_names, stream, pc, oprom, opram);
}
-CPU_DISASSEMBLE( i8052 )
+i8052_disassembler::i8052_disassembler() : mcs51_disassembler(default_names, i8052_names)
{
- static const char *mem_names[0x200];
- static int mem_names_initialized = 0;
-
- if (!mem_names_initialized)
- {
- init_mem_names( FEATURE_I8052, mem_names);
- mem_names_initialized = 1;
- }
- return mcs51_dasm(mem_names, stream, pc, oprom, opram);
}
-CPU_DISASSEMBLE( i80c51 )
+i80c51_disassembler::i80c51_disassembler() : mcs51_disassembler(default_names, i80c52_names)
{
- static const char *mem_names[0x200];
- static int mem_names_initialized = 0;
-
- if (!mem_names_initialized)
- {
- init_mem_names( FEATURE_CMOS, mem_names);
- mem_names_initialized = 1;
- }
- return mcs51_dasm(mem_names, stream, pc, oprom, opram);
}
-CPU_DISASSEMBLE( i80c52 )
+i80c52_disassembler::i80c52_disassembler() : mcs51_disassembler(default_names, i80c52_names, i80c52_names)
{
- static const char *mem_names[0x200];
- static int mem_names_initialized = 0;
-
- if (!mem_names_initialized)
- {
- init_mem_names( FEATURE_I8052 | FEATURE_CMOS | FEATURE_I80C52, mem_names);
- mem_names_initialized = 1;
- }
- return mcs51_dasm(mem_names, stream, pc, oprom, opram);
}
-CPU_DISASSEMBLE( ds5002fp )
+ds5002fp_disassembler::ds5002fp_disassembler() : mcs51_disassembler(default_names, i80c52_names, ds5002fp_names, i8xc751_names)
{
- static const char *mem_names[0x200];
- static int mem_names_initialized = 0;
-
- if (!mem_names_initialized)
- {
- init_mem_names( FEATURE_DS5002FP | FEATURE_CMOS, mem_names);
- mem_names_initialized = 1;
- }
- return mcs51_dasm(mem_names, stream, pc, oprom, opram);
}