From e1d00b62baac35ff484dc27d0a86a650d52b1961 Mon Sep 17 00:00:00 2001 From: Ivan Vangelista Date: Mon, 13 Jun 2022 22:56:46 +0200 Subject: New machines marked as NOT_WORKING ---------------------------------- Magic Touch [Ivan Vangelista] --- scripts/target/mame/arcade.lua | 2 - src/mame/drivers/sderby.cpp | 575 ++++++++++++++++++++++++++++++----------- src/mame/includes/sderby.h | 78 ------ src/mame/mame.lst | 1 + src/mame/video/sderby.cpp | 133 ---------- 5 files changed, 426 insertions(+), 363 deletions(-) delete mode 100644 src/mame/includes/sderby.h delete mode 100644 src/mame/video/sderby.cpp diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 80768ec93a2..2f6e806c280 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -3349,8 +3349,6 @@ files { MAME_DIR .. "src/mame/video/playmark.cpp", MAME_DIR .. "src/mame/drivers/powerbal.cpp", MAME_DIR .. "src/mame/drivers/sderby.cpp", - MAME_DIR .. "src/mame/includes/sderby.h", - MAME_DIR .. "src/mame/video/sderby.cpp", MAME_DIR .. "src/mame/drivers/sslam.cpp", MAME_DIR .. "src/mame/includes/sslam.h", MAME_DIR .. "src/mame/video/sslam.cpp", diff --git a/src/mame/drivers/sderby.cpp b/src/mame/drivers/sderby.cpp index 7008cbc210a..d57425e71e5 100644 --- a/src/mame/drivers/sderby.cpp +++ b/src/mame/drivers/sderby.cpp @@ -11,9 +11,12 @@ Supported games: - Super Derby, 1996, Playmark. - Scacco Matto / Space Win, 1996, Playmark. - Croupier (Playmark Roulette), 1997, Playmark. + Lucky Boom 1996, Playmark. + Scacco Matto / Space Win, 1996, Playmark. + Shiny Golds, 1996, Playmark. + Super Derby (2 sets), 1996, Playmark. + Croupier (Playmark Roulette) (2 sets), 1997, Playmark. + Magic Touch, 1998, Playmark. ******************************************************************************************** @@ -54,71 +57,269 @@ TO DO : - - figure out the reads from 0x308002.w and 0x30800e.w (see sderby_input_r read handler) - (by default, demo sounds are OFF, so change this in the "test mode") - + - figure out the reads from 0x308002.w and 0x30800e.w (see input_r read handler) + (by default, demo sounds are OFF, so change this in the "test mode"); + - dump and hook up the MCU for croupier; + - almost everything for magictch. To enter gameplay just do PC=29c2 when it enters a loop at 0x29c0 *******************************************************************************************/ #include "emu.h" -#include "includes/sderby.h" #include "cpu/m68000/m68000.h" #include "machine/nvram.h" #include "sound/okim6295.h" + +#include "emupal.h" #include "screen.h" #include "speaker.h" +#include "tilemap.h" #include "pmroulet.lh" #include "sderby.lh" #include "spacewin.lh" -/*************************** -* R/W Handlers * -***************************/ +// configurable logging +#define LOG_INPUTS (1U << 1) +#define LOG_CROUPIER_MCU (1U << 2) + +//#define VERBOSE (LOG_GENERAL | LOG_INPUTS | LOG_CROUPIER_MCU) + +#include "logmacro.h" -uint16_t sderby_state::sderby_input_r(offs_t offset) +#define LOGINPUTS(...) LOGMASKED(LOG_INPUTS, __VA_ARGS__) +#define LOGCROUPIERMCU(...) LOGMASKED(LOG_CROUPIER_MCU, __VA_ARGS__) + + +namespace { + +class sderby_state : public driver_device { - switch (offset) +public: + sderby_state(const machine_config &mconfig, device_type type, const char *tag) : + driver_device(mconfig, type, tag), + m_bg_videoram(*this, "bg_videoram"), + m_md_videoram(*this, "md_videoram"), + m_fg_videoram(*this, "fg_videoram"), + m_spriteram(*this, "spriteram"), + m_maincpu(*this, "maincpu"), + m_gfxdecode(*this, "gfxdecode"), + m_palette(*this, "palette"), + m_in(*this, "IN%u", 0U), + m_lamps(*this, "lamp%u", 1U) + { } + + + void luckboom(machine_config &config); + void magictch(machine_config &config); + void pmroulet(machine_config &config); + void sderby(machine_config &config); + void sderbya(machine_config &config); + void shinygld(machine_config &config); + void spacewin(machine_config &config); + +protected: + virtual void machine_start() override { m_lamps.resolve(); } + virtual void video_start() override; + +private: + required_shared_ptr m_bg_videoram; + required_shared_ptr m_md_videoram; + required_shared_ptr m_fg_videoram; + required_shared_ptr m_spriteram; + + required_device m_maincpu; + required_device m_gfxdecode; + required_device m_palette; + + optional_ioport_array<3> m_in; + output_finder<7> m_lamps; + + tilemap_t *m_bg_tilemap = nullptr; + tilemap_t *m_md_tilemap = nullptr; + tilemap_t *m_fg_tilemap = nullptr; + + uint16_t m_scroll[6]{}; + + uint16_t input_r(offs_t offset); + uint16_t roulette_input_r(offs_t offset); + uint16_t rprot_r(); + void rprot_w(uint16_t data); + void sderby_out_w(uint16_t data); + void scmatto_out_w(uint16_t data); + void roulette_out_w(uint16_t data); + void bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void md_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void fg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + void scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); + TILE_GET_INFO_MEMBER(get_bg_tile_info); + TILE_GET_INFO_MEMBER(get_md_tile_info); + TILE_GET_INFO_MEMBER(get_fg_tile_info); + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update_pmroulet(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect); + void luckboom_map(address_map &map); + void magictch_map(address_map &map); + void roulette_map(address_map &map); + void sderby_map(address_map &map); + void sderbya_map(address_map &map); + void shinygld_map(address_map &map); + void spacewin_map(address_map &map); +}; + +// video + + +TILE_GET_INFO_MEMBER(sderby_state::get_bg_tile_info) +{ + int tileno = m_bg_videoram[tile_index * 2]; + int colour = m_bg_videoram[tile_index * 2 + 1] & 0x0f; + + tileinfo.set(1, tileno, colour, 0); +} + +void sderby_state::bg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_bg_videoram[offset]); + m_bg_tilemap->mark_tile_dirty(offset / 2); +} + + +TILE_GET_INFO_MEMBER(sderby_state::get_md_tile_info) +{ + int tileno = m_md_videoram[tile_index * 2]; + int colour = m_md_videoram[tile_index * 2 + 1] & 0x0f; + + tileinfo.set(1, tileno, colour + 16, 0); +} + +void sderby_state::md_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_md_videoram[offset]); + m_md_tilemap->mark_tile_dirty(offset / 2); +} + + +TILE_GET_INFO_MEMBER(sderby_state::get_fg_tile_info) +{ + int tileno = m_fg_videoram[tile_index * 2]; + int colour = m_fg_videoram[tile_index * 2 + 1] & 0x0f; + + tileinfo.set(0, tileno, colour + 32, 0); +} + +void sderby_state::fg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + COMBINE_DATA(&m_fg_videoram[offset]); + m_fg_tilemap->mark_tile_dirty(offset / 2); +} + + +void sderby_state::draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + int height = m_gfxdecode->gfx(0)->height(); + int colordiv = m_gfxdecode->gfx(0)->granularity() / 16; + + for (int offs = 4; offs < m_spriteram.bytes() / 2; offs += 4) { - case 0x00 >> 1: - return ioport("IN0")->read(); - case 0x02 >> 1: - return 0xffff; // to avoid game to reset (needs more work) + int sy = m_spriteram[offs + 3 - 4]; // -4? what the... ??? + if (sy == 0x2000) return; // end of list marker + + int flipx = sy & 0x4000; + int sx = (m_spriteram[offs + 1] & 0x01ff) - 16 - 7; + sy = (256 - 8 - height - sy) & 0xff; + int code = m_spriteram[offs + 2]; + int color = (m_spriteram[offs + 1] & 0x3e00) >> 9; + + m_gfxdecode->gfx(1)->transpen(bitmap, cliprect, + code, + color / colordiv + 48, + flipx, 0, + sx, sy, 0); } +} - logerror("sderby_input_r : offset = %x - PC = %06x\n",offset*2,m_maincpu->pc()); - return 0xffff; +void sderby_state::video_start() +{ + m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sderby_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); + m_md_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sderby_state::get_md_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); + + m_md_tilemap->set_transparent_pen(0); + + m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sderby_state::get_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); + m_fg_tilemap->set_transparent_pen(0); + + save_item(NAME(m_scroll)); +} + +uint32_t sderby_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + draw_sprites(bitmap, cliprect); + m_md_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + return 0; } -uint16_t sderby_state::sderbya_input_r(offs_t offset) +uint32_t sderby_state::screen_update_pmroulet(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + m_bg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + m_md_tilemap->draw(screen, bitmap, cliprect, 0, 0); + draw_sprites(bitmap, cliprect); + m_fg_tilemap->draw(screen, bitmap, cliprect, 0, 0); + return 0; +} + + +void sderby_state::scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask) +{ + data = COMBINE_DATA(&m_scroll[offset]); + + switch (offset) + { + case 0: m_fg_tilemap->set_scrollx(0, data + 2); break; + case 1: m_fg_tilemap->set_scrolly(0, data - 8); break; + case 2: m_md_tilemap->set_scrollx(0, data + 4); break; + case 3: m_md_tilemap->set_scrolly(0, data - 8); break; + case 4: m_bg_tilemap->set_scrollx(0, data + 6); break; + case 5: m_bg_tilemap->set_scrolly(0, data - 8); break; + } +} + + +// machine + +/*************************** +* R/W Handlers * +***************************/ + +uint16_t sderby_state::input_r(offs_t offset) { switch (offset) { case 0x00 >> 1: - return ioport("IN0")->read(); + return m_in[0]->read(); case 0x02 >> 1: return 0xffff; // to avoid game to reset (needs more work) } - logerror("sderby_input_r : offset = %x - PC = %06x\n",offset*2,m_maincpu->pc()); + LOGINPUTS("input_r : offset = %x - PC = %06x\n", offset * 2, m_maincpu->pc()); return 0xffff; } - uint16_t sderby_state::roulette_input_r(offs_t offset) { switch (offset) { case 0x00 >> 1: - return ioport("IN0")->read(); + return m_in[0]->read(); case 0x02 >> 1: - return ioport("IN1")->read(); + return m_in[1]->read(); case 0x04 >> 1: - return ioport("IN2")->read(); + return m_in[2]->read(); } return 0xffff; @@ -136,7 +337,7 @@ uint16_t sderby_state::roulette_input_r(offs_t offset) Writes to the MCU are always the same values. At beginning, the code writes 3 values: 0x53, 0x5a and 0x0d. - Then, whith each placed bet the code normally writes 0x4e. + Then, with each placed bet the code normally writes 0x4e. After that, there are 2 reads expecting the MCU response. Most probably there is a shared RAM there for communication, @@ -148,7 +349,7 @@ uint16_t sderby_state::roulette_input_r(offs_t offset) uint16_t sderby_state::rprot_r() { - logerror("rprot_r : offset = %02x\n",m_maincpu->pc()); + LOGCROUPIERMCU("rprot_r : offset = %02x\n", m_maincpu->pc()); /* This is the only mask I found that allow a normal play. Using other values, the game hangs waiting for response, @@ -162,7 +363,7 @@ uint16_t sderby_state::rprot_r() void sderby_state::rprot_w(uint16_t data) { - logerror("rprot_w %02x\n", data); + LOGCROUPIERMCU("rprot_w %02x\n", data); } @@ -206,9 +407,9 @@ void sderby_state::sderby_out_w(uint16_t data) x--- ---- End of Race lamp. */ - m_lamps[0] = BIT(data, 0); /* Lamp 1 - START */ - m_lamps[1] = BIT(data, 1); /* Lamp 2 - BET */ - m_lamps[2] = BIT(data, 15); /* Lamp 3 - END OF RACE */ + m_lamps[0] = BIT(data, 0); // Lamp 1 - START + m_lamps[1] = BIT(data, 1); // Lamp 2 - BET + m_lamps[2] = BIT(data, 15); // Lamp 3 - END OF RACE machine().bookkeeping().coin_counter_w(0, data & 0x2000); } @@ -251,13 +452,13 @@ void sderby_state::scmatto_out_w(uint16_t data) --x- ---- Coin counter. */ - m_lamps[0] = BIT(data, 0); /* Lamp 1 - HOLD 1 */ - m_lamps[1] = BIT(data, 1); /* Lamp 2 - HOLD 2 */ - m_lamps[2] = BIT(data, 2); /* Lamp 3 - HOLD 3 */ - m_lamps[3] = BIT(data, 3); /* Lamp 4 - HOLD 4 */ - m_lamps[4] = BIT(data, 4); /* Lamp 5 - HOLD 5 */ - m_lamps[5] = BIT(data, 5); /* Lamp 6 - START */ - m_lamps[6] = BIT(data, 6); /* Lamp 7 - BET */ + m_lamps[0] = BIT(data, 0); // Lamp 1 - HOLD 1 + m_lamps[1] = BIT(data, 1); // Lamp 2 - HOLD 2 + m_lamps[2] = BIT(data, 2); // Lamp 3 - HOLD 3 + m_lamps[3] = BIT(data, 3); // Lamp 4 - HOLD 4 + m_lamps[4] = BIT(data, 4); // Lamp 5 - HOLD 5 + m_lamps[5] = BIT(data, 5); // Lamp 6 - START + m_lamps[6] = BIT(data, 6); // Lamp 7 - BET machine().bookkeeping().coin_counter_w(0, data & 0x2000); } @@ -287,8 +488,8 @@ void sderby_state::roulette_out_w(uint16_t data) ---- x--- Unknown (always activated). */ - m_lamps[0] = BIT(data, 0); /* Lamp 1 - START */ - m_lamps[1] = BIT(data, 1); /* Lamp 2 - BET */ + m_lamps[0] = BIT(data, 0); // Lamp 1 - START + m_lamps[1] = BIT(data, 1); // Lamp 2 - BET } @@ -299,18 +500,18 @@ void sderby_state::roulette_out_w(uint16_t data) void sderby_state::sderby_map(address_map &map) { map(0x000000, 0x07ffff).rom(); - map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::sderby_videoram_w)).share("videoram"); /* bg */ - map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::sderby_md_videoram_w)).share("md_videoram"); /* mid */ - map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::sderby_fg_videoram_w)).share("fg_videoram"); /* fg */ - map(0x104000, 0x10400b).w(FUNC(sderby_state::sderby_scroll_w)); - map(0x10400c, 0x10400d).nopw(); /* ??? - check code at 0x000456 (executed once at startup) */ - map(0x10400e, 0x10400f).nopw(); /* ??? - check code at 0x000524 (executed once at startup) */ - map(0x200000, 0x200fff).ram().share("spriteram"); - map(0x308000, 0x30800d).r(FUNC(sderby_state::sderby_input_r)); - map(0x308008, 0x308009).w(FUNC(sderby_state::sderby_out_w)); /* output port */ + map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::bg_videoram_w)).share(m_bg_videoram); + map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::md_videoram_w)).share(m_md_videoram); + map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::fg_videoram_w)).share(m_fg_videoram); + map(0x104000, 0x10400b).w(FUNC(sderby_state::scroll_w)); + map(0x10400c, 0x10400d).nopw(); // ??? - check code at 0x000456 (executed once at startup) + map(0x10400e, 0x10400f).nopw(); // ??? - check code at 0x000524 (executed once at startup) + map(0x200000, 0x200fff).ram().share(m_spriteram); + map(0x308000, 0x30800d).r(FUNC(sderby_state::input_r)); + map(0x308008, 0x308009).w(FUNC(sderby_state::sderby_out_w)); map(0x30800f, 0x30800f).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x380000, 0x380fff).w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x500000, 0x500001).nopw(); /* unknown... write 0x01 in game, and 0x00 on reset */ + map(0x500000, 0x500001).nopw(); map(0xd00000, 0xd007ff).ram().share("nvram"); map(0xffc000, 0xffffff).ram(); } @@ -318,18 +519,18 @@ void sderby_state::sderby_map(address_map &map) void sderby_state::sderbya_map(address_map &map) { map(0x000000, 0x07ffff).rom(); - map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::sderby_videoram_w)).share("videoram"); /* bg */ - map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::sderby_md_videoram_w)).share("md_videoram"); /* mid */ - map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::sderby_fg_videoram_w)).share("fg_videoram"); /* fg */ - map(0x104000, 0x10400b).w(FUNC(sderby_state::sderby_scroll_w)); - map(0x10400c, 0x10400d).nopw(); /* ??? - check code at 0x000456 (executed once at startup) */ - map(0x10400e, 0x10400f).nopw(); /* ??? - check code at 0x000524 (executed once at startup) */ - map(0x200000, 0x200fff).ram().share("spriteram"); - map(0x308000, 0x30800d).r(FUNC(sderby_state::sderbya_input_r)); - map(0x308008, 0x308009).w(FUNC(sderby_state::sderby_out_w)); /* output port */ + map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::bg_videoram_w)).share(m_bg_videoram); + map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::md_videoram_w)).share(m_md_videoram); + map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::fg_videoram_w)).share(m_fg_videoram); + map(0x104000, 0x10400b).w(FUNC(sderby_state::scroll_w)); + map(0x10400c, 0x10400d).nopw(); // ??? - check code at 0x000456 (executed once at startup) + map(0x10400e, 0x10400f).nopw(); // ??? - check code at 0x000524 (executed once at startup) + map(0x200000, 0x200fff).ram().share(m_spriteram); + map(0x308000, 0x30800d).r(FUNC(sderby_state::input_r)); + map(0x308008, 0x308009).w(FUNC(sderby_state::sderby_out_w)); map(0x30800f, 0x30800f).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x380000, 0x380fff).w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x300000, 0x300001).nopw(); /* unknown... write 0x01 in game, and 0x00 on reset */ //MOD + map(0x300000, 0x300001).nopw(); // unknown... write 0x01 in game, and 0x00 on reset //MOD map(0xcf0000, 0xcf07ff).ram().share("nvram"); map(0xcfc000, 0xcfffff).ram(); //MOD } @@ -338,18 +539,18 @@ void sderby_state::sderbya_map(address_map &map) void sderby_state::luckboom_map(address_map &map) { map(0x000000, 0x07ffff).rom(); - map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::sderby_videoram_w)).share("videoram"); /* bg */ - map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::sderby_md_videoram_w)).share("md_videoram"); /* mid */ - map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::sderby_fg_videoram_w)).share("fg_videoram"); /* fg */ - map(0x104000, 0x10400b).w(FUNC(sderby_state::sderby_scroll_w)); - map(0x10400c, 0x10400d).nopw(); /* ??? - check code at 0x000456 (executed once at startup) */ - map(0x10400e, 0x10400f).nopw(); /* ??? - check code at 0x000524 (executed once at startup) */ - map(0x200000, 0x200fff).ram().share("spriteram"); - map(0x308000, 0x30800d).r(FUNC(sderby_state::sderby_input_r)); - map(0x308008, 0x308009).w(FUNC(sderby_state::sderby_out_w)); /* output port */ + map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::bg_videoram_w)).share(m_bg_videoram); + map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::md_videoram_w)).share(m_md_videoram); + map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::fg_videoram_w)).share(m_fg_videoram); + map(0x104000, 0x10400b).w(FUNC(sderby_state::scroll_w)); + map(0x10400c, 0x10400d).nopw(); // ??? - check code at 0x000456 (executed once at startup) + map(0x10400e, 0x10400f).nopw(); // ??? - check code at 0x000524 (executed once at startup) + map(0x200000, 0x200fff).ram().share(m_spriteram); + map(0x308000, 0x30800d).r(FUNC(sderby_state::input_r)); + map(0x308008, 0x308009).w(FUNC(sderby_state::sderby_out_w)); map(0x30800f, 0x30800f).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x380000, 0x380fff).w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x500000, 0x500001).nopw(); /* unknown... write 0x01 in game, and 0x00 on reset */ + map(0x500000, 0x500001).nopw(); // unknown... write 0x01 in game, and 0x00 on reset map(0xe00000, 0xe007ff).ram().share("nvram"); map(0xff0000, 0xffffff).ram(); } @@ -357,67 +558,83 @@ void sderby_state::luckboom_map(address_map &map) void sderby_state::spacewin_map(address_map &map) { map(0x000000, 0x03ffff).rom(); - map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::sderby_videoram_w)).share("videoram"); /* bg */ - map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::sderby_md_videoram_w)).share("md_videoram"); /* mid */ - map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::sderby_fg_videoram_w)).share("fg_videoram"); /* fg */ - map(0x104000, 0x10400b).w(FUNC(sderby_state::sderby_scroll_w)); /* tilemaps offset control */ - map(0x10400c, 0x10400d).nopw(); /* seems another video register. constantly used */ - map(0x10400e, 0x10400f).nopw(); /* seems another video register. constantly used */ - map(0x104010, 0x105fff).nopw(); /* unknown */ - map(0x300000, 0x300001).nopw(); /* unknown... write 0x01 in game, and 0x00 on reset */ - map(0x308000, 0x30800d).r(FUNC(sderby_state::sderby_input_r)); - map(0x308008, 0x308009).w(FUNC(sderby_state::scmatto_out_w)); /* output port */ + map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::bg_videoram_w)).share(m_bg_videoram); + map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::md_videoram_w)).share(m_md_videoram); + map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::fg_videoram_w)).share(m_fg_videoram); + map(0x104000, 0x10400b).w(FUNC(sderby_state::scroll_w)); + map(0x10400c, 0x10400d).nopw(); // seems another video register. constantly used + map(0x10400e, 0x10400f).nopw(); // seems another video register. constantly used + map(0x104010, 0x105fff).nopw(); // unknown + map(0x300000, 0x300001).nopw(); // unknown... write 0x01 in game, and 0x00 on reset + map(0x308000, 0x30800d).r(FUNC(sderby_state::input_r)); + map(0x308008, 0x308009).w(FUNC(sderby_state::scmatto_out_w)); map(0x30800f, 0x30800f).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x380000, 0x380fff).w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0xd00000, 0xd001ff).ram(); - map(0x800000, 0x800fff).ram().share("spriteram"); - map(0x801000, 0x80100d).nopw(); /* unknown */ - map(0x8f0000, 0x8f07ff).ram().share("nvram"); /* 16K Dallas DS1220Y-200 NVRAM */ + map(0x800000, 0x800fff).ram().share(m_spriteram); + map(0x801000, 0x80100d).nopw(); // unknown + map(0x8f0000, 0x8f07ff).ram().share("nvram"); // 16K Dallas DS1220Y-200 NVRAM map(0x8fc000, 0x8fffff).ram(); } void sderby_state::shinygld_map(address_map &map) { map(0x000000, 0x03ffff).rom(); - map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::sderby_videoram_w)).share("videoram"); /* bg */ - map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::sderby_md_videoram_w)).share("md_videoram"); /* mid */ - map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::sderby_fg_videoram_w)).share("fg_videoram"); /* fg */ - map(0x104000, 0x10400b).w(FUNC(sderby_state::sderby_scroll_w)); /* tilemaps offset control */ - map(0x10400c, 0x10400d).nopw(); /* seems another video register. constantly used */ - map(0x10400e, 0x10400f).nopw(); /* seems another video register. constantly used */ - map(0x104010, 0x105fff).nopw(); /* unknown */ - map(0x300000, 0x300001).nopw(); /* unknown... write 0x01 in game, and 0x00 on reset */ - map(0x308000, 0x30800d).r(FUNC(sderby_state::sderby_input_r)); - map(0x308008, 0x308009).nopw(); /* output port */ + map(0x100000, 0x100fff).ram().w(FUNC(sderby_state::bg_videoram_w)).share(m_bg_videoram); + map(0x101000, 0x101fff).ram().w(FUNC(sderby_state::md_videoram_w)).share(m_md_videoram); + map(0x102000, 0x103fff).ram().w(FUNC(sderby_state::fg_videoram_w)).share(m_fg_videoram); + map(0x104000, 0x10400b).w(FUNC(sderby_state::scroll_w)); + map(0x10400c, 0x10400d).nopw(); // seems another video register. constantly used + map(0x10400e, 0x10400f).nopw(); // seems another video register. constantly used + map(0x104010, 0x105fff).nopw(); // unknown + map(0x300000, 0x300001).nopw(); // unknown... write 0x01 in game, and 0x00 on reset + map(0x308000, 0x30800d).r(FUNC(sderby_state::input_r)); + map(0x308008, 0x308009).nopw(); map(0x30800f, 0x30800f).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x380000, 0x380fff).w(m_palette, FUNC(palette_device::write16)).share("palette"); - map(0x400000, 0x400fff).ram().share("spriteram"); - map(0x401000, 0x40100d).nopw(); /* unknown */ - map(0x700000, 0x7007ff).ram().share("nvram"); /* 16K Dallas DS1220Y-200 NVRAM */ + map(0x400000, 0x400fff).ram().share(m_spriteram); + map(0x401000, 0x40100d).nopw(); // unknown + map(0x700000, 0x7007ff).ram().share("nvram"); // 16K Dallas DS1220Y-200 NVRAM map(0x7f0000, 0x7fffff).ram(); } void sderby_state::roulette_map(address_map &map) { map(0x000000, 0x03ffff).rom(); - map(0x440000, 0x440fff).writeonly().share("spriteram"); - map(0x500000, 0x500fff).ram().w(FUNC(sderby_state::sderby_videoram_w)).share("videoram"); /* bg */ - map(0x501000, 0x501fff).ram().w(FUNC(sderby_state::sderby_md_videoram_w)).share("md_videoram"); /* mid */ - map(0x502000, 0x503fff).ram().w(FUNC(sderby_state::sderby_fg_videoram_w)).share("fg_videoram"); /* fg */ - map(0x504000, 0x50400b).ram().w(FUNC(sderby_state::sderby_scroll_w)); + map(0x440000, 0x440fff).writeonly().share(m_spriteram); + map(0x500000, 0x500fff).ram().w(FUNC(sderby_state::bg_videoram_w)).share(m_bg_videoram); + map(0x501000, 0x501fff).ram().w(FUNC(sderby_state::md_videoram_w)).share(m_md_videoram); + map(0x502000, 0x503fff).ram().w(FUNC(sderby_state::fg_videoram_w)).share(m_fg_videoram); + map(0x504000, 0x50400b).ram().w(FUNC(sderby_state::scroll_w)); map(0x50400e, 0x50400f).nopw(); map(0x708000, 0x708009).r(FUNC(sderby_state::roulette_input_r)); map(0x708006, 0x708007).w(FUNC(sderby_state::roulette_out_w)); map(0x70800b, 0x70800b).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); - map(0x70800c, 0x70800d).nopw(); /* watchdog?? (0x0003) */ - map(0x70800e, 0x70800f).rw(FUNC(sderby_state::rprot_r), FUNC(sderby_state::rprot_w)); /* MCU communication */ + map(0x70800c, 0x70800d).nopw(); // watchdog?? (0x0003) + map(0x70800e, 0x70800f).rw(FUNC(sderby_state::rprot_r), FUNC(sderby_state::rprot_w)); // MCU communication map(0x780000, 0x780fff).w(m_palette, FUNC(palette_device::write16)).share("palette"); map(0xff0000, 0xff07ff).ram().share("nvram"); map(0xffc000, 0xffffff).ram(); } +void sderby_state::magictch_map(address_map &map) // memory map is very similar to the above roulette_map. TODO: verify if deriving makes sense once everything's figured out +{ + map(0x000000, 0x03ffff).rom(); + map(0x440000, 0x440fff).writeonly().share(m_spriteram); + map(0x500000, 0x500fff).ram().w(FUNC(sderby_state::bg_videoram_w)).share(m_bg_videoram); + map(0x501000, 0x501fff).ram().w(FUNC(sderby_state::md_videoram_w)).share(m_md_videoram); + map(0x502000, 0x503fff).ram().w(FUNC(sderby_state::fg_videoram_w)).share(m_fg_videoram); + map(0x504000, 0x50400b).ram().w(FUNC(sderby_state::scroll_w)); + map(0x50400e, 0x50400f).nopw(); + map(0x708000, 0x70800d).r(FUNC(sderby_state::input_r)); + //map(0x708008, 0x708009).w(FUNC(sderby_state::magictch_out_w)); // TODO + map(0x70800f, 0x70800f).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write)); + map(0x780000, 0x780fff).w(m_palette, FUNC(palette_device::write16)).share("palette"); + map(0xf00000, 0xf007ff).ram().share("nvram"); + map(0xff0000, 0xffffff).ram(); +} /*************************** @@ -425,7 +642,7 @@ void sderby_state::roulette_map(address_map &map) ***************************/ static INPUT_PORTS_START( sderby ) - PORT_START("IN0") /* 0x308000.w */ + PORT_START("IN0") // 0x308000.w PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY @@ -445,7 +662,7 @@ static INPUT_PORTS_START( sderby ) INPUT_PORTS_END static INPUT_PORTS_START( sderbya ) - PORT_START("IN0") /* 0x308000.w */ + PORT_START("IN0") // 0x308000.w PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_4WAY @@ -465,7 +682,7 @@ static INPUT_PORTS_START( sderbya ) INPUT_PORTS_END static INPUT_PORTS_START( luckboom ) - PORT_START("IN0") /* 0x308000.w */ + PORT_START("IN0") // 0x308000.w PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) @@ -485,7 +702,7 @@ static INPUT_PORTS_START( luckboom ) INPUT_PORTS_END static INPUT_PORTS_START( spacewin ) - PORT_START("IN0") /* 0x308000.w */ + PORT_START("IN0") // 0x308000.w PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_POKER_HOLD1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_POKER_HOLD2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_POKER_HOLD3 ) @@ -505,7 +722,7 @@ static INPUT_PORTS_START( spacewin ) INPUT_PORTS_END static INPUT_PORTS_START( shinygld ) - PORT_START("IN0") /* 0x308000.w */ + PORT_START("IN0") // 0x308000.w PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_SLOT_STOP1 ) PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SLOT_STOP2 ) PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_SLOT_STOP3 ) @@ -527,7 +744,7 @@ INPUT_PORTS_END static INPUT_PORTS_START( pmroulet ) PORT_START("IN0") PORT_BIT( 0x000f, IP_ACTIVE_LOW, IPT_UNKNOWN ) - PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") /* it must be toggled to boot anyway */ + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_CUSTOM ) PORT_VBLANK("screen") // it must be toggled to boot anyway PORT_SERVICE_NO_TOGGLE(0x0020, IP_ACTIVE_LOW) PORT_BIT( 0x00c0, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0x0f00, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -547,7 +764,7 @@ static INPUT_PORTS_START( pmroulet ) PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON2 ) - PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) /* to cancel bets in 3-button mode */ + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON3 ) // to cancel bets in 3-button mode PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_START1 ) PORT_BIT( 0x0f00, IP_ACTIVE_LOW, IPT_UNKNOWN ) PORT_BIT( 0xf000, IP_ACTIVE_LOW, IPT_UNKNOWN ) @@ -590,8 +807,8 @@ static const gfx_layout tiles16x16_layout = ****************************/ static GFXDECODE_START( gfx_sderby ) - GFXDECODE_ENTRY( "gfx1", 0, tiles8x8_layout, 0x000, 256 ) /* sprites */ - GFXDECODE_ENTRY( "gfx1", 0, tiles16x16_layout, 0x000, 256 ) /* sprites */ + GFXDECODE_ENTRY( "gfx", 0, tiles8x8_layout, 0x000, 256 ) + GFXDECODE_ENTRY( "gfx", 0, tiles16x16_layout, 0x000, 256 ) GFXDECODE_END @@ -612,14 +829,14 @@ void sderby_state::sderby(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(64*8, 64*8); screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1); - screen.set_screen_update(FUNC(sderby_state::screen_update_sderby)); + screen.set_screen_update(FUNC(sderby_state::screen_update)); screen.set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby); PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000); SPEAKER(config, "mono").front_center(); - OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */ + OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified } void sderby_state::sderbya(machine_config &config) @@ -635,14 +852,14 @@ void sderby_state::sderbya(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(64*8, 64*8); screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1); - screen.set_screen_update(FUNC(sderby_state::screen_update_sderby)); + screen.set_screen_update(FUNC(sderby_state::screen_update)); screen.set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby); PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000); SPEAKER(config, "mono").front_center(); - OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */ + OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified } void sderby_state::luckboom(machine_config &config) @@ -658,14 +875,14 @@ void sderby_state::luckboom(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(64*8, 64*8); screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1); - screen.set_screen_update(FUNC(sderby_state::screen_update_sderby)); + screen.set_screen_update(FUNC(sderby_state::screen_update)); screen.set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby); PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000); SPEAKER(config, "mono").front_center(); - OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */ + OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified } void sderby_state::spacewin(machine_config &config) @@ -688,7 +905,7 @@ void sderby_state::spacewin(machine_config &config) PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000); SPEAKER(config, "mono").front_center(); - OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */ + OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified } void sderby_state::shinygld(machine_config &config) @@ -704,14 +921,14 @@ void sderby_state::shinygld(machine_config &config) screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); screen.set_size(64*8, 64*8); screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1); - screen.set_screen_update(FUNC(sderby_state::screen_update_sderby)); + screen.set_screen_update(FUNC(sderby_state::screen_update)); screen.set_palette(m_palette); GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby); PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000); SPEAKER(config, "mono").front_center(); - OKIM6295(config, "oki", 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 verified */ + OKIM6295(config, "oki", 1.056_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 verified } void sderby_state::pmroulet(machine_config &config) @@ -724,7 +941,30 @@ void sderby_state::pmroulet(machine_config &config) screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate + screen.set_size(64*8, 64*8); + screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1); + screen.set_screen_update(FUNC(sderby_state::screen_update_pmroulet)); + screen.set_palette(m_palette); + + GFXDECODE(config, m_gfxdecode, m_palette, gfx_sderby); + PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000); + + SPEAKER(config, "mono").front_center(); + OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 not verified +} + +void sderby_state::magictch(machine_config &config) +{ + M68000(config, m_maincpu, 12_MHz_XTAL); + m_maincpu->set_addrmap(AS_PROGRAM, &sderby_state::magictch_map); + m_maincpu->set_vblank_int("screen", FUNC(sderby_state::irq2_line_hold)); + + NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate screen.set_size(64*8, 64*8); screen.set_visarea(4*8, 44*8-1, 3*8, 33*8-1); screen.set_screen_update(FUNC(sderby_state::screen_update_pmroulet)); @@ -734,7 +974,7 @@ void sderby_state::pmroulet(machine_config &config) PALETTE(config, m_palette).set_format(palette_device::RGBx_555, 0x1000); SPEAKER(config, "mono").front_center(); - OKIM6295(config, "oki", 1056000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); /* clock frequency & pin 7 not verified */ + OKIM6295(config, "oki", 1_MHz_XTAL, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 1.0); // clock frequency & pin 7 verified } @@ -768,14 +1008,14 @@ two FPGA chips - one labelled 'Playmark 010412' */ ROM_START( sderby ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ + ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 Code ROM_LOAD16_BYTE( "22.bin", 0x00000, 0x20000, CRC(a319f1e0) SHA1(d932cc7e990aa87308dcd9ffa5af2aaea333aa9a) ) ROM_LOAD16_BYTE( "23.bin", 0x00001, 0x20000, CRC(1d6e2321) SHA1(3bb32021cc9ee6bd6d1fd79a89159fef70f34f41) ) - ROM_REGION( 0x080000, "oki", 0 ) /* Samples */ + ROM_REGION( 0x080000, "oki", 0 ) ROM_LOAD( "21.bin", 0x00000, 0x80000, CRC(6f9f2f2b) SHA1(9778439979bc21b3e49f0c16353488a33b93c01b) ) - ROM_REGION( 0xa0000, "gfx1", 0 ) /* Sprites */ + ROM_REGION( 0xa0000, "gfx", 0 ) ROM_LOAD( "24.bin", 0x00000, 0x20000, CRC(93c917df) SHA1(dc2fa5e29749ec92871c66146c0412a23f47e316) ) ROM_LOAD( "25.bin", 0x20000, 0x20000, CRC(7ba485cd) SHA1(b0170614d713af9d1556251c76ae762de872abe6) ) ROM_LOAD( "26.bin", 0x40000, 0x20000, CRC(beabe4f7) SHA1(a5615450fae930cb2408f201a9faa12551de0d70) ) @@ -784,14 +1024,14 @@ ROM_START( sderby ) ROM_END ROM_START( sderbya ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ + ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 Code ROM_LOAD16_BYTE( "22.u16", 0x00000, 0x20000, CRC(5baadc33) SHA1(475843d3f99f5a6aa25bdba75b251ad6be32802f) ) ROM_LOAD16_BYTE( "23.u15", 0x00001, 0x20000, CRC(04518b8c) SHA1(97598c43c1cb0a757bca70c0a498838144b2302b) ) - ROM_REGION( 0x080000, "oki", 0 ) /* Samples */ + ROM_REGION( 0x080000, "oki", 0 ) ROM_LOAD( "274001.u147", 0x00000, 0x80000, CRC(6f9f2f2b) SHA1(9778439979bc21b3e49f0c16353488a33b93c01b) ) - ROM_REGION( 0x140000, "gfx1", 0 ) /* Sprites */ + ROM_REGION( 0x140000, "gfx", 0 ) ROM_LOAD( "24.u141", 0x000000, 0x40000, CRC(54234f72) SHA1(c2e3e547255174daa9a6acad743c210b92ded385) ) ROM_LOAD( "25.u142", 0x040000, 0x40000, CRC(1bd98cf7) SHA1(67143a16e2cf01868fac3d8d6d9db423f77d09b9) ) ROM_LOAD( "26.u143", 0x080000, 0x40000, CRC(21bf2004) SHA1(7f7cbdcd89807c9e8ca64023a0060b18ef9b6536) ) @@ -838,14 +1078,14 @@ Title depends on graphics type in test mode. */ ROM_START( spacewin ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 Code */ + ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 Code ROM_LOAD16_BYTE( "2.u16", 0x00000, 0x20000, CRC(2d17c2ab) SHA1(833ab39081fbc3d114103055e3a3f2ea2a28f158) ) ROM_LOAD16_BYTE( "3.u15", 0x00001, 0x20000, CRC(fd6f93ef) SHA1(1dc35fd92a0185434b44aa3c7da47a408fb2ce27) ) - ROM_REGION( 0x080000, "oki", 0 ) /* Samples */ + ROM_REGION( 0x080000, "oki", 0 ) ROM_LOAD( "1.u147", 0x00000, 0x40000, CRC(eedc7090) SHA1(fc8cabf7a11a1de3ccc3b8860afd8f32669608b8) ) - ROM_REGION( 0xa0000, "gfx1", 0 ) /* Sprites */ + ROM_REGION( 0xa0000, "gfx", 0 ) ROM_LOAD( "4.u141", 0x000000, 0x20000, CRC(ce20c599) SHA1(93358c3a891c66ca944eb684bd47e9c25bfcb88d) ) ROM_LOAD( "5.u142", 0x020000, 0x20000, CRC(ae4f8e06) SHA1(cb3b941c67ae5c9df005d9f8b2105dc5a114f19f) ) ROM_LOAD( "6.u143", 0x040000, 0x20000, CRC(b99afc96) SHA1(589270dbd5022db2d032da85a9813c271fa71a90) ) @@ -855,14 +1095,14 @@ ROM_END // This board seems very similar to the spacewin's one. ROM_START( shinygld ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 Code */ + ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 Code ROM_LOAD16_BYTE( "16.u16", 0x00000, 0x20000, CRC(4b08a668) SHA1(8444e7624a40e14eca73c425db1cd574c2bf02e0) ) // 27C1001 ROM_LOAD16_BYTE( "17.u15", 0x00001, 0x20000, CRC(eb126e19) SHA1(d02ba03551f71f3ca46bee49291e4423daeea0ce) ) // 27C1001 - ROM_REGION( 0x080000, "oki", 0 ) /* Samples */ + ROM_REGION( 0x080000, "oki", 0 ) ROM_LOAD( "15.u147", 0x00000, 0x40000, CRC(66db6b15) SHA1(4a1ca962c61d60db8ff66c81253131d067bec8c6) ) // 27C2001 - ROM_REGION( 0xa0000, "gfx1", 0 ) /* Sprites */ + ROM_REGION( 0xa0000, "gfx", 0 ) ROM_LOAD( "18.u141", 0x000000, 0x20000, CRC(a905c02d) SHA1(07a0a70424aa759e4c552408154c2d1515f512d5) ) // 27C1001 ROM_LOAD( "19.u142", 0x020000, 0x20000, CRC(8db53f3b) SHA1(aeb2da8bb065bb49edae1de51f6db9a7a02989c3) ) // 27C1001 ROM_LOAD( "20.u143", 0x040000, 0x20000, CRC(be54ae86) SHA1(23c8a01aa05204a6cd186a59269e515a068e23c4) ) // 27C1001 @@ -871,12 +1111,12 @@ ROM_START( shinygld ) /* Dumper's note: Board carries five PLDs : one GAL22V10 near the 68000 CPU (which most likely acts as main address decoder), three PALCE22V10H (two are near the GFX ROMs, probably for enabling them), one PALCE16V8H.*/ - ROM_REGION( 0x1000, "plds", 0) - ROM_LOAD( "gal22v10.bin", 0x0400, 0x02e5, NO_DUMP ) // soldered - ROM_LOAD( "palce22v10_1.bin", 0x2dd, 0x2dd, NO_DUMP ) // soldered - ROM_LOAD( "palce22v10_2.bin", 0x2dd, 0x2dd, NO_DUMP ) // soldered - ROM_LOAD( "palce22v10_3.bin", 0x2dd, 0x2dd, NO_DUMP ) // soldered - ROM_LOAD( "palce16v8h.bin", 0x0200, 0x0117, NO_DUMP ) // soldered + ROM_REGION( 0xd00, "plds", 0) + ROM_LOAD( "gal22v10.bin", 0x000, 0x2e5, NO_DUMP ) // soldered + ROM_LOAD( "palce22v10_1.bin", 0x300, 0x2dd, NO_DUMP ) // soldered + ROM_LOAD( "palce22v10_2.bin", 0x600, 0x2dd, NO_DUMP ) // soldered + ROM_LOAD( "palce22v10_3.bin", 0x900, 0x2dd, NO_DUMP ) // soldered + ROM_LOAD( "palce16v8h.bin", 0xb00, 0x117, NO_DUMP ) // soldered ROM_END /* @@ -940,17 +1180,17 @@ CRC-32 : D4C2B7DAh */ ROM_START( croupier ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 code ROM_LOAD16_BYTE( "2.bin", 0x00000, 0x20000, CRC(e7941975) SHA1(ea32cd51b8d87205a1d6c6a83ebf8b50e03c55fc)) ROM_LOAD16_BYTE( "3.bin", 0x00001, 0x20000, CRC(29d06a38) SHA1(c6fdca1a31fad9abf854e521e593f3ec8018ae6d)) ROM_REGION( 0x4008, "pic16c74", 0 ) ROM_LOAD( "pic16c74.u39", 0x00000, 0x4008, CRC(9cb88e5b) SHA1(3c6b371efeda757f2bcab6c860e7585b628c210a)) - ROM_REGION( 0x080000, "oki", 0 ) /* samples are ok */ + ROM_REGION( 0x080000, "oki", 0 ) ROM_LOAD( "1.bin", 0x00000, 0x40000, CRC(6673de85) SHA1(df390cd6268efc0e743a9020f19bc0cbeb757cfa)) - ROM_REGION( 0x280000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x280000, "gfx", 0 ) ROM_LOAD( "4.bin", 0x000000, 0x80000, CRC(efcddac9) SHA1(72435ec478b70a067d47f3daf7c224169ee5827a)) ROM_LOAD( "5.bin", 0x080000, 0x80000, CRC(bc75ef8f) SHA1(1f3dc457e5ae143d53cfef0e1fcb4586dceefb67)) ROM_LOAD( "6.bin", 0x100000, 0x80000, CRC(e47d5f55) SHA1(a341e24f98125265cb3986f8c7ce84eedd056b71)) @@ -959,17 +1199,17 @@ ROM_START( croupier ) ROM_END ROM_START( croupiera ) - ROM_REGION( 0x40000, "maincpu", 0 ) /* 68000 code */ + ROM_REGION( 0x40000, "maincpu", 0 ) // 68000 code ROM_LOAD16_BYTE( "2.bin", 0x00000, 0x20000, CRC(1677a2de) SHA1(4dcbb3c1ce9b65e06ba7e0cffa00c0c8016538f5)) // sldh ROM_LOAD16_BYTE( "3.bin", 0x00001, 0x20000, CRC(11acaac2) SHA1(19e7bbbf4356fc9a866f9f36d0568c42d6a36c07)) // sldh ROM_REGION( 0x4008, "pic16c74", 0 ) ROM_LOAD( "pic16c74.u39", 0x00000, 0x4008, CRC(9cb88e5b) SHA1(3c6b371efeda757f2bcab6c860e7585b628c210a)) - ROM_REGION( 0x080000, "oki", 0 ) /* samples are ok */ + ROM_REGION( 0x080000, "oki", 0 ) ROM_LOAD( "1.bin", 0x00000, 0x40000, CRC(6673de85) SHA1(df390cd6268efc0e743a9020f19bc0cbeb757cfa)) - ROM_REGION( 0x280000, "gfx1", 0 ) /* sprites */ + ROM_REGION( 0x280000, "gfx", 0 ) ROM_LOAD( "4.bin", 0x000000, 0x80000, CRC(efcddac9) SHA1(72435ec478b70a067d47f3daf7c224169ee5827a)) ROM_LOAD( "5.bin", 0x080000, 0x80000, CRC(bc75ef8f) SHA1(1f3dc457e5ae143d53cfef0e1fcb4586dceefb67)) ROM_LOAD( "6.bin", 0x100000, 0x80000, CRC(e47d5f55) SHA1(a341e24f98125265cb3986f8c7ce84eedd056b71)) @@ -1009,14 +1249,14 @@ QTY Type position status ROM_START( luckboom ) - ROM_REGION( 0x80000, "maincpu", 0 ) /* 68000 Code */ + ROM_REGION( 0x80000, "maincpu", 0 ) // 68000 Code ROM_LOAD16_BYTE( "2.u16", 0x00000, 0x20000, CRC(0a20eaca) SHA1(edd325b60b3a3ce84e89f8be91b9e19f82d15317) ) ROM_LOAD16_BYTE( "3.u15", 0x00001, 0x20000, CRC(0d3bb24c) SHA1(31826ec29650aa8b70e1b713678401113e008832) ) - ROM_REGION( 0x080000, "oki", 0 ) /* Samples */ + ROM_REGION( 0x080000, "oki", 0 ) ROM_LOAD( "1.u147", 0x00000, 0x40000, CRC(0d42c0a3) SHA1(1b1d4c7dcbb063e8bf133063770b753947d1a017) ) - ROM_REGION( 0xa0000, "gfx1", 0 ) /* Sprites */ + ROM_REGION( 0xa0000, "gfx", 0 ) ROM_LOAD( "4.u141", 0x000000, 0x20000, CRC(3aeccad7) SHA1(4104dd3ae928c1a876ac9b460fe18b58ce1206f7) ) ROM_LOAD( "5.u142", 0x020000, 0x20000, CRC(4e4f9ac6) SHA1(e9b0c48195d8b21cdab16d66423ff43e6292ef2c) ) ROM_LOAD( "6.u143", 0x040000, 0x20000, CRC(d1b4910e) SHA1(cfcb14bcd992bceaa634b20eb2d446caa62b6d82) ) @@ -1025,6 +1265,40 @@ ROM_START( luckboom ) ROM_END +/* +ZW3 PCB with 'MAGIC' sticker +1x MC68000FN12 +1x scratched off DIP-40 chip near the main CPU +1x M48Z02-150PC1 ZEROPOWER RAM +1x 12 MHz XTAL +1x 14.318180 MHz XTAL +3x Actel A1020B FPGA +1x Oki M6295 +1x 1.000J blue resonator +*/ + +ROM_START( magictch ) + ROM_REGION( 0x40000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "22.u43", 0x00000, 0x20000, CRC(47f047b1) SHA1(f47ab9734f6bb1dc50baf159bca144fa79eac1a5) ) // TMS27C010A + ROM_LOAD16_BYTE( "23.u42", 0x00001, 0x20000, CRC(f63e31bf) SHA1(e96da519a8d6488d600e031ac48f5ce1a8a376f5) ) // TMS27C010A + + ROM_REGION( 0x040000, "oki", 0 ) + ROM_LOAD( "21.u16", 0x00000, 0x40000, CRC(e06a023f) SHA1(b4cd64f6c97e9c3e50a9658e171d748cb9f1c4ef) ) // ST M27C2001, 1xxxxxxxxxxxxxxxxx = 0xFF + + ROM_REGION( 0xa0000, "gfx", 0 ) + ROM_LOAD( "28.u76", 0x000000, 0x20000, CRC(ca49b54c) SHA1(69d6a3b32ebc357231b22ded40468971ba9ef8c3) ) // TMS27C010A + ROM_LOAD( "27.u77", 0x020000, 0x20000, CRC(55b10fe5) SHA1(caf16512afe1b3fa66018075598cbc2626a63b3e) ) // TMS27C010A + ROM_LOAD( "26.u78", 0x040000, 0x20000, CRC(d7974bd9) SHA1(b49678697e30d104a88adcc8e2c09cd62233c7b4) ) // TMS27C010A + ROM_LOAD( "25.u79", 0x060000, 0x20000, CRC(f825cb9d) SHA1(10ffa614ac82e5c625c36095b298a8acfc7465bf) ) // TMS27C010A + ROM_LOAD( "24.u80", 0x080000, 0x20000, CRC(3bdaea12) SHA1(8d9493ab80f96e6f941039ce6d1b8f1ed3c78379) ) // TMS27C010A + + ROM_REGION( 0x300, "plds", 0) + ROM_LOAD( "gal22cv10-15lnc.u40", 0x000, 0x2e5, NO_DUMP ) // soldered +ROM_END + +} // anonymous namespace + + /****************************** * Game Drivers * ******************************/ @@ -1037,3 +1311,4 @@ GAME( 1996, shinygld, 0, shinygld, shinygld, sderby_state, empty_init, GAMEL( 1997, croupier, 0, pmroulet, pmroulet, sderby_state, empty_init, ROT0, "Playmark", "Croupier (Playmark Roulette v.20.05)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING, layout_pmroulet ) GAMEL( 1997, croupiera, croupier, pmroulet, pmroulet, sderby_state, empty_init, ROT0, "Playmark", "Croupier (Playmark Roulette v.09.04)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING, layout_pmroulet ) GAME( 1996, luckboom, 0, luckboom, luckboom, sderby_state, empty_init, ROT0, "Playmark", "Lucky Boom", 0 ) +GAME( 1998, magictch, 0, magictch, spacewin, sderby_state, empty_init, ROT0, "Playmark", "Magic Touch", MACHINE_NOT_WORKING | MACHINE_IMPERFECT_GRAPHICS ) // wrong text layer hook up, stops during boot and needs debugger help to go in game, inputs aren't done, some scroll offsets are wrong diff --git a/src/mame/includes/sderby.h b/src/mame/includes/sderby.h deleted file mode 100644 index 0b2485421a0..00000000000 --- a/src/mame/includes/sderby.h +++ /dev/null @@ -1,78 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood, Roberto Fresca -#ifndef MAME_INCLUDES_SDERBY_H -#define MAME_INCLUDES_SDERBY_H - -#pragma once - -#include "emupal.h" -#include "tilemap.h" - -class sderby_state : public driver_device -{ -public: - sderby_state(const machine_config &mconfig, device_type type, const char *tag) : - driver_device(mconfig, type, tag), - m_videoram(*this, "videoram"), - m_md_videoram(*this, "md_videoram"), - m_fg_videoram(*this, "fg_videoram"), - m_spriteram(*this, "spriteram"), - m_maincpu(*this, "maincpu"), - m_gfxdecode(*this, "gfxdecode"), - m_palette(*this, "palette"), - m_lamps(*this, "lamp%u", 1U) - { } - - void spacewin(machine_config &config); - void sderbya(machine_config &config); - void pmroulet(machine_config &config); - void shinygld(machine_config &config); - void sderby(machine_config &config); - void luckboom(machine_config &config); - -private: - uint16_t sderby_input_r(offs_t offset); - uint16_t sderbya_input_r(offs_t offset); - uint16_t roulette_input_r(offs_t offset); - uint16_t rprot_r(); - void rprot_w(uint16_t data); - void sderby_out_w(uint16_t data); - void scmatto_out_w(uint16_t data); - void roulette_out_w(uint16_t data); - void sderby_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void sderby_md_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void sderby_fg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - void sderby_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0); - TILE_GET_INFO_MEMBER(get_sderby_tile_info); - TILE_GET_INFO_MEMBER(get_sderby_md_tile_info); - TILE_GET_INFO_MEMBER(get_sderby_fg_tile_info); - uint32_t screen_update_sderby(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - uint32_t screen_update_pmroulet(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - void draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect,int codeshift); - void luckboom_map(address_map &map); - void roulette_map(address_map &map); - void sderby_map(address_map &map); - void sderbya_map(address_map &map); - void shinygld_map(address_map &map); - void spacewin_map(address_map &map); - - virtual void machine_start() override { m_lamps.resolve(); } - virtual void video_start() override; - - required_shared_ptr m_videoram; - required_shared_ptr m_md_videoram; - required_shared_ptr m_fg_videoram; - required_shared_ptr m_spriteram; - - tilemap_t *m_tilemap = nullptr; - tilemap_t *m_md_tilemap = nullptr; - tilemap_t *m_fg_tilemap = nullptr; - - uint16_t m_scroll[6]{}; - required_device m_maincpu; - required_device m_gfxdecode; - required_device m_palette; - output_finder<7> m_lamps; -}; - -#endif // MAME_INCLUDES_SDERBY_H diff --git a/src/mame/mame.lst b/src/mame/mame.lst index ffc0b8f0ab3..e2f179541d2 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -37695,6 +37695,7 @@ scyclone // (c) 1980 Taito Corporation croupier // (c) 1997 Playmark croupiera // (c) 1997 Playmark luckboom // +magictch // sderby // (c) 1996 sderbya // (c) 1996 shinygld // diff --git a/src/mame/video/sderby.cpp b/src/mame/video/sderby.cpp deleted file mode 100644 index 150cea7a7cf..00000000000 --- a/src/mame/video/sderby.cpp +++ /dev/null @@ -1,133 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:David Haywood, Roberto Fresca -#include "emu.h" -#include "includes/sderby.h" - -/* BG Layer */ - -TILE_GET_INFO_MEMBER(sderby_state::get_sderby_tile_info) -{ - int tileno,colour; - - tileno = m_videoram[tile_index*2]; - colour = m_videoram[tile_index*2+1] & 0x0f; - - tileinfo.set(1,tileno,colour,0); -} - -void sderby_state::sderby_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_videoram[offset]); - m_tilemap->mark_tile_dirty(offset/2); -} - -/* MD Layer */ - -TILE_GET_INFO_MEMBER(sderby_state::get_sderby_md_tile_info) -{ - int tileno,colour; - - tileno = m_md_videoram[tile_index*2]; - colour = m_md_videoram[tile_index*2+1] & 0x0f; - - tileinfo.set(1,tileno,colour+16,0); -} - -void sderby_state::sderby_md_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_md_videoram[offset]); - m_md_tilemap->mark_tile_dirty(offset/2); -} - -/* FG Layer */ - -TILE_GET_INFO_MEMBER(sderby_state::get_sderby_fg_tile_info) -{ - int tileno,colour; - - tileno = m_fg_videoram[tile_index*2]; - colour = m_fg_videoram[tile_index*2+1] & 0x0f; - - tileinfo.set(0,tileno,colour+32,0); -} - -void sderby_state::sderby_fg_videoram_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - COMBINE_DATA(&m_fg_videoram[offset]); - m_fg_tilemap->mark_tile_dirty(offset/2); -} - - -void sderby_state::draw_sprites(bitmap_ind16 &bitmap,const rectangle &cliprect,int codeshift) -{ - uint16_t *spriteram16 = m_spriteram; - int offs; - int height = m_gfxdecode->gfx(0)->height(); - int colordiv = m_gfxdecode->gfx(0)->granularity() / 16; - - for (offs = 4;offs < m_spriteram.bytes()/2;offs += 4) - { - int sx,sy,code,color,flipx; - - sy = spriteram16[offs+3-4]; /* -4? what the... ??? */ - if (sy == 0x2000) return; /* end of list marker */ - - flipx = sy & 0x4000; - sx = (spriteram16[offs+1] & 0x01ff) - 16-7; - sy = (256-8-height - sy) & 0xff; - code = spriteram16[offs+2] >> codeshift; - color = (spriteram16[offs+1] & 0x3e00) >> 9; - - m_gfxdecode->gfx(1)->transpen(bitmap,cliprect, - code, - color/colordiv+48, - flipx,0, - sx,sy,0); - } -} - - -void sderby_state::video_start() -{ - m_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sderby_state::get_sderby_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); - m_md_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sderby_state::get_sderby_md_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32); - - m_md_tilemap->set_transparent_pen(0); - - m_fg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(sderby_state::get_sderby_fg_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 64, 32); - m_fg_tilemap->set_transparent_pen(0); -} - -uint32_t sderby_state::screen_update_sderby(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_tilemap->draw(screen, bitmap, cliprect, 0,0); - draw_sprites(bitmap,cliprect,0); - m_md_tilemap->draw(screen, bitmap, cliprect, 0,0); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - -uint32_t sderby_state::screen_update_pmroulet(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) -{ - m_tilemap->draw(screen, bitmap, cliprect, 0,0); - m_md_tilemap->draw(screen, bitmap, cliprect, 0,0); - draw_sprites(bitmap,cliprect,0); - m_fg_tilemap->draw(screen, bitmap, cliprect, 0,0); - return 0; -} - - -void sderby_state::sderby_scroll_w(offs_t offset, uint16_t data, uint16_t mem_mask) -{ - data = COMBINE_DATA(&m_scroll[offset]); - - switch (offset) - { - case 0: m_fg_tilemap->set_scrollx(0,data+2);break; - case 1: m_fg_tilemap->set_scrolly(0,data-8);break; - case 2: m_md_tilemap->set_scrollx(0,data+4);break; - case 3: m_md_tilemap->set_scrolly(0,data-8);break; - case 4: m_tilemap->set_scrollx(0,data+6); break; - case 5: m_tilemap->set_scrolly(0,data-8); break; - } -} -- cgit v1.2.3