1 // license:BSD-3-Clause
2 // copyright-holders:Takahiro Nogi
3 
4 #include "machine/tmp68301.h"
5 #include "screen.h"
6 #include "audio/nichisnd.h"
7 #include "machine/nb1413m3.h"
8 #include "emupal.h"
9 
10 #define VRAM_MAX    3
11 
12 class niyanpai_state : public driver_device
13 {
14 public:
niyanpai_state(const machine_config & mconfig,device_type type,const char * tag)15 	niyanpai_state(const machine_config &mconfig, device_type type, const char *tag)
16 		: driver_device(mconfig, type, tag) ,
17 		m_maincpu(*this, "maincpu"),
18 		m_screen(*this, "screen"),
19 		m_palette(*this, "palette") { }
20 
21 	void musobana(machine_config &config);
22 	void zokumahj(machine_config &config);
23 	void mhhonban(machine_config &config);
24 	void niyanpai(machine_config &config);
25 
26 	void init_niyanpai();
27 
28 	DECLARE_READ_LINE_MEMBER(musobana_outcoin_flag_r);
29 
30 private:
31 	enum
32 	{
33 		TIMER_BLITTER
34 	};
35 
36 	required_device<tmp68301_device> m_maincpu;
37 	required_device<screen_device> m_screen;
38 	required_device<palette_device> m_palette;
39 
40 	// common
41 	int m_scrollx[VRAM_MAX];
42 	int m_scrolly[VRAM_MAX];
43 	int m_blitter_destx[VRAM_MAX];
44 	int m_blitter_desty[VRAM_MAX];
45 	int m_blitter_sizex[VRAM_MAX];
46 	int m_blitter_sizey[VRAM_MAX];
47 	int m_blitter_src_addr[VRAM_MAX];
48 	int m_blitter_direction_x[VRAM_MAX];
49 	int m_blitter_direction_y[VRAM_MAX];
50 	int m_dispflag[VRAM_MAX];
51 	int m_flipscreen[VRAM_MAX];
52 	int m_clutmode[VRAM_MAX];
53 	int m_transparency[VRAM_MAX];
54 	int m_clutsel[VRAM_MAX];
55 	int m_screen_refresh;
56 	int m_nb19010_busyctr;
57 	int m_nb19010_busyflag;
58 	bitmap_ind16 m_tmpbitmap[VRAM_MAX];
59 	std::unique_ptr<uint16_t[]> m_videoram[VRAM_MAX];
60 	std::unique_ptr<uint16_t[]> m_videoworkram[VRAM_MAX];
61 	std::unique_ptr<uint16_t[]> m_palette_ptr;
62 	std::unique_ptr<uint8_t[]> m_clut[VRAM_MAX];
63 	int m_flipscreen_old[VRAM_MAX];
64 	emu_timer *m_blitter_timer;
65 
66 	// musobana and derived machine configs
67 	int m_musobana_inputport;
68 	int m_musobana_outcoin_flag;
69 	uint8_t m_motor_on;
70 
71 	// common
72 	uint16_t dipsw_r();
73 	uint16_t palette_r(offs_t offset);
74 	void palette_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
75 	void blitter_0_w(offs_t offset, uint8_t data);
76 	void blitter_1_w(offs_t offset, uint8_t data);
77 	void blitter_2_w(offs_t offset, uint8_t data);
78 	uint8_t blitter_0_r(offs_t offset);
79 	uint8_t blitter_1_r(offs_t offset);
80 	uint8_t blitter_2_r(offs_t offset);
81 	void clut_0_w(offs_t offset, uint8_t data);
82 	void clut_1_w(offs_t offset, uint8_t data);
83 	void clut_2_w(offs_t offset, uint8_t data);
84 	void clutsel_0_w(uint8_t data);
85 	void clutsel_1_w(uint8_t data);
86 	void clutsel_2_w(uint8_t data);
87 	void tmp68301_parallel_port_w(uint16_t data);
88 
89 	// musobana and derived machine configs
90 	uint16_t musobana_inputport_0_r();
91 	void musobana_inputport_w(uint16_t data);
92 
93 	virtual void video_start() override;
94 	DECLARE_MACHINE_START(musobana);
95 
96 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
97 	int blitter_r(int vram, int offset);
98 	void blitter_w(int vram, int offset, uint8_t data);
99 	void clutsel_w(int vram, uint8_t data);
100 	void clut_w(int vram, int offset, uint8_t data);
101 	void vramflip(int vram);
102 	void update_pixel(int vram, int x, int y);
103 	void gfxdraw(int vram);
104 
105 	DECLARE_WRITE_LINE_MEMBER(vblank_irq);
106 
107 	void mhhonban_map(address_map &map);
108 	void musobana_map(address_map &map);
109 	void niyanpai_map(address_map &map);
110 	void zokumahj_map(address_map &map);
111 
112 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
113 };
114