diff options
Diffstat (limited to 'src/devices/cpu/mcs51')
-rw-r--r-- | src/devices/cpu/mcs51/mcs51.cpp | 40 | ||||
-rw-r--r-- | src/devices/cpu/mcs51/mcs51.h | 16 | ||||
-rw-r--r-- | src/devices/cpu/mcs51/mcs51dasm.cpp | 721 | ||||
-rw-r--r-- | src/devices/cpu/mcs51/mcs51dasm.h | 106 |
4 files changed, 446 insertions, 437 deletions
diff --git a/src/devices/cpu/mcs51/mcs51.cpp b/src/devices/cpu/mcs51/mcs51.cpp index 1c682e06e0e..536565bbbe7 100644 --- a/src/devices/cpu/mcs51/mcs51.cpp +++ b/src/devices/cpu/mcs51/mcs51.cpp @@ -130,6 +130,7 @@ #include "emu.h" #include "debugger.h" #include "mcs51.h" +#include "mcs51dasm.h" #define VERBOSE 0 @@ -2101,7 +2102,7 @@ uint8_t mcs51_cpu_device::sfr_read(size_t offset) void mcs51_cpu_device::device_start() { m_program = &space(AS_PROGRAM); - m_direct = &m_program->direct(); + m_direct = m_program->direct<0>(); m_data = &space(AS_DATA); m_io = &space(AS_IO); @@ -2506,45 +2507,32 @@ void ds5002fp_device::nvram_write( emu_file &file ) file.write( m_sfr_ram, 0x80 ); } - - -offs_t mcs51_cpu_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *mcs51_cpu_device::create_disassembler() { - extern CPU_DISASSEMBLE( i8051 ); - return CPU_DISASSEMBLE_NAME(i8051)(this, stream, pc, oprom, opram, options); + return new i8051_disassembler; } - -offs_t i8052_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *i8052_device::create_disassembler() { - extern CPU_DISASSEMBLE( i8052 ); - return CPU_DISASSEMBLE_NAME(i8052)(this, stream, pc, oprom, opram, options); + return new i8052_disassembler; } - -offs_t i80c31_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *i80c31_device::create_disassembler() { - extern CPU_DISASSEMBLE( i80c51 ); - return CPU_DISASSEMBLE_NAME(i80c51)(this, stream, pc, oprom, opram, options); + return new i80c51_disassembler; } - -offs_t i80c51_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *i80c51_device::create_disassembler() { - extern CPU_DISASSEMBLE( i80c51 ); - return CPU_DISASSEMBLE_NAME(i80c51)(this, stream, pc, oprom, opram, options); + return new i80c51_disassembler; } - -offs_t i80c52_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *i80c52_device::create_disassembler() { - extern CPU_DISASSEMBLE( i80c52 ); - return CPU_DISASSEMBLE_NAME(i80c52)(this, stream, pc, oprom, opram, options); + return new i80c52_disassembler; } - -offs_t ds5002fp_device::disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) +util::disasm_interface *ds5002fp_device::create_disassembler() { - extern CPU_DISASSEMBLE( ds5002fp ); - return CPU_DISASSEMBLE_NAME(ds5002fp)(this, stream, pc, oprom, opram, options); + return new ds5002fp_disassembler; } diff --git a/src/devices/cpu/mcs51/mcs51.h b/src/devices/cpu/mcs51/mcs51.h index 13f19d3fd28..f324e428ad5 100644 --- a/src/devices/cpu/mcs51/mcs51.h +++ b/src/devices/cpu/mcs51/mcs51.h @@ -115,9 +115,7 @@ protected: virtual void state_string_export(const device_state_entry &entry, std::string &str) const override; // device_disasm_interface overrides - virtual uint32_t disasm_min_opcode_bytes() const override { return 1; } - virtual uint32_t disasm_max_opcode_bytes() const override { return 5; } - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; protected: address_space_config m_program_config; @@ -168,7 +166,7 @@ protected: /* Memory spaces */ address_space *m_program; - direct_read_data *m_direct; + direct_read_data<0> *m_direct; address_space *m_data; address_space *m_io; @@ -390,7 +388,7 @@ public: protected: i8052_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_width, int data_width, uint8_t features = 0); - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; /* SFR Callbacks */ virtual void sfr_write(size_t offset, uint8_t data) override; @@ -418,7 +416,7 @@ public: i80c31_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; }; @@ -431,7 +429,7 @@ public: protected: i80c51_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_width, int data_width, uint8_t features = 0); - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; }; class i87c51_device : public i80c51_device @@ -451,7 +449,7 @@ public: protected: i80c52_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_width, int data_width, uint8_t features = 0); - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; /* SFR Callbacks */ virtual void sfr_write(size_t offset, uint8_t data) override; @@ -522,7 +520,7 @@ public: virtual void nvram_write( emu_file &file ) override; protected: - virtual offs_t disasm_disassemble(std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, uint32_t options) override; + virtual util::disasm_interface *create_disassembler() override; /* SFR Callbacks */ virtual void sfr_write(size_t offset, uint8_t data) override; 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 ¶ms) { 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); } diff --git a/src/devices/cpu/mcs51/mcs51dasm.h b/src/devices/cpu/mcs51/mcs51dasm.h new file mode 100644 index 00000000000..98272befc89 --- /dev/null +++ b/src/devices/cpu/mcs51/mcs51dasm.h @@ -0,0 +1,106 @@ +// license:BSD-3-Clause +// copyright-holders:Steve Ellenoff +/***************************************************************************** + * + * i8051dasm.c + * Portable MCS-51 Family Emulator + * + * Chips in the family: + * 8051 Product Line (8031,8051,8751) + * 8052 Product Line (8032,8052,8752) + * 8054 Product Line (8054) + * 8058 Product Line (8058) + * + * Copyright Steve Ellenoff, all rights reserved. + * + * This work is based on: + * #1) 'Intel(tm) MC51 Microcontroller Family Users Manual' and + * #2) 8051 simulator by Travis Marlatte + * #3) Portable UPI-41/8041/8741/8042/8742 emulator V0.1 by Juergen Buchmueller (MAME CORE) + * + ***************************************************************************** + * Symbol Memory Name Tables borrowed from: + * D52 8052 Disassembler - Copyright Jeffery L. Post + *****************************************************************************/ + +#ifndef MAME_CPU_MCS51_MCS51DASM_H +#define MAME_CPU_MCS51_MCS51DASM_H + +#pragma once + +class mcs51_disassembler : public util::disasm_interface +{ +public: + struct mem_info { + int addr; + const char *name; + }; + + static const mem_info default_names[]; + static const mem_info i8052_names[]; + static const mem_info i80c52_names[]; + static const mem_info ds5002fp_names[]; + static const mem_info i8xc751_names[]; + + template<typename ...Names> mcs51_disassembler(Names &&... names) : mcs51_disassembler() { + add_names(names...); + } + + mcs51_disassembler(); + virtual ~mcs51_disassembler() = default; + + template<typename ...Names> void add_names(const mem_info *info, Names &&... names) + { + add_names(names...); + add_names(info); + } + + void add_names(const mem_info *info); + + virtual u32 opcode_alignment() const override; + virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer ¶ms) override; + +private: + std::unordered_map<offs_t, const char *> m_names; + + std::string get_data_address( uint8_t arg ) const; + std::string get_bit_address( uint8_t arg ) const; +}; + +class i8051_disassembler : public mcs51_disassembler +{ +public: + i8051_disassembler(); + virtual ~i8051_disassembler() = default; +}; + +class i8052_disassembler : public mcs51_disassembler +{ +public: + i8052_disassembler(); + virtual ~i8052_disassembler() = default; +}; + +class i80c51_disassembler : public mcs51_disassembler +{ +public: + i80c51_disassembler(); + virtual ~i80c51_disassembler() = default; +}; + +class i80c52_disassembler : public mcs51_disassembler +{ +public: + i80c52_disassembler(); + virtual ~i80c52_disassembler() = default; +}; + +class ds5002fp_disassembler : public mcs51_disassembler +{ +public: + ds5002fp_disassembler(); + virtual ~ds5002fp_disassembler() = default; +}; + + +#endif |