summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/karnov.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/karnov.cpp')
-rw-r--r--src/mame/drivers/karnov.cpp172
1 files changed, 171 insertions, 1 deletions
diff --git a/src/mame/drivers/karnov.cpp b/src/mame/drivers/karnov.cpp
index b3b06321078..e8d36c3a453 100644
--- a/src/mame/drivers/karnov.cpp
+++ b/src/mame/drivers/karnov.cpp
@@ -78,15 +78,116 @@ Stephh's notes (based on the games M68000 code and some tests) :
*******************************************************************************/
#include "emu.h"
-#include "includes/karnov.h"
#include "cpu/m68000/m68000.h"
#include "cpu/m6502/m6502.h"
+#include "cpu/mcs51/mcs51.h"
+#include "machine/gen_latch.h"
#include "machine/input_merger.h"
#include "sound/ymopn.h"
#include "sound/ymopl.h"
+#include "video/bufsprite.h"
+#include "video/deckarn.h"
+#include "video/decrmc3.h"
#include "screen.h"
#include "speaker.h"
+#include "tilemap.h"
+
+
+namespace {
+
+
+/*************************************
+ *
+ * Type definitions
+ *
+ *************************************/
+
+class karnov_state : public driver_device
+{
+public:
+ karnov_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_audiocpu(*this, "audiocpu"),
+ m_mcu(*this, "mcu"),
+ m_screen(*this, "screen"),
+ m_spriteram(*this, "spriteram") ,
+ m_spritegen(*this, "spritegen"),
+ m_gfxdecode(*this, "gfxdecode"),
+ m_palette(*this, "palette"),
+ m_soundlatch(*this, "soundlatch"),
+ m_ram(*this, "ram"),
+ m_videoram(*this, "videoram"),
+ m_pf_data(*this, "pf_data"),
+ m_scroll(*this, "scroll") { }
+
+ void chelnovjbl(machine_config &config);
+ void karnov(machine_config &config);
+ void wndrplnt(machine_config &config);
+ void karnovjbl(machine_config &config);
+
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+private:
+ required_device<cpu_device> m_maincpu;
+ required_device<cpu_device> m_audiocpu;
+ optional_device<mcs51_cpu_device> m_mcu;
+ required_device<screen_device> m_screen;
+ required_device<buffered_spriteram16_device> m_spriteram;
+ required_device<deco_karnovsprites_device> m_spritegen;
+ required_device<gfxdecode_device> m_gfxdecode;
+ required_device<deco_rmc3_device> m_palette;
+ required_device<generic_latch_8_device> m_soundlatch;
+
+ required_shared_ptr<uint16_t> m_ram;
+ required_shared_ptr<uint16_t> m_videoram;
+ required_shared_ptr<uint16_t> m_pf_data;
+ required_shared_ptr<uint16_t> m_scroll;
+
+ // video
+ tilemap_t *m_bg_tilemap;
+ tilemap_t *m_fix_tilemap;
+
+ void videoram_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void playfield_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ TILE_GET_INFO_MEMBER(get_bg_tile_info);
+ TILE_GET_INFO_MEMBER(get_fix_tile_info);
+ DECLARE_VIDEO_START(karnov);
+ DECLARE_VIDEO_START(wndrplnt);
+ uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ void base_sound_map(address_map &map);
+ void chelnovjbl_mcu_map(address_map &map);
+ void chelnovjbl_mcu_io_map(address_map &map);
+ void karnov_map(address_map &map);
+ void karnovjbl_map(address_map &map);
+ void karnov_sound_map(address_map &map);
+ void karnovjbl_sound_map(address_map &map);
+
+ // protection mcu
+ void mcu_coin_irq(int state);
+ void mcu_ack_w(uint16_t data);
+ uint16_t mcu_r();
+ void mcu_w(uint16_t data);
+ void mcu_p2_w(uint8_t data);
+
+ // protection mcu (bootleg specific)
+ uint8_t mcu_data_l_r();
+ void mcu_data_l_w(uint8_t data);
+ uint8_t mcu_data_h_r();
+ void mcu_data_h_w(uint8_t data);
+ void mcubl_p1_w(uint8_t data);
+
+ uint8_t m_mcu_p0;
+ uint8_t m_mcu_p1;
+ uint8_t m_mcu_p2;
+ uint16_t m_mcu_to_maincpu;
+ uint16_t m_maincpu_to_mcu;
+ bool m_coin_state;
+};
/*************************************
@@ -487,6 +588,72 @@ INPUT_PORTS_END
/*************************************
*
+ * Video emulation
+ *
+ *************************************/
+
+uint32_t karnov_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
+{
+ int const flip = BIT(m_scroll[0], 15);
+
+ m_bg_tilemap->set_flip(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
+ m_fix_tilemap->set_flip(flip ? (TILEMAP_FLIPY | TILEMAP_FLIPX) : 0);
+ m_spritegen->set_flip_screen(flip);
+
+ m_bg_tilemap->set_scrollx(m_scroll[0]);
+ m_bg_tilemap->set_scrolly(m_scroll[1]);
+ m_bg_tilemap->draw(screen, bitmap, cliprect, TILEMAP_DRAW_OPAQUE, 0);
+ m_spritegen->draw_sprites(screen, bitmap, cliprect, m_gfxdecode->gfx(2), m_spriteram->buffer(), 0x800);
+ m_fix_tilemap->draw(screen, bitmap, cliprect, 0, 0);
+
+ return 0;
+}
+
+TILE_GET_INFO_MEMBER(karnov_state::get_fix_tile_info)
+{
+ int tile = m_videoram[tile_index];
+ tileinfo.set(0, tile & 0xfff, tile >> 14, 0);
+}
+
+TILE_GET_INFO_MEMBER(karnov_state::get_bg_tile_info)
+{
+ int tile = m_pf_data[tile_index];
+ tileinfo.set(1, tile & 0x7ff, tile >> 12, 0);
+}
+
+void karnov_state::videoram_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ COMBINE_DATA(&m_videoram[offset]);
+ m_fix_tilemap->mark_tile_dirty(offset);
+}
+
+void karnov_state::playfield_w(offs_t offset, u16 data, u16 mem_mask)
+{
+ COMBINE_DATA(&m_pf_data[offset]);
+ m_bg_tilemap->mark_tile_dirty(offset);
+}
+
+VIDEO_START_MEMBER(karnov_state, karnov)
+{
+ /* Allocate bitmap & tilemap */
+ m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(karnov_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
+ m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(karnov_state::get_fix_tile_info)), TILEMAP_SCAN_ROWS, 8, 8, 32, 32);
+
+ m_fix_tilemap->set_transparent_pen(0);
+}
+
+VIDEO_START_MEMBER(karnov_state, wndrplnt)
+{
+ /* Allocate bitmap & tilemap */
+ m_bg_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(karnov_state::get_bg_tile_info)), TILEMAP_SCAN_ROWS, 16, 16, 32, 32);
+ m_fix_tilemap = &machine().tilemap().create(*m_gfxdecode, tilemap_get_info_delegate(*this, FUNC(karnov_state::get_fix_tile_info)), TILEMAP_SCAN_COLS, 8, 8, 32, 32);
+
+ m_fix_tilemap->set_transparent_pen(0);
+}
+
+
+/*************************************
+ *
* Graphics definitions
*
*************************************/
@@ -1053,6 +1220,9 @@ ROM_START( chelnovjbla )
ROM_END
+} // Anonymous namespace
+
+
/*************************************
*
* Game driver(s)