summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/monkey_king_3b.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/monkey_king_3b.cpp')
-rw-r--r--src/mame/drivers/monkey_king_3b.cpp252
1 files changed, 0 insertions, 252 deletions
diff --git a/src/mame/drivers/monkey_king_3b.cpp b/src/mame/drivers/monkey_king_3b.cpp
deleted file mode 100644
index e71f1545d46..00000000000
--- a/src/mame/drivers/monkey_king_3b.cpp
+++ /dev/null
@@ -1,252 +0,0 @@
-// 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 )