1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     Atari Skull & Crossbones hardware
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_SKULLXBO_H
9 #define MAME_INCLUDES_SKULLXBO_H
10 
11 #pragma once
12 
13 #include "machine/atarigen.h"
14 #include "machine/timer.h"
15 #include "audio/atarijsa.h"
16 #include "video/atarimo.h"
17 #include "tilemap.h"
18 
19 class skullxbo_state : public atarigen_state
20 {
21 public:
skullxbo_state(const machine_config & mconfig,device_type type,const char * tag)22 	skullxbo_state(const machine_config &mconfig, device_type type, const char *tag) :
23 		atarigen_state(mconfig, type, tag),
24 		m_jsa(*this, "jsa"),
25 		m_playfield_tilemap(*this, "playfield"),
26 		m_alpha_tilemap(*this, "alpha"),
27 		m_xscroll(*this, "xscroll"),
28 		m_yscroll(*this, "yscroll"),
29 		m_mob(*this, "mob"),
30 		m_playfield_latch(-1),
31 		m_scanline_int_state(0)
32 	{ }
33 
34 	void skullxbo(machine_config &config);
35 
36 	void init_skullxbo();
37 
38 protected:
39 	virtual void machine_start() override;
40 
41 private:
42 	void skullxbo_halt_until_hblank_0_w(uint16_t data);
43 	void skullxbo_mobwr_w(offs_t offset, uint16_t data);
44 	TILE_GET_INFO_MEMBER(get_alpha_tile_info);
45 	TILE_GET_INFO_MEMBER(get_playfield_tile_info);
46 	void playfield_latch_w(uint16_t data);
47 	void playfield_latched_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
48 	uint32_t screen_update_skullxbo(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
49 	TIMER_CALLBACK_MEMBER(scanline_interrupt);
50 	void scanline_int_ack_w(uint16_t data = 0);
51 	void video_int_ack_w(uint16_t data = 0);
52 	TIMER_DEVICE_CALLBACK_MEMBER(scanline_timer);
53 	void skullxbo_scanline_update(int scanline);
54 	void skullxbo_xscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
55 	void skullxbo_yscroll_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
56 	void skullxbo_mobmsb_w(offs_t offset, uint16_t data);
57 
58 	void main_map(address_map &map);
59 
60 	required_device<atari_jsa_ii_device> m_jsa;
61 	required_device<tilemap_device> m_playfield_tilemap;
62 	required_device<tilemap_device> m_alpha_tilemap;
63 	required_shared_ptr<uint16_t> m_xscroll;
64 	required_shared_ptr<uint16_t> m_yscroll;
65 	required_device<atari_motion_objects_device> m_mob;
66 	int m_playfield_latch;
67 
68 	static const atari_motion_objects_config s_mob_config;
69 
70 	emu_timer *m_scanline_int_timer;
71 	bool m_scanline_int_state;
72 };
73 
74 #endif // MAME_INCLUDES_SKULLXBO_H
75