add derived CPU type for AX51-CORE (used by AX208 and others) so that we can start to customize disassembly and execution

This commit is contained in:
DavidHaywood 2018-12-14 11:54:49 +00:00
parent 896ed1d953
commit 90fef4da16
9 changed files with 156 additions and 9 deletions

View File

@ -988,12 +988,16 @@ if (CPUS["MCS51"]~=null) then
MAME_DIR .. "src/devices/cpu/mcs51/mcs51.cpp",
MAME_DIR .. "src/devices/cpu/mcs51/mcs51.h",
MAME_DIR .. "src/devices/cpu/mcs51/mcs51ops.hxx",
MAME_DIR .. "src/devices/cpu/mcs51/axc51-core.cpp",
MAME_DIR .. "src/devices/cpu/mcs51/axc51-core.h",
}
end
if (CPUS["MCS51"]~=null or _OPTIONS["with-tools"]) then
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/mcs51/mcs51dasm.cpp")
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/mcs51/mcs51dasm.h")
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/mcs51/axc51-core_dasm.cpp")
table.insert(disasm_files , MAME_DIR .. "src/devices/cpu/mcs51/axc51-core_dasm.h")
end
--------------------------------------------------

View File

@ -0,0 +1,28 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*****************************************************************************
AXC51-CORE (AppoTech Inc.)
used in
AX208 SoC
*****************************************************************************/
#include "emu.h"
#include "debugger.h"
#include "axc51-core.h"
#include "axc51-core_dasm.h"
DEFINE_DEVICE_TYPE(AX208, ax208_cpu_device, "ax208", "AppoTech AX208 (AXC51-CORE)")
ax208_cpu_device::ax208_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: mcs51_cpu_device(mconfig, AX208, tag, owner, clock, 0, 7)
{
}
std::unique_ptr<util::disasm_interface> ax208_cpu_device::create_disassembler()
{
return std::make_unique<axc51core_disassembler>();
}

View File

@ -0,0 +1,32 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*****************************************************************************
AXC51-CORE (AppoTech Inc.)
used in
AX208 SoC
*****************************************************************************/
#ifndef MAME_CPU_MCS51_AXC51_CORE_H
#define MAME_CPU_MCS51_AXC51_CORE_H
#pragma once
#include "mcs51.h"
DECLARE_DEVICE_TYPE(AX208, ax208_cpu_device)
class ax208_cpu_device : public mcs51_cpu_device
{
public:
// construction/destruction
ax208_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
};
#endif // MAME_CPU_MCS51_AXC51_CORE_H

View File

@ -0,0 +1,42 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*****************************************************************************
AXC51-CORE (AppoTech Inc.)
used in
AX208 SoC
*****************************************************************************/
#include "emu.h"
#include "axc51-core_dasm.h"
axc51core_disassembler::axc51core_disassembler() : mcs51_disassembler(default_names)
{
}
offs_t axc51core_disassembler::disassemble_op(std::ostream &stream, unsigned PC, offs_t pc, const data_buffer &opcodes, const data_buffer &params, uint8_t op)
{
uint32_t flags = 0;
uint8_t prm = 0;
switch( op )
{
// unknown, probably the 16-bit extended ocpodes, see page 14 of AX208-SP-101-EN manual, encodings not specified!
// note, the other AXC51-CORE based manuals don't seem to mention these, are they really AX208 specific?
case 0xa5:
prm = params.r8(PC++);
util::stream_format(stream, "unknown ax208 a5 $%02X", prm);
break;
default:
return mcs51_disassembler::disassemble_op(stream, PC, pc, opcodes, params, op);
}
return (PC - pc) | flags | SUPPORTED;
}

View File

@ -0,0 +1,31 @@
// license:BSD-3-Clause
// copyright-holders:David Haywood
/*****************************************************************************
AXC51-CORE (AppoTech Inc.)
used in
AX208 SoC
*****************************************************************************/
#ifndef MAME_CPU_MCS51_AXC51_CORE_DASM_H
#define MAME_CPU_MCS51_AXC51_CORE_DASM_H
#pragma once
#include "mcs51dasm.h"
class axc51core_disassembler : public mcs51_disassembler
{
public:
axc51core_disassembler();
virtual ~axc51core_disassembler() = default;
protected:
virtual offs_t disassemble_op(std::ostream &stream, unsigned PC, offs_t pc, const data_buffer &opcodes, const data_buffer &params, uint8_t op) override;
};
#endif // MAME_CPU_MCS51_AXC51_CORE_DASM_H

View File

@ -293,16 +293,14 @@ std::string mcs51_disassembler::get_bit_address( uint8_t arg ) const
}
}
offs_t mcs51_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
offs_t mcs51_disassembler::disassemble_op(std::ostream &stream, unsigned PC, offs_t pc, const data_buffer &opcodes, const data_buffer &params, uint8_t op)
{
uint32_t flags = 0;
unsigned PC = pc;
std::string sym, sym2;
uint8_t op, data;
uint8_t data;
uint16_t addr;
int8_t rel;
op = opcodes.r8(PC++);
switch( op )
{
//NOP
@ -1109,6 +1107,13 @@ offs_t mcs51_disassembler::disassemble(std::ostream &stream, offs_t pc, const da
return (PC - pc) | flags | SUPPORTED;
}
offs_t mcs51_disassembler::disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params)
{
unsigned PC = pc;
uint8_t op = opcodes.r8(PC++);
return disassemble_op(stream, PC, pc, opcodes, params, op);
}
i8051_disassembler::i8051_disassembler() : mcs51_disassembler(default_names)
{
}

View File

@ -63,11 +63,14 @@ public:
virtual u32 opcode_alignment() const override;
virtual offs_t disassemble(std::ostream &stream, offs_t pc, const data_buffer &opcodes, const data_buffer &params) override;
private:
std::unordered_map<offs_t, const char *> m_names;
protected:
virtual offs_t disassemble_op(std::ostream &stream, unsigned PC, offs_t pc, const data_buffer &opcodes, const data_buffer &params, uint8_t op);
std::string get_data_address( uint8_t arg ) const;
std::string get_bit_address( uint8_t arg ) const;
private:
std::unordered_map<offs_t, const char *> m_names;
};
class i8051_disassembler : public mcs51_disassembler

View File

@ -7,13 +7,13 @@
https://gbatemp.net/threads/the-monon-color-a-new-video-game-console-from-china.467788/
https://twitter.com/Splatoon2weird/status/1072182093206052864
uses AX208 CPU (8051 @ 96Mhz with single cycle instructions + integrated video, jpeg decoder etc.)
uses AX208 CPU (custom 8051 @ 96Mhz with single cycle instructions, extended '16 bit' opcodes + integrated video, jpeg decoder etc.)
https://docplayer.net/52724058-Ax208-product-specification.html
***************************************************************************/
#include "emu.h"
#include "cpu/mcs51/mcs51.h"
#include "cpu/mcs51/axc51-core.h"
#include "emupal.h"
#include "screen.h"
#include "speaker.h"
@ -75,7 +75,7 @@ INPUT_PORTS_END
MACHINE_CONFIG_START(monon_color_state::monon_color)
/* basic machine hardware */
MCFG_DEVICE_ADD("maincpu", I8051, 96000000) // AX208! (needs custom core)
MCFG_DEVICE_ADD("maincpu", AX208, 96000000) // (8051 / MCS51 derived) incomplete core!
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)

View File

@ -87,6 +87,7 @@ using util::BIT;
#include "cpu/mcs40/mcs40dasm.h"
#include "cpu/mcs48/mcs48dsm.h"
#include "cpu/mcs51/mcs51dasm.h"
#include "cpu/mcs51/axc51-core_dasm.h"
#include "cpu/mcs96/i8x9xd.h"
#include "cpu/mcs96/i8xc196d.h"
#include "cpu/melps4/melps4d.h"
@ -315,6 +316,7 @@ static const dasm_table_entry dasm_table[] =
{ "arm7thumbb", be, 0, []() -> util::disasm_interface * { arm7_unidasm.t_flag = true; return new arm7_disassembler(&arm7_unidasm); } },
{ "asap", le, 0, []() -> util::disasm_interface * { return new asap_disassembler; } },
{ "avr8", le, 0, []() -> util::disasm_interface * { return new avr8_disassembler; } },
{ "axc51core", le, 0, []() -> util::disasm_interface * { return new axc51core_disassembler; } },
{ "capricorn", le, 0, []() -> util::disasm_interface * { return new capricorn_disassembler; } },
{ "ccpu", le, 0, []() -> util::disasm_interface * { return new ccpu_disassembler; } },
{ "cdp1801", le, 0, []() -> util::disasm_interface * { return new cosmac_disassembler(cosmac_disassembler::TYPE_1801); } },