1 // license:BSD-3-Clause
2 // copyright-holders:Jarek Parchanski
3 
4 #include "machine/bankdev.h"
5 #include "machine/timer.h"
6 #include "video/jalblend.h"
7 #include "emupal.h"
8 #include "tilemap.h"
9 
10 class psychic5_state : public driver_device
11 {
12 public:
psychic5_state(const machine_config & mconfig,device_type type,const char * tag)13 	psychic5_state(const machine_config &mconfig, device_type type, const char *tag)
14 		: driver_device(mconfig, type, tag),
15 		m_maincpu(*this, "maincpu"),
16 		m_audiocpu(*this, "audiocpu"),
17 		m_gfxdecode(*this, "gfxdecode"),
18 		m_palette(*this, "palette"),
19 		m_vrambank(*this, "vrambank"),
20 		m_blend(*this, "blend"),
21 		m_spriteram(*this, "spriteram"),
22 		m_fg_videoram(*this, "fg_videoram"),
23 		m_bg_videoram(*this, "bg_videoram"),
24 		m_bg_control(*this, "bg_control"),
25 		m_ps5_palette_ram_bg(*this, "palette_ram_bg"),
26 		m_ps5_palette_ram_sp(*this, "palette_ram_sp"),
27 		m_ps5_palette_ram_tx(*this, "palette_ram_tx")
28 
29 	{ }
30 
31 	void psychic5(machine_config &config);
32 	void bombsa(machine_config &config);
33 
34 private:
35 	required_device<cpu_device> m_maincpu;
36 	required_device<cpu_device> m_audiocpu;
37 	required_device<gfxdecode_device> m_gfxdecode;
38 	required_device<palette_device> m_palette;
39 	optional_device<address_map_bank_device> m_vrambank;
40 	optional_device<jaleco_blend_device> m_blend;
41 
42 	required_shared_ptr<uint8_t> m_spriteram;
43 	required_shared_ptr<uint8_t> m_fg_videoram;
44 	required_shared_ptr<uint8_t> m_bg_videoram;
45 	required_shared_ptr<uint8_t> m_bg_control;
46 	required_shared_ptr<uint8_t> m_ps5_palette_ram_bg;
47 	required_shared_ptr<uint8_t> m_ps5_palette_ram_sp;
48 	required_shared_ptr<uint8_t> m_ps5_palette_ram_tx;
49 
50 	uint8_t m_bank_latch;
51 	uint8_t m_ps5_vram_page;
52 	uint8_t m_bg_clip_mode;
53 	uint8_t m_title_screen;
54 	tilemap_t *m_bg_tilemap;
55 	tilemap_t *m_fg_tilemap;
56 	uint16_t m_palette_intensity;
57 	uint8_t m_bombsa_unknown;
58 	int m_sx1;
59 	int m_sy1;
60 	int m_sy2;
61 
62 	uint8_t bankselect_r();
63 	uint8_t vram_page_select_r();
64 	void vram_page_select_w(uint8_t data);
65 	void fg_videoram_w(offs_t offset, uint8_t data);
66 	void bg_videoram_w(offs_t offset, uint8_t data);
67 	void sprite_col_w(offs_t offset, uint8_t data);
68 	void bg_col_w(offs_t offset, uint8_t data);
69 	void tx_col_w(offs_t offset, uint8_t data);
70 
71 	/* psychic5 specific */
72 	void psychic5_coin_counter_w(uint8_t data);
73 	void psychic5_bankselect_w(uint8_t data);
74 	void psychic5_title_screen_w(uint8_t data);
75 
76 	/* bombsa specific */
77 	void bombsa_bankselect_w(uint8_t data);
78 	void bombsa_flipscreen_w(uint8_t data);
79 	void bombsa_unknown_w(uint8_t data);
80 
81 	TILE_GET_INFO_MEMBER(get_bg_tile_info);
82 	TILE_GET_INFO_MEMBER(get_fg_tile_info);
83 
84 	virtual void machine_reset() override;
85 	DECLARE_MACHINE_START(psychic5);
86 	DECLARE_MACHINE_START(bombsa);
87 	virtual void video_start() override;
88 	DECLARE_VIDEO_START(psychic5);
89 	DECLARE_VIDEO_START(bombsa);
90 	virtual void video_reset() override;
91 
92 	TIMER_DEVICE_CALLBACK_MEMBER(scanline);
93 
94 	uint32_t screen_update_psychic5(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
95 	uint32_t screen_update_bombsa(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
96 	void change_palette(int offset, uint8_t* palram, int palbase);
97 	void change_bg_palette(int color, int lo_offs, int hi_offs);
98 	void set_background_palette_intensity();
99 	void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect);
100 	void bombsa_main_map(address_map &map);
101 	void bombsa_sound_map(address_map &map);
102 	void bombsa_soundport_map(address_map &map);
103 	void bombsa_vrambank_map(address_map &map);
104 	void psychic5_main_map(address_map &map);
105 	void psychic5_sound_map(address_map &map);
106 	void psychic5_soundport_map(address_map &map);
107 	void psychic5_vrambank_map(address_map &map);
108 	void draw_background(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); //only used by psychic5
109 };
110