1 // license:BSD-3-Clause
2 // copyright-holders:David Haywood
3 /*************************************************************************
4 
5     Simple 156 based board
6 
7 *************************************************************************/
8 
9 #include "machine/eepromser.h"
10 #include "sound/okim6295.h"
11 #include "video/deco16ic.h"
12 #include "video/decospr.h"
13 #include "emupal.h"
14 
15 class simpl156_state : public driver_device
16 {
17 public:
simpl156_state(const machine_config & mconfig,device_type type,const char * tag)18 	simpl156_state(const machine_config &mconfig, device_type type, const char *tag)
19 		: driver_device(mconfig, type, tag),
20 		m_maincpu(*this, "maincpu"),
21 		m_deco_tilegen(*this, "tilegen"),
22 		m_eeprom(*this, "eeprom"),
23 		m_okimusic(*this, "okimusic") ,
24 		m_mainram(*this, "mainram"),
25 		m_systemram(*this, "systemram"),
26 		m_sprgen(*this, "spritegen"),
27 		m_palette(*this, "palette") { }
28 
29 	void joemacr(machine_config &config);
30 	void magdrop(machine_config &config);
31 	void chainrec(machine_config &config);
32 	void mitchell156(machine_config &config);
33 	void magdropp(machine_config &config);
34 
35 	void init_simpl156();
36 	void init_joemacr();
37 	void init_charlien();
38 	void init_prtytime();
39 	void init_osman();
40 	void init_chainrec();
41 
42 private:
43 	/* devices */
44 	required_device<cpu_device> m_maincpu;
45 	required_device<deco16ic_device> m_deco_tilegen;
46 	required_device<eeprom_serial_93cxx_device> m_eeprom;
47 	required_device<okim6295_device> m_okimusic;
48 	/* memory pointers */
49 	std::unique_ptr<u16[]>  m_rowscroll[2];
50 	required_shared_ptr<u32> m_mainram;
51 	required_shared_ptr<u32> m_systemram;
52 	optional_device<decospr_device> m_sprgen;
53 	required_device<palette_device> m_palette;
54 	std::unique_ptr<u16[]> m_spriteram;
55 	size_t m_spriteram_size;
56 	DECO16IC_BANK_CB_MEMBER(bank_callback);
57 	DECOSPR_PRIORITY_CB_MEMBER(pri_callback);
58 
59 	void eeprom_w(u32 data);
60 	u32 spriteram_r(offs_t offset);
61 	void spriteram_w(offs_t offset, u32 data, u32 mem_mask);
62 	u32 mainram_r(offs_t offset);
63 	void mainram_w(offs_t offset, u32 data, u32 mem_mask);
64 	template<unsigned Layer> u32 rowscroll_r(offs_t offset);
65 	template<unsigned Layer> void rowscroll_w(offs_t offset, u32 data, u32 mem_mask);
66 	u32 joemacr_speedup_r();
67 	u32 chainrec_speedup_r();
68 	u32 prtytime_speedup_r();
69 	u32 charlien_speedup_r();
70 	u32 osman_speedup_r();
71 
72 	virtual void video_start() override;
73 	u32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
74 	DECLARE_WRITE_LINE_MEMBER(vblank_interrupt);
75 
76 	void chainrec_map(address_map &map);
77 	void joemacr_map(address_map &map);
78 	void magdrop_map(address_map &map);
79 	void magdropp_map(address_map &map);
80 	void mitchell156_map(address_map &map);
81 };
82