1 // license:BSD-3-Clause
2 // copyright-holders:Bryan McPhail
3 /*************************************************************************
4 
5     Caveman Ninja (and other DECO 16bit titles)
6 
7 *************************************************************************/
8 
9 #include "cpu/h6280/h6280.h"
10 #include "sound/okim6295.h"
11 #include "video/deco16ic.h"
12 #include "video/bufsprite.h"
13 #include "video/decospr.h"
14 #include "machine/deco_irq.h"
15 #include "machine/deco146.h"
16 #include "machine/deco104.h"
17 #include "machine/gen_latch.h"
18 #include "emupal.h"
19 #include "screen.h"
20 
21 class cninja_state : public driver_device
22 {
23 public:
cninja_state(const machine_config & mconfig,device_type type,const char * tag)24 	cninja_state(const machine_config &mconfig, device_type type, const char *tag)
25 		: driver_device(mconfig, type, tag)
26 		, m_maincpu(*this, "maincpu")
27 		, m_audiocpu(*this, "audiocpu")
28 		, m_ioprot(*this, "ioprot")
29 		, m_deco_tilegen(*this, "tilegen%u", 1U)
30 		, m_oki2(*this, "oki2")
31 		, m_sprgen(*this, "spritegen%u", 1U)
32 		, m_gfxdecode(*this, "gfxdecode")
33 		, m_screen(*this, "screen")
34 		, m_palette(*this, "palette")
35 		, m_soundlatch(*this, "soundlatch")
36 		, m_spriteram(*this, "spriteram%u", 1U)
37 		, m_pf_rowscroll(*this, "pf%u_rowscroll", 1U)
38 		, m_okibank(*this, "okibank")
39 	{ }
40 
41 	/* devices */
42 	required_device<cpu_device> m_maincpu;
43 	required_device<cpu_device> m_audiocpu;
44 	optional_device<deco_146_base_device> m_ioprot;
45 	required_device_array<deco16ic_device, 2> m_deco_tilegen;
46 	optional_device<okim6295_device> m_oki2;
47 	optional_device_array<decospr_device, 2> m_sprgen;
48 	required_device<gfxdecode_device> m_gfxdecode;
49 	required_device<screen_device> m_screen;
50 	required_device<palette_device> m_palette;
51 	optional_device<generic_latch_8_device> m_soundlatch;
52 	optional_device_array<buffered_spriteram16_device, 2> m_spriteram;
53 
54 	/* memory pointers */
55 	required_shared_ptr_array<uint16_t, 4> m_pf_rowscroll;
56 	optional_memory_bank m_okibank;
57 
58 	uint16_t m_priority;
59 
60 	template<int Chip> void cninja_pf_control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
61 	void sound_bankswitch_w(uint8_t data);
62 	void cninjabl2_oki_bank_w(uint8_t data);
63 	void init_mutantf();
64 	void init_cninjabl2();
65 	DECLARE_MACHINE_START(robocop2);
66 	DECLARE_MACHINE_RESET(robocop2);
67 	DECLARE_VIDEO_START(cninja);
68 	DECLARE_VIDEO_START(stoneage);
69 	DECLARE_VIDEO_START(mutantf);
70 	uint32_t screen_update_cninja(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
71 	uint32_t screen_update_cninjabl(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
72 	uint32_t screen_update_cninjabl2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
73 	uint32_t screen_update_edrandy(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
74 	uint32_t screen_update_robocop2(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
75 	uint32_t screen_update_mutantf(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
76 	void cninjabl_draw_sprites( screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect );
77 
78 	DECO16IC_BANK_CB_MEMBER(cninja_bank_callback);
79 	DECO16IC_BANK_CB_MEMBER(robocop2_bank_callback);
80 	DECO16IC_BANK_CB_MEMBER(mutantf_1_bank_callback);
81 	DECO16IC_BANK_CB_MEMBER(mutantf_2_bank_callback);
82 
83 	DECOSPR_PRIORITY_CB_MEMBER(pri_callback);
84 	u16 robocop2_mix_callback(u16 p, u16 p2);
85 
86 	uint16_t edrandy_protection_region_6_146_r(offs_t offset);
87 	void edrandy_protection_region_6_146_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
88 	uint16_t edrandy_protection_region_8_146_r(offs_t offset);
89 	void edrandy_protection_region_8_146_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
90 
91 	uint16_t mutantf_protection_region_0_146_r(offs_t offset);
92 	void mutantf_protection_region_0_146_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
93 	uint16_t cninja_protection_region_0_104_r(offs_t offset);
94 	void cninja_protection_region_0_104_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
95 
96 	uint16_t cninjabl2_sprite_dma_r();
97 	void robocop2_priority_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
98 	uint16_t mutantf_71_r();
99 	void cninjabl(machine_config &config);
100 	void edrandy(machine_config &config);
101 	void cninja(machine_config &config);
102 	void robocop2(machine_config &config);
103 	void stoneage(machine_config &config);
104 	void cninjabl2(machine_config &config);
105 	void mutantf(machine_config &config);
106 	void cninja_map(address_map &map);
107 	void cninjabl2_oki_map(address_map &map);
108 	void cninjabl2_s_map(address_map &map);
109 	void cninjabl_map(address_map &map);
110 	void cninjabl_sound_map(address_map &map);
111 	void edrandy_map(address_map &map);
112 	void mutantf_map(address_map &map);
113 	void robocop2_map(address_map &map);
114 	void sound_map(address_map &map);
115 	void sound_map_mutantf(address_map &map);
116 	void stoneage_s_map(address_map &map);
117 };
118