1 // license:BSD-3-Clause
2 // copyright-holders:Takahiro Nogi
3 /******************************************************************************
4 
5     nbmj9195 - Nichibutsu Mahjong games for years 1991-1995
6 
7 ******************************************************************************/
8 #ifndef MAME_INCLUDES_NBMJ9195_H
9 #define MAME_INCLUDES_NBMJ9195_H
10 
11 #pragma once
12 
13 #include "cpu/z80/tmpz84c011.h"
14 #include "machine/nb1413m3.h"      // needed for mahjong input controller
15 #include "machine/gen_latch.h"
16 #include "emupal.h"
17 #include "screen.h"
18 
19 #define VRAM_MAX    2
20 
21 #define SCANLINE_MIN    0
22 #define SCANLINE_MAX    512
23 
24 
25 class nbmj9195_state : public driver_device
26 {
27 public:
28 	enum
29 	{
30 		TIMER_BLITTER
31 	};
32 
nbmj9195_state(const machine_config & mconfig,device_type type,const char * tag)33 	nbmj9195_state(const machine_config &mconfig, device_type type, const char *tag) :
34 		driver_device(mconfig, type, tag),
35 		m_maincpu(*this, "maincpu"),
36 		m_screen(*this, "screen"),
37 		m_palette(*this, "palette"),
38 		m_soundlatch(*this, "soundlatch"),
39 		m_palette_ptr(*this, "paletteram")
40 	{ }
41 
42 	void NBMJDRV1_base(machine_config &config);
43 	void NBMJDRV1(machine_config &config);
44 	void NBMJDRV2(machine_config &config);
45 	void NBMJDRV3(machine_config &config);
46 	void patimono(machine_config &config);
47 	void mjuraden(machine_config &config);
48 	void psailor1(machine_config &config);
49 	void ngpgal(machine_config &config);
50 	void mjgottsu(machine_config &config);
51 	void mkeibaou(machine_config &config);
52 	void gal10ren(machine_config &config);
53 	void mscoutm(machine_config &config);
54 	void imekura(machine_config &config);
55 	void mkoiuraa(machine_config &config);
56 	void mjkoiura(machine_config &config);
57 	void janbari(machine_config &config);
58 	void mjlaman(machine_config &config);
59 	void yosimotm(machine_config &config);
60 	void cmehyou(machine_config &config);
61 	void sailorwr(machine_config &config);
62 	void koinomp(machine_config &config);
63 	void sailorws(machine_config &config);
64 	void mjegolf(machine_config &config);
65 	void renaiclb(machine_config &config);
66 	void psailor2(machine_config &config);
67 	void yosimoto(machine_config &config);
68 	void pachiten(machine_config &config);
69 	void jituroku(machine_config &config);
70 	void mmehyou(machine_config &config);
71 	void bakuhatu(machine_config &config);
72 	void ultramhm(machine_config &config);
73 	void otatidai(machine_config &config);
74 
75 	void init_nbmj9195();
76 
77 private:
78 	required_device<tmpz84c011_device> m_maincpu;
79 	required_device<screen_device> m_screen;
80 	required_device<palette_device> m_palette;
81 	required_device<generic_latch_8_device> m_soundlatch;
82 
83 	optional_shared_ptr<uint8_t> m_palette_ptr; //shabdama doesn't use it at least for now
84 
85 	int m_inputport;
86 	int m_dipswbitsel;
87 	int m_outcoin_flag;
88 	int m_mscoutm_inputport;
89 	int m_scrollx[VRAM_MAX];
90 	int m_scrolly[VRAM_MAX];
91 	int m_scrollx_raster[VRAM_MAX][SCANLINE_MAX];
92 	int m_scanline[VRAM_MAX];
93 	int m_blitter_destx[VRAM_MAX];
94 	int m_blitter_desty[VRAM_MAX];
95 	int m_blitter_sizex[VRAM_MAX];
96 	int m_blitter_sizey[VRAM_MAX];
97 	int m_blitter_src_addr[VRAM_MAX];
98 	int m_blitter_direction_x[VRAM_MAX];
99 	int m_blitter_direction_y[VRAM_MAX];
100 	int m_dispflag[VRAM_MAX];
101 	int m_flipscreen[VRAM_MAX];
102 	int m_clutmode[VRAM_MAX];
103 	int m_transparency[VRAM_MAX];
104 	int m_clutsel;
105 	int m_screen_refresh;
106 	int m_gfxflag2;
107 	int m_gfxdraw_mode;
108 	int m_nb19010_busyctr;
109 	int m_nb19010_busyflag;
110 	bitmap_ind16 m_tmpbitmap[VRAM_MAX];
111 	std::unique_ptr<uint16_t[]> m_videoram[VRAM_MAX];
112 	std::unique_ptr<uint16_t[]> m_videoworkram[VRAM_MAX];
113 	std::unique_ptr<uint8_t[]> m_clut[VRAM_MAX];
114 	int m_flipscreen_old[VRAM_MAX];
115 	emu_timer *m_blitter_timer;
116 
117 	void soundbank_w(uint8_t data);
118 	void inputportsel_w(uint8_t data);
119 	uint8_t mscoutm_dipsw_0_r();
120 	uint8_t mscoutm_dipsw_1_r();
121 	uint8_t mscoutm_cpu_portb_r();
122 	uint8_t mscoutm_cpu_portc_r();
123 	uint8_t others_cpu_porta_r();
124 	uint8_t others_cpu_portb_r();
125 	uint8_t others_cpu_portc_r();
126 	void soundcpu_porte_w(uint8_t data);
127 	void palette_w(offs_t offset, uint8_t data);
128 	void nb22090_palette_w(offs_t offset, uint8_t data);
129 	void blitter_0_w(offs_t offset, uint8_t data);
130 	void blitter_1_w(offs_t offset, uint8_t data);
131 	uint8_t blitter_0_r(offs_t offset);
132 	uint8_t blitter_1_r(offs_t offset);
133 	void clut_0_w(offs_t offset, uint8_t data);
134 	void clut_1_w(offs_t offset, uint8_t data);
135 	void clutsel_w(uint8_t data);
136 	void gfxflag2_w(uint8_t data);
137 	void outcoin_flag_w(uint8_t data);
138 	void dipswbitsel_w(uint8_t data);
139 	void mscoutm_inputportsel_w(uint8_t data);
140 
141 	virtual void machine_start() override;
142 	virtual void machine_reset() override;
143 	virtual void video_start() override;
144 	DECLARE_VIDEO_START(_1layer);
145 	DECLARE_VIDEO_START(nb22090);
146 
147 	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
148 	int blitter_r(int offset, int vram);
149 	void blitter_w(int offset, int data, int vram);
150 	void clut_w(int offset, int data, int vram);
151 	void vramflip(int vram);
152 	void update_pixel(int vram, int x, int y);
153 	void gfxdraw(int vram);
154 	int dipsw_r();
155 	void postload();
156 
157 	void cmehyou_io_map(address_map &map);
158 	void gal10ren_io_map(address_map &map);
159 	void imekura_io_map(address_map &map);
160 	void jituroku_io_map(address_map &map);
161 	void koinomp_io_map(address_map &map);
162 	void koinomp_map(address_map &map);
163 	void mjegolf_io_map(address_map &map);
164 	void mjegolf_map(address_map &map);
165 	void mjgottsu_io_map(address_map &map);
166 	void mjkoiura_io_map(address_map &map);
167 	void mjlaman_io_map(address_map &map);
168 	void mjuraden_io_map(address_map &map);
169 	void mjuraden_map(address_map &map);
170 	void mkeibaou_io_map(address_map &map);
171 	void mkoiuraa_io_map(address_map &map);
172 	void mmehyou_io_map(address_map &map);
173 	void mscoutm_io_map(address_map &map);
174 	void mscoutm_map(address_map &map);
175 	void ngpgal_io_map(address_map &map);
176 	void ngpgal_map(address_map &map);
177 	void otatidai_io_map(address_map &map);
178 	void pachiten_io_map(address_map &map);
179 	void patimono_io_map(address_map &map);
180 	void psailor1_io_map(address_map &map);
181 	void psailor2_io_map(address_map &map);
182 	void renaiclb_io_map(address_map &map);
183 	void sailorwr_io_map(address_map &map);
184 	void sailorws_io_map(address_map &map);
185 	void sailorws_map(address_map &map);
186 	void sailorws_sound_io_map(address_map &map);
187 	void sailorws_sound_map(address_map &map);
188 	void yosimotm_io_map(address_map &map);
189 	void yosimoto_io_map(address_map &map);
190 
191 	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
192 };
193 
194 #endif // MAME_INCLUDES_NBMJ9195_H
195