1 // license:BSD-3-Clause
2 // copyright-holders:Olivier Galibert
3 
4 // Williams Pinball Controller Dot Matrix Display
5 
6 // A 128x32 plasma display with 16 pages and refreshed at 240Hz (for PWM luminosity control)
7 
8 #ifndef MAME_VIDEO_WPC_DMD_H
9 #define MAME_VIDEO_WPC_DMD_H
10 
11 #include "machine/timer.h"
12 
13 class wpc_dmd_device : public device_t
14 {
15 public:
16 	wpc_dmd_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
17 	virtual ~wpc_dmd_device();
18 
19 	void registers(address_map &map);
20 
21 	void bank0_w(uint8_t data);
22 	void bank2_w(uint8_t data);
23 	void bank4_w(uint8_t data);
24 	void bank6_w(uint8_t data);
25 	void bank8_w(uint8_t data);
26 	void banka_w(uint8_t data);
27 	void visible_page_w(uint8_t data);
28 	void firq_scanline_w(uint8_t data);
29 
scanline_callback()30 	auto scanline_callback() { return scanline_cb.bind(); }
31 
32 protected:
33 	devcb_write_line scanline_cb;
34 	required_memory_bank dmd0, dmd2, dmd4, dmd6, dmd8, dmda;
35 
36 	uint8_t cur_scanline, visible_page, firq_scanline;
37 	std::vector<uint8_t> ram, screen_buffer, bitcounts;
38 
39 	virtual void device_start() override;
40 	virtual void device_reset() override;
41 	virtual void device_add_mconfig(machine_config &config) override;
42 
43 private:
44 	TIMER_DEVICE_CALLBACK_MEMBER(scanline_timer);
45 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
46 };
47 
48 DECLARE_DEVICE_TYPE(WPC_DMD, wpc_dmd_device)
49 
50 #endif // MAME_VIDEO_WPC_DMD_H
51