1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles,Nicola Salmoria
3 /*************************************************************************
4 
5     Art & Magic hardware
6 
7 **************************************************************************/
8 #include "cpu/tms34010/tms34010.h"
9 #include "sound/okim6295.h"
10 #include "video/tlc34076.h"
11 
12 class artmagic_state : public driver_device
13 {
14 public:
15 	enum
16 	{
17 		TIMER_IRQ_OFF
18 	};
19 
artmagic_state(const machine_config & mconfig,device_type type,const char * tag)20 	artmagic_state(const machine_config &mconfig, device_type type, const char *tag)
21 		: driver_device(mconfig, type, tag)
22 		, m_maincpu(*this, "maincpu")
23 		, m_oki(*this, "oki")
24 		, m_tms(*this, "tms")
25 		, m_tlc34076(*this, "tlc34076")
26 		, m_control(*this, "control")
27 		, m_vram(*this, "vram%u", 0U)
28 		, m_blitter_base(*this, "gfx")
29 	{ }
30 
31 	required_device<cpu_device> m_maincpu;
32 	required_device<okim6295_device> m_oki;
33 	required_device<tms34010_device> m_tms;
34 	required_device<tlc34076_device> m_tlc34076;
35 
36 	required_shared_ptr<uint16_t> m_control;
37 	required_shared_ptr_array<uint16_t, 2> m_vram;
38 	required_region_ptr<uint16_t> m_blitter_base;
39 
40 	uint8_t m_tms_irq;
41 	uint8_t m_hack_irq;
42 	uint8_t m_prot_input[16];
43 	uint8_t m_prot_input_index;
44 	uint8_t m_prot_output[16];
45 	uint8_t m_prot_output_index;
46 	uint8_t m_prot_output_bit;
47 	uint8_t m_prot_bit_index;
48 	uint16_t m_prot_save;
49 	typedef void (artmagic_state::*prot_func)();
50 	prot_func m_protection_handler;
51 	void ultennis_protection();
52 	void cheesech_protection();
53 	void stonebal_protection();
54 
55 	int m_xor[16];
56 	int m_is_stoneball;
57 	uint16_t m_blitter_data[8];
58 	uint8_t m_blitter_page;
59 	attotime m_blitter_busy_until;
60 	emu_timer * m_irq_off_timer;
61 	void control_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
62 	uint16_t ultennis_hack_r();
63 	void protection_bit_w(offs_t offset, uint16_t data);
64 	uint16_t blitter_r();
65 	void blitter_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
66 	DECLARE_WRITE_LINE_MEMBER(m68k_gen_int);
67 	TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg);
68 	TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg);
69 	TMS340X0_SCANLINE_RGB32_CB_MEMBER(scanline);
70 	DECLARE_READ_LINE_MEMBER(prot_r);
71 	void init_shtstar();
72 	void init_cheesech();
73 	void init_ultennis();
74 	void init_stonebal();
75 	virtual void machine_start() override;
76 	virtual void machine_reset() override;
77 	virtual void video_start() override;
78 	void decrypt_cheesech();
79 	void decrypt_ultennis();
80 	void execute_blit();
81 	void update_irq_state();
82 	inline uint16_t *address_to_vram(offs_t *address);
83 
84 	void cheesech(machine_config &config);
85 	void artmagic(machine_config &config);
86 	void shtstar(machine_config &config);
87 	void stonebal(machine_config &config);
88 	void main_map(address_map &map);
89 	void shtstar_guncpu_io_map(address_map &map);
90 	void shtstar_guncpu_map(address_map &map);
91 	void shtstar_map(address_map &map);
92 	void shtstar_subcpu_map(address_map &map);
93 	void stonebal_map(address_map &map);
94 	void stonebal_tms_map(address_map &map);
95 	void tms_map(address_map &map);
96 protected:
97 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
98 };
99