mirror of
https://github.com/holub/mame
synced 2025-04-16 13:34:55 +03:00
Add Monkey King 3B SoC skeleton and RS-70 system (#6906)
New machines marked as NOT_WORKING ---------------------------------- RS-70 648-in-1 [David Shah] -mk3b: Added a skeleton driver for the Monkey King 3B SoC. [David Shah]
This commit is contained in:
parent
f6e9386745
commit
edd20eaf70
@ -4016,6 +4016,7 @@ files {
|
||||
MAME_DIR .. "src/mame/drivers/actions_atj2279b.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/pubint_storyreader.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/magiceyes_pollux_vr3520f.cpp",
|
||||
MAME_DIR .. "src/mame/drivers/monkey_king_3b.cpp",
|
||||
}
|
||||
|
||||
createMESSProjects(_target, _subtarget, "ultimachine")
|
||||
|
252
src/mame/drivers/monkey_king_3b.cpp
Normal file
252
src/mame/drivers/monkey_king_3b.cpp
Normal file
@ -0,0 +1,252 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:David Shah
|
||||
|
||||
/*
|
||||
|
||||
Monkey King SoCs (currently only 3B is supported)
|
||||
|
||||
Presumably-custom ARM-based system-on-chips by Digital Media Cartridge (DMC).
|
||||
Intended to run NES and Genesis emulators, primarily for ATgames systems.
|
||||
|
||||
Sometimes abbreviated MK. It is a successor of the Titan SoC used in previous
|
||||
emulation based ATgames systems.
|
||||
|
||||
Monkey King and Monkey 2: Presumed custom. Used in some ATgames/Blaze
|
||||
Genesis systems and the Atari Flashback Portable.
|
||||
|
||||
Monkey King 3 and Monkey King 3B: Presumed custom. Used in the ATgames
|
||||
BLAST system and the RS-70 648-in-1 "PS1 form factor" clone. Supports
|
||||
HDMI output.
|
||||
|
||||
Monkey King 3.6: not a custom part but a rebranded RK3036, usually
|
||||
running a cut-down Android based OS. Used in newer ATgames systems.
|
||||
|
||||
The typical configuration of the Monkey King SoCs (other than the
|
||||
3.6) is with 8/16MB of SDRAM, NOR flash for the firmware and
|
||||
built-in games, and a SD card for additional games.
|
||||
|
||||
The RS-70 is notable for having a debug UART on the USB port
|
||||
(serial TX on D+, 115200). It prints the following messages on boot:
|
||||
|
||||
EXEC: Executing 'boot' with 0 args (ZLib ON)...
|
||||
EXEC: Loading 'boot' at 0x18000000...
|
||||
EXEC: Loaded 372272 bytes of 2097152 available.
|
||||
|
||||
This is different from the serial output that this emulation model
|
||||
currently produces. Perhaps one of the unimplemented IO is causing
|
||||
it to go into some kind of debug mode. The log output produced by
|
||||
this machine is:
|
||||
|
||||
Modes:0x00000000
|
||||
PUT: Setting joystick to mode 0x0, timer to 250us
|
||||
|
||||
******************************************************
|
||||
MK FIRMWARE INFORMATION
|
||||
Mode: 0xB4
|
||||
Build Time: May 8 2019 14:09:21
|
||||
CPU Clock: 240MHz
|
||||
TFS Start: 0x8070000
|
||||
Video Buf: 0x6000000
|
||||
Stack Top: 0x3001EE8
|
||||
IWRAM Size: 32kB
|
||||
EVRAM Size: 16384kB
|
||||
Heap Size: 6144kB at 0x18200000
|
||||
Video Mode: 0
|
||||
Video Size: 1280x720x16bpp
|
||||
******************************************************
|
||||
|
||||
There are other strings in the ROM that imply there may be more serial
|
||||
debug possibilities.
|
||||
|
||||
TODO:
|
||||
implement everything
|
||||
add dumps of more Monkey King systems
|
||||
*/
|
||||
|
||||
#include "emu.h"
|
||||
#include "cpu/arm7/arm7.h"
|
||||
#include "cpu/arm7/arm7core.h"
|
||||
#include "emupal.h"
|
||||
#include "screen.h"
|
||||
|
||||
class mk3b_soc_state : public driver_device
|
||||
{
|
||||
public:
|
||||
mk3b_soc_state(const machine_config &mconfig, device_type type, const char *tag)
|
||||
: driver_device(mconfig, type, tag),
|
||||
m_iram0(*this, "iram0"),
|
||||
m_iram3(*this, "iram3"),
|
||||
m_sdram(*this, "sdram"),
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_screen(*this, "screen")
|
||||
{ }
|
||||
|
||||
void mk3b_soc(machine_config &config);
|
||||
|
||||
void init_rs70();
|
||||
|
||||
private:
|
||||
required_shared_ptr<uint32_t> m_iram0, m_iram3;
|
||||
required_shared_ptr<uint32_t> m_sdram;
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<screen_device> m_screen;
|
||||
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
uint32_t io4_r(offs_t offset, uint32_t mem_mask = ~0);
|
||||
void io4_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
|
||||
|
||||
uint32_t io7_r(offs_t offset, uint32_t mem_mask = ~0);
|
||||
void io7_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
|
||||
|
||||
uint32_t io10_r(offs_t offset, uint32_t mem_mask = ~0);
|
||||
void io10_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
|
||||
|
||||
uint32_t screen_update_mk3b_soc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
|
||||
void map(address_map &map);
|
||||
std::string debug_buf;
|
||||
};
|
||||
|
||||
|
||||
void mk3b_soc_state::map(address_map &map)
|
||||
{
|
||||
// 64MB external NOR flash
|
||||
map(0x08000000, 0x0BFFFFFF).rom().share("norflash").region("norflash", 0x0);;
|
||||
// unknown amount and configuration of internal RAM
|
||||
map(0x00000000, 0x0000FFFF).ram().share("iram0");
|
||||
// This section of RAM seems to contain the stack
|
||||
map(0x03000000, 0x0300FFFF).ram().share("iram3");
|
||||
|
||||
// 16MB of external SDRAM
|
||||
map(0x18000000, 0x18FFFFFF).ram().share("sdram");
|
||||
// IO is totally unknown for now
|
||||
map(0x04000000, 0x0400FFFF).rw(FUNC(mk3b_soc_state::io4_r), FUNC(mk3b_soc_state::io4_w));
|
||||
map(0x07000000, 0x0700FFFF).rw(FUNC(mk3b_soc_state::io7_r), FUNC(mk3b_soc_state::io7_w));
|
||||
map(0x10000000, 0x1000FFFF).rw(FUNC(mk3b_soc_state::io10_r), FUNC(mk3b_soc_state::io10_w));
|
||||
}
|
||||
|
||||
static INPUT_PORTS_START( mk3b_soc )
|
||||
|
||||
INPUT_PORTS_END
|
||||
|
||||
void mk3b_soc_state::video_start()
|
||||
{
|
||||
}
|
||||
|
||||
void mk3b_soc_state::machine_reset()
|
||||
{
|
||||
// In practice, this will probably be done by a small
|
||||
// internal boot ROM.
|
||||
m_iram0[0] = 0xe59f0000; // ldr r0, [pc]
|
||||
m_iram0[1] = 0xe12fff10; // bx, r0
|
||||
m_iram0[2] = 0x08000000; // target address
|
||||
}
|
||||
|
||||
uint32_t mk3b_soc_state::screen_update_mk3b_soc(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void mk3b_soc_state::mk3b_soc(machine_config &config)
|
||||
{
|
||||
// type unknown (should actually have VFP?)
|
||||
// debug output suggests 240MHz clock
|
||||
ARM920T(config, m_maincpu, 240000000);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &mk3b_soc_state::map);
|
||||
|
||||
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
|
||||
m_screen->set_refresh_hz(60);
|
||||
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500) /* not accurate */);
|
||||
m_screen->set_size(1280, 720);
|
||||
m_screen->set_visarea(0, 1280-1, 0, 720-1);
|
||||
m_screen->set_screen_update(FUNC(mk3b_soc_state::screen_update_mk3b_soc));
|
||||
}
|
||||
|
||||
uint32_t mk3b_soc_state::io4_r(offs_t offset, uint32_t mem_mask)
|
||||
{
|
||||
switch (offset) {
|
||||
case 0x01:
|
||||
return (m_screen->vblank() << 27) | m_screen->vblank(); // who knows? seems to need to toggle between 0 and 1
|
||||
default:
|
||||
logerror("%s: IO 0x04 read 0x%04X\n", machine().describe_context(), offset);
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
void mk3b_soc_state::io4_w(offs_t offset, uint32_t data, uint32_t mem_mask)
|
||||
{
|
||||
logerror("%s: IO 0x04 write 0x%04X 0x%08X & 0x%08X\n", machine().describe_context(), offset, data, mem_mask);
|
||||
}
|
||||
|
||||
|
||||
uint32_t mk3b_soc_state::io7_r(offs_t offset, uint32_t mem_mask)
|
||||
{
|
||||
switch (offset) {
|
||||
case 0x21: // video size
|
||||
return (1280 << 16) | (720);
|
||||
default:
|
||||
logerror("%s: IO 0x07 read 0x%04X\n", machine().describe_context(), offset);
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
void mk3b_soc_state::io7_w(offs_t offset, uint32_t data, uint32_t mem_mask)
|
||||
{
|
||||
logerror("%s: IO 0x07 write 0x%04X 0x%08X & 0x%08X\n", machine().describe_context(), offset, data, mem_mask);
|
||||
}
|
||||
|
||||
uint32_t mk3b_soc_state::io10_r(offs_t offset, uint32_t mem_mask)
|
||||
{
|
||||
switch (offset) {
|
||||
// Definitely not correct, but toggling somehow keeps things moving
|
||||
case 0x148:
|
||||
case 0x149:
|
||||
return m_screen->vblank() ? 0x00000000 : 0xFFFFFFFF;
|
||||
default:
|
||||
logerror("%s: IO 0x10 read 0x%04X\n", machine().describe_context(), offset);
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
void mk3b_soc_state::io10_w(offs_t offset, uint32_t data, uint32_t mem_mask)
|
||||
{
|
||||
switch (offset) {
|
||||
case 0x148: { // debug UART
|
||||
char c = data & 0xFF;
|
||||
logerror("%s: UART W: %c\n", machine().describe_context(), c);
|
||||
if (c == '\n') {
|
||||
logerror("%s: [DEBUG] %s\n", machine().describe_context(), debug_buf.c_str());
|
||||
debug_buf.clear();
|
||||
} else if (c != '\r') {
|
||||
debug_buf += c;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
logerror("%s: IO 0x10 write 0x%04X 0x%08X & 0x%08X\n", machine().describe_context(), offset, data, mem_mask);
|
||||
}
|
||||
}
|
||||
|
||||
void mk3b_soc_state::init_rs70()
|
||||
{
|
||||
// Uppermost address bit seems to be inverted
|
||||
uint8_t *ROM = memregion("norflash")->base();
|
||||
int size = memregion("norflash")->bytes();
|
||||
|
||||
for (int i = 0; i < (size / 2); i++) {
|
||||
std::swap(ROM[i], ROM[i + (size / 2)]);
|
||||
}
|
||||
// FIXME: Work around missing FPU for now
|
||||
ROM[0x32f24] = 0x00;
|
||||
ROM[0x32f25] = 0x00;
|
||||
ROM[0x32f26] = 0x00;
|
||||
ROM[0x32f27] = 0x00;
|
||||
}
|
||||
|
||||
|
||||
ROM_START( rs70_648 )
|
||||
ROM_REGION(0x04000000, "norflash", 0)
|
||||
ROM_LOAD("s29gl512p.bin", 0x000000, 0x04000000, CRC(cb452bd7) SHA1(0b19a13a3d0b829725c10d64d7ff852ff5202ed0) )
|
||||
ROM_END
|
||||
|
||||
CONS( 2019, rs70_648, 0, 0, mk3b_soc, mk3b_soc, mk3b_soc_state, init_rs70, "<unknown>", "RS-70 648-in-1", MACHINE_IS_SKELETON )
|
@ -23148,6 +23148,9 @@ momokoe // (c) 1986 Jaleco (English text)
|
||||
monacogp // (c) 1980 Sega
|
||||
monacogpa // (c) 1980 Sega
|
||||
|
||||
@source:monkey_king_3b.cpp
|
||||
rs70_648 //
|
||||
|
||||
@source:monon_color.cpp
|
||||
mononcol // (c) 2011 M&D
|
||||
|
||||
|
@ -587,6 +587,7 @@ mmd2.cpp
|
||||
mod8.cpp
|
||||
modellot.cpp
|
||||
molecular.cpp
|
||||
monkey_king_3b.cpp
|
||||
monon_color.cpp
|
||||
monty.cpp
|
||||
mpc3000.cpp
|
||||
|
Loading…
Reference in New Issue
Block a user