1 // license:BSD-3-Clause
2 // copyright-holders:smf, Nicola Salmoria, Couriersud
3 // thanks-to: Marc Lafontaine
4 #ifndef MAME_INCLUDES_POPEYE_H
5 #define MAME_INCLUDES_POPEYE_H
6 
7 #pragma once
8 
9 #include "cpu/z80/z80.h"
10 #include "sound/ay8910.h"
11 #include "video/resnet.h"
12 #include "emupal.h"
13 #include "tilemap.h"
14 
15 #include <array>
16 
17 class tnx1_state : public driver_device
18 {
19 public:
tnx1_state(const machine_config & mconfig,device_type type,const char * tag)20 	tnx1_state(const machine_config &mconfig, device_type type, const char *tag) :
21 		driver_device(mconfig, type, tag),
22 		m_maincpu(*this, "maincpu"),
23 		m_aysnd(*this, "aysnd"),
24 		m_gfxdecode(*this, "gfxdecode"),
25 		m_palette(*this, "palette"),
26 		m_dmasource(*this, "dmasource"),
27 		m_videoram(*this, "videoram"),
28 		m_colorram(*this, "colorram"),
29 		m_color_prom(*this, "proms"),
30 		m_color_prom_spr(*this, "sprpal"),
31 		m_io_mconf(*this, "MCONF"),
32 		m_io_dsw1(*this, "DSW1"),
33 		m_background_scroll{0,0,0},
34 		m_fg_tilemap(nullptr),
35 		m_palette_bank(0),
36 		m_palette_bank_cache(0),
37 		m_prot0(0),
38 		m_prot1(0),
39 		m_prot_shift(0),
40 		m_dswbit(0),
41 		m_nmi_enabled(false),
42 		m_field(0)
43 	{ }
44 
45 	DECLARE_READ_LINE_MEMBER(dsw1_read);
46 	DECLARE_READ_LINE_MEMBER(pop_field_r);
47 
48 	virtual void config(machine_config &config);
49 
50 protected:
51 	required_device<z80_device> m_maincpu;
52 	required_device<ay8910_device> m_aysnd;
53 	required_device<gfxdecode_device> m_gfxdecode;
54 	required_device<palette_device> m_palette;
55 	required_shared_ptr<uint8_t> m_dmasource;
56 	required_shared_ptr<uint8_t> m_videoram;
57 	required_shared_ptr<uint8_t> m_colorram;
58 	required_region_ptr<uint8_t> m_color_prom;
59 	required_region_ptr<uint8_t> m_color_prom_spr;
60 	required_ioport m_io_mconf;
61 	required_ioport m_io_dsw1;
62 
63 	static const res_net_decode_info mb7051_decode_info;
64 	static const res_net_decode_info mb7052_decode_info;
65 	static const res_net_info txt_mb7051_net_info;
66 	static const res_net_info tnx1_bak_mb7051_net_info;
67 	static const res_net_info obj_mb7052_net_info;
bak_mb7051_net_info()68 	virtual const res_net_info bak_mb7051_net_info() { return tnx1_bak_mb7051_net_info; };
69 
70 	std::unique_ptr<bitmap_ind16> m_sprite_bitmap;
71 	std::vector<uint8_t> m_sprite_ram;
72 	std::vector<uint8_t> m_background_ram;
73 	uint8_t m_background_scroll[3];
74 	tilemap_t *m_fg_tilemap;
75 	uint8_t m_palette_bank;
76 	uint8_t m_palette_bank_cache;
77 	uint8_t m_prot0;
78 	uint8_t m_prot1;
79 	uint8_t m_prot_shift;
80 	uint8_t m_dswbit;
81 	bool m_nmi_enabled;
82 	int   m_field;
83 	std::array<bitmap_ind16, 2>  m_bitmap;    // bitmaps for fields
84 
85 	virtual void refresh_w(offs_t offset, uint8_t data);
86 	uint8_t protection_r(offs_t offset);
87 	void protection_w(offs_t offset, uint8_t data);
88 	void popeye_videoram_w(offs_t offset, uint8_t data);
89 	void popeye_colorram_w(offs_t offset, uint8_t data);
90 	virtual void background_w(offs_t offset, uint8_t data);
91 	void popeye_portB_w(uint8_t data);
92 	TILE_GET_INFO_MEMBER(get_fg_tile_info);
93 	virtual void driver_start() override;
94 	virtual void video_start() override;
95 	virtual void tnx1_palette(palette_device &palette);
96 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
97 	virtual DECLARE_WRITE_LINE_MEMBER(screen_vblank);
98 	void update_palette();
99 	virtual void decrypt_rom();
100 	virtual void draw_background(bitmap_ind16 &bitmap, const rectangle &cliprect);
101 	void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect);
102 	void draw_field(bitmap_ind16 &bitmap, const rectangle &cliprect);
103 
104 	virtual void maincpu_program_map(address_map &map);
105 	void maincpu_io_map(address_map &map);
106 
bootleg_sprites()107 	virtual bool bootleg_sprites() const { return false; }
108 };
109 
110 class tpp1_state : public tnx1_state
111 {
112 	using tnx1_state::tnx1_state;
113 protected:
114 	virtual void tnx1_palette(palette_device &palette) override;
115 	virtual void draw_background(bitmap_ind16 &bitmap, const rectangle &cliprect) override;
116 
117 	static const res_net_info tpp1_bak_mb7051_net_info;
bak_mb7051_net_info()118 	virtual const res_net_info bak_mb7051_net_info() override { return tpp1_bak_mb7051_net_info; };
119 };
120 
121 class popeyebl_state : public tpp1_state
122 {
123 	using tpp1_state::tpp1_state;
124 public:
125 	virtual void config(machine_config& config) override;
126 protected:
127 	virtual void decrypt_rom() override;
128 	virtual void maincpu_program_map(address_map &map) override;
129 	void decrypted_opcodes_map(address_map& map);
130 
bootleg_sprites()131 	virtual bool bootleg_sprites() const override { return true; }
132 };
133 
134 class tpp2_state : public tpp1_state
135 {
136 	using tpp1_state::tpp1_state;
137 public:
138 	virtual void config(machine_config &config) override;
139 protected:
140 	bool m_watchdog_enabled;
141 	uint8_t m_watchdog_counter;
142 
143 	virtual void driver_start() override;
144 	virtual void refresh_w(offs_t offset, uint8_t data) override;
145 	virtual DECLARE_WRITE_LINE_MEMBER(screen_vblank) override;
146 	virtual void maincpu_program_map(address_map &map) override;
147 	virtual void decrypt_rom() override;
148 	virtual void draw_background(bitmap_ind16 &bitmap, const rectangle &cliprect) override;
149 	virtual void background_w(offs_t offset, uint8_t data) override;
150 };
151 
152 class tpp2_noalu_state : public tpp2_state
153 {
154 	using tpp2_state::tpp2_state;
155 
156 protected:
157 	virtual void maincpu_program_map(address_map &map) override;
158 };
159 
160 #endif // MAME_INCLUDES_POPEYE_H
161