1 // license:BSD-3-Clause
2 // copyright-holders:Nicola Salmoria
3 /*************************************************************************
4 
5     Pinball Action
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_PBACTION_H
9 #define MAME_INCLUDES_PBACTION_H
10 
11 #pragma once
12 
13 #include "cpu/z80/z80.h"
14 #include "machine/gen_latch.h"
15 #include "machine/z80ctc.h"
16 #include "emupal.h"
17 #include "tilemap.h"
18 
19 class pbaction_state : public driver_device
20 {
21 public:
pbaction_state(const machine_config & mconfig,device_type type,const char * tag)22 	pbaction_state(const machine_config &mconfig, device_type type, const char *tag) :
23 		driver_device(mconfig, type, tag),
24 		m_videoram(*this, "videoram"),
25 		m_videoram2(*this, "videoram2"),
26 		m_colorram(*this, "colorram"),
27 		m_colorram2(*this, "colorram2"),
28 		m_work_ram(*this, "work_ram"),
29 		m_spriteram(*this, "spriteram"),
30 		m_maincpu(*this, "maincpu"),
31 		m_audiocpu(*this, "audiocpu"),
32 		m_gfxdecode(*this, "gfxdecode"),
33 		m_palette(*this, "palette"),
34 		m_soundlatch(*this, "soundlatch"),
35 		m_ctc(*this, "ctc"),
36 		m_decrypted_opcodes(*this, "decrypted_opcodes")
37 	{ }
38 
39 	/* memory pointers */
40 	required_shared_ptr<uint8_t> m_videoram;
41 	required_shared_ptr<uint8_t> m_videoram2;
42 	required_shared_ptr<uint8_t> m_colorram;
43 	required_shared_ptr<uint8_t> m_colorram2;
44 	required_shared_ptr<uint8_t> m_work_ram;
45 	required_shared_ptr<uint8_t> m_spriteram;
46 
47 	/* video-related */
48 	tilemap_t  *m_bg_tilemap;
49 	tilemap_t  *m_fg_tilemap;
50 	int        m_scroll;
51 
52 	/* devices */
53 	required_device<cpu_device> m_maincpu;
54 	required_device<z80_device> m_audiocpu;
55 	required_device<gfxdecode_device> m_gfxdecode;
56 	required_device<palette_device> m_palette;
57 	required_device<generic_latch_8_device> m_soundlatch;
58 	required_device<z80ctc_device> m_ctc;
59 	optional_shared_ptr<uint8_t> m_decrypted_opcodes;
60 
61 	emu_timer *m_soundcommand_timer;
62 	uint8_t      m_nmi_mask;
63 	void pbaction_sh_command_w(uint8_t data);
64 	TIMER_CALLBACK_MEMBER(sound_trigger);
65 	void nmi_mask_w(uint8_t data);
66 	uint8_t sound_data_r();
67 	void sound_irq_ack_w(uint8_t data);
68 	uint8_t pbaction2_prot_kludge_r();
69 	void pbaction_videoram_w(offs_t offset, uint8_t data);
70 	void pbaction_colorram_w(offs_t offset, uint8_t data);
71 	void pbaction_videoram2_w(offs_t offset, uint8_t data);
72 	void pbaction_colorram2_w(offs_t offset, uint8_t data);
73 	void pbaction_scroll_w(uint8_t data);
74 	void pbaction_flipscreen_w(uint8_t data);
75 	void init_pbaction2();
76 	TILE_GET_INFO_MEMBER(get_bg_tile_info);
77 	TILE_GET_INFO_MEMBER(get_fg_tile_info);
78 	virtual void machine_start() override;
79 	virtual void machine_reset() override;
80 	virtual void video_start() override;
81 	uint32_t screen_update_pbaction(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
82 	INTERRUPT_GEN_MEMBER(pbaction_interrupt);
83 	DECLARE_WRITE_LINE_MEMBER(vblank_irq);
84 	DECLARE_WRITE_LINE_MEMBER(sound_irq_clear);
85 	void draw_sprites( bitmap_ind16 &bitmap, const rectangle &cliprect );
86 	void pbaction(machine_config &config);
87 	void pbactionx(machine_config &config);
88 	void decrypted_opcodes_map(address_map &map);
89 	void pbaction_map(address_map &map);
90 	void pbaction_sound_io_map(address_map &map);
91 	void pbaction_sound_map(address_map &map);
92 	void pbaction_alt_sound_map(address_map &map);
93 };
94 
95 class pbaction_tecfri_state : public pbaction_state
96 {
97 public:
pbaction_tecfri_state(const machine_config & mconfig,device_type type,const char * tag)98 	pbaction_tecfri_state(const machine_config &mconfig, device_type type, const char *tag) :
99 		pbaction_state(mconfig, type, tag),
100 		m_subcpu(*this, "subcpu"),
101 		m_ctc2(*this, "ctc2"),
102 		m_maintosublatch(*this, "maintosublatch"),
103 		//m_subtomainlatch(*this, "subtomainlatch"),
104 		m_digits(*this, "digit%u", 0U)
105 	{ }
106 
107 	void pbactiont(machine_config &config);
108 
109 protected:
110 	virtual void machine_start() override;
111 
112 private:
113 	void sub_map(address_map &map);
114 	void sub_io_map(address_map &map);
115 	void main_io_map(address_map &map);
116 
117 	TIMER_CALLBACK_MEMBER(sub_trigger);
118 	emu_timer *m_subcommand_timer;
119 
120 	uint8_t subcpu_r();
121 	void subcpu_w(uint8_t data);
122 
123 	DECLARE_WRITE_LINE_MEMBER(sub8000_w);
124 	DECLARE_WRITE_LINE_MEMBER(sub8001_w);
125 	void sub8008_w(uint8_t data);
126 
127 	void subtomain_w(uint8_t data);
128 	uint8_t maintosub_r();
129 
130 	required_device<z80_device> m_subcpu;
131 	required_device<z80ctc_device> m_ctc2;
132 	required_device<generic_latch_8_device> m_maintosublatch;
133 	//required_device<generic_latch_8_device> m_subtomainlatch;
134 	output_finder<24> m_digits;
135 	uint8_t m_outlatch;
136 	uint32_t m_outdata;
137 };
138 
139 #endif // MAME_INCLUDES_PBACTION_H
140