summaryrefslogtreecommitdiffstats
path: root/src/mame/includes/shangkid.h
blob: 2445b7dc05ba8de607ab17140ed3b5bf6aa2e69b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// license:BSD-3-Clause
// copyright-holders:Phil Stroffolino
#ifndef MAME_INCLUDES_SHANGKID_H
#define MAME_INCLUDES_SHANGKID_H

#pragma once

#include "sound/ay8910.h"
#include "emupal.h"
#include "tilemap.h"

class dynamski_state : public driver_device
{
public:
	dynamski_state(const machine_config &mconfig, device_type type, const char *tag) :
		driver_device(mconfig, type, tag),
		m_maincpu(*this, "maincpu"),
		m_gfxdecode(*this, "gfxdecode"),
		m_videoram(*this, "videoram"),
		m_spriteram(*this, "spriteram")
	{ }

	void dynamski(machine_config &config);

protected:
	virtual void machine_start() override;

	required_device<cpu_device> m_maincpu;
	required_device<gfxdecode_device> m_gfxdecode;
	required_shared_ptr<uint8_t> m_videoram;
	required_shared_ptr<uint8_t> m_spriteram;

	bool m_int_enable[2];

	DECLARE_WRITE_LINE_MEMBER(int_enable_1_w);
	DECLARE_WRITE_LINE_MEMBER(irq_1_w);

private:
	void palette(palette_device &palette) const;

	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
	void draw_background(bitmap_ind16 &bitmap, const rectangle &cliprect, int pri);
	void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprec );

	void prgmap(address_map &map);
	void portmap(address_map &map);
};

class chinhero_state : public dynamski_state
{
public:
	chinhero_state(const machine_config &mconfig, device_type type, const char *tag) :
		dynamski_state(mconfig, type, tag),
		m_audiocpu(*this, "audiocpu"),
		m_bbx(*this, "bbx"),
		m_aysnd(*this, "aysnd"),
		m_videoreg(*this, "videoreg")
	{ }

	void chinhero(machine_config &config);

protected:
	virtual void machine_start() override;
	virtual void video_start() override;

	required_device<cpu_device> m_audiocpu;
	required_device<cpu_device> m_bbx;
	required_device<ay8910_device> m_aysnd;
	required_shared_ptr<uint8_t> m_videoreg;

	int m_gfx_type = 0;

	void nmiq_1_w(uint8_t data);
	void nmiq_2_w(uint8_t data);
	void videoram_w(offs_t offset, uint8_t data);

private:
	bool m_nmi_enable[2]{};
	tilemap_t *m_background = nullptr;

	void ay8910_porta_w(uint8_t data);

	DECLARE_WRITE_LINE_MEMBER(sound_enable_w);
	DECLARE_WRITE_LINE_MEMBER(int_enable_2_w);
	DECLARE_WRITE_LINE_MEMBER(nmi_enable_1_w);
	DECLARE_WRITE_LINE_MEMBER(nmi_enable_2_w);
	DECLARE_WRITE_LINE_MEMBER(irq_2_w);
	DECLARE_WRITE_LINE_MEMBER(coin_counter_1_w);
	DECLARE_WRITE_LINE_MEMBER(coin_counter_2_w);

	TILE_GET_INFO_MEMBER(get_bg_tile_info);

	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);

	void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
	void draw_sprite(const uint8_t *source, bitmap_ind16 &bitmap, const rectangle &cliprect);

	void bbx_map(address_map &map);
	void bbx_portmap(address_map &map);
	void main_map(address_map &map);
	void sound_map(address_map &map);
	void sound_portmap(address_map &map);
};

class shangkid_state : public chinhero_state
{
public:
	shangkid_state(const machine_config &mconfig, device_type type, const char *tag) :
		chinhero_state(mconfig, type, tag),
		m_soundbank(*this, "soundbank")
	{ }

	void shangkid(machine_config &config);

protected:
	virtual void machine_start() override;
	virtual void machine_reset() override;

private:
	required_memory_bank m_soundbank;

	void ay8910_porta_w(uint8_t data);

	void bbx_map(address_map &map);
	void bbx_portmap(address_map &map);
	void main_map(address_map &map);
	void sound_map(address_map &map);
};

#endif // MAME_INCLUDES_SHANGKID_H