// license:BSD-3-Clause // copyright-holders:David Haywood /* Donkey Kong / Donkey Kong Jr / Mario Bros Namco / Nintendo / Cosmodog 2003 PCB LUNA REV. 1.0 (C) 2003 COSMODOG, LTD. Maincpu: Motorola MPC603RRX266LC XTAL: SG-8002CA @ 75 MHz (not clearly readable) Video: Xilinx Spartan XC2S200 FPGA Memory: 2 x 48LC2M32B2 SDR SDRAM PIC12C508 Microcontroller Some interesting notes from the dumper: * Donkey Kong and Donkey Kong Jr are vertical games, while Mario Bros is originally Horizontal. This is achieved on this board by cropping Mario Bros slightly on the sides, while the life bar BG area is compressed slightly. * It appears that the program ROM is responsible for programming the FPGA bitstream. Sound effects are supported as samples and triggers are caught by the emulator. * The continue features are not implemented through modifications of the game, but rather through hacks applied with the emulator. I've had it glitch out and give me a 'Continue?' screen while I still had remaining lives in Donkey Kong. */ #include "emu.h" #include "cpu/pic16c5x/pic16c5x.h" #include "cpu/powerpc/ppc.h" #include "emupal.h" #include "screen.h" #include "speaker.h" class dkmb_state : public driver_device { public: dkmb_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), m_maincpu(*this, "maincpu"), m_framebuffer(*this, "framebuffer") { } void dkmb(machine_config &config); DECLARE_READ64_MEMBER(unk_2060000_r); DECLARE_READ64_MEMBER(unk_20c0010_r); protected: virtual void machine_start() override; private: required_device m_maincpu; required_shared_ptr m_framebuffer; uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); void main_map(address_map &map); }; void dkmb_state::machine_start() { } uint32_t dkmb_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { int count = 0; for (int y = 0; y < 256; y++) { uint32_t* dst = &bitmap.pix32(y); for (int x = 0; x < 1024 / 2; x++) { uint64_t val = m_framebuffer[count]; dst[(x * 2) + 0] = (val >> 32) & 0x00ffffff; dst[(x * 2) + 1] = (val >> 0) & 0x00ffffff; count++; } } return 0; } READ64_MEMBER(dkmb_state::unk_2060000_r) { return ((u64)machine().rand()) << 56; } READ64_MEMBER(dkmb_state::unk_20c0010_r) { return ((u64)machine().rand()) << 56; } void dkmb_state::main_map(address_map &map) { map(0x00000000, 0x000fffff).ram(); // copies code to RAM and runs it from here map(0x00100000, 0x001fffff).ram().share("framebuffer"); // seems to be a 1024x256 ARGB bitmap, with 320 entries used for each line and 224 lines, so framebuffer? (but then gets overwritten with data not of that format?) map(0x00e00000, 0x00ffffff).ram(); // size uncertain map(0x02080000, 0x02080007).ram(); // write map(0x02060000, 0x02060007).r(FUNC(dkmb_state::unk_2060000_r)); // read map(0x020c0000, 0x020c0007).ram(); // write map(0x020c0010, 0x020c0017).r(FUNC(dkmb_state::unk_20c0010_r)); // read map(0x04090000, 0x0409ffff).ram(); // size uncertain // map(0xff000000, 0xff0fffff) // looks like flash ROM access, mirror of main ROM or just checking if extra exist? // map(0xff800000, 0xff8fffff) // looks like flash ROM access, mirror of main ROM or just checking if extra exist? map(0xffe00000, 0xffffffff).rom().region("maincpu", 0); } static INPUT_PORTS_START( dkmb ) INPUT_PORTS_END MACHINE_CONFIG_START(dkmb_state::dkmb) MCFG_DEVICE_ADD("maincpu", PPC603R, 75'000'000) // Actually MPC603RRX266LC MCFG_DEVICE_PROGRAM_MAP(main_map) MCFG_DEVICE_ADD("pic", PIC16C56, 4'000'000) // Actually PIC12C508, clock not verified MCFG_SCREEN_ADD("screen", RASTER) // wrong MCFG_SCREEN_REFRESH_RATE(60) MCFG_SCREEN_UPDATE_DRIVER(dkmb_state, screen_update) MCFG_SCREEN_SIZE(1024, 256) MCFG_SCREEN_VISIBLE_AREA(0, 1024-1, 0, 256-1) MCFG_PALETTE_ADD("palette", 65536) SPEAKER(config, "lspeaker").front_left(); SPEAKER(config, "rspeaker").front_right(); MACHINE_CONFIG_END ROM_START( dkmb ) ROM_REGION64_BE(0x200000, "maincpu", 0) ROM_LOAD("donkeykong.u14", 0x00000, 0x200000, CRC(7895fe2d) SHA1(134174c02ce3c5d28a890ca57dc36677873b1dc8) ) // what type of ROM is this? ROM_REGION( 0x1000, "pic", 0 ) /* Intel HEX format dump. When converted to binary using "srec_cat.exe 12c508.u12 -intel -o 12c508.bin -binary" this contains only the string "Copyright 2001 Core Technologies why are you looking in here?" in the first 0x80 bytes, which is the unprotected area of the PIC. the rest is blank, therefore protected and a bad dump */ ROM_LOAD("12c508.u12", 0x000, 0x09db, BAD_DUMP CRC(3adb3e33) SHA1(36a96886d83b64633eea83e57bdfa8a20c6d4f6a) ) ROM_END GAME( 2003, dkmb, 0, dkmb, dkmb, dkmb_state, empty_init, ROT270, "Namco / Nintendo / Cosmodog", "Donkey Kong / Donkey Kong Jr / Mario Bros", MACHINE_IS_SKELETON )