1 // license:BSD-3-Clause
2 // copyright-holders:Aaron Giles
3 /*************************************************************************
4 
5     Atari Crystal Castles hardware
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_CCASTLES_H
9 #define MAME_INCLUDES_CCASTLES_H
10 
11 #pragma once
12 
13 #include "cpu/m6502/m6502.h"
14 #include "machine/74259.h"
15 #include "machine/x2212.h"
16 #include "emupal.h"
17 #include "screen.h"
18 
19 class ccastles_state : public driver_device
20 {
21 public:
ccastles_state(const machine_config & mconfig,device_type type,const char * tag)22 	ccastles_state(const machine_config &mconfig, device_type type, const char *tag) :
23 		driver_device(mconfig, type, tag),
24 		m_maincpu(*this, "maincpu"),
25 		m_nvram_4b(*this, "nvram_4b"),
26 		m_nvram_4a(*this, "nvram_4a"),
27 		m_outlatch(*this, "outlatch%u", 0U),
28 		m_videoram(*this, "videoram"),
29 		m_spriteram(*this, "spriteram"),
30 		m_gfxdecode(*this, "gfxdecode"),
31 		m_screen(*this, "screen"),
32 		m_palette(*this, "palette")
33 	{ }
34 
35 	DECLARE_READ_LINE_MEMBER(vblank_r);
36 	void ccastles(machine_config &config);
37 
38 protected:
39 	void irq_ack_w(uint8_t data);
40 	uint8_t leta_r(offs_t offset);
41 	void nvram_recall_w(uint8_t data);
42 	DECLARE_WRITE_LINE_MEMBER(nvram_store_w);
43 	uint8_t nvram_r(address_space &space, offs_t offset);
44 	void nvram_w(offs_t offset, uint8_t data);
45 	void ccastles_hscroll_w(uint8_t data);
46 	void ccastles_vscroll_w(uint8_t data);
47 	void ccastles_video_control_w(offs_t offset, uint8_t data);
48 	void ccastles_paletteram_w(offs_t offset, uint8_t data);
49 	void ccastles_videoram_w(offs_t offset, uint8_t data);
50 	uint8_t ccastles_bitmode_r();
51 	void ccastles_bitmode_w(uint8_t data);
52 	void ccastles_bitmode_addr_w(offs_t offset, uint8_t data);
53 	virtual void machine_start() override;
54 	virtual void machine_reset() override;
55 	virtual void video_start() override;
56 	uint32_t screen_update_ccastles(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
57 	TIMER_CALLBACK_MEMBER(clock_irq);
58 	inline void ccastles_write_vram( uint16_t addr, uint8_t data, uint8_t bitmd, uint8_t pixba );
59 	inline void bitmode_autoinc(  );
60 	inline void schedule_next_irq( int curscanline );
61 	void main_map(address_map &map);
62 
63 private:
64 	/* devices */
65 	required_device<m6502_device> m_maincpu;
66 	required_device<x2212_device> m_nvram_4b;
67 	required_device<x2212_device> m_nvram_4a;
68 	required_device_array<ls259_device, 2> m_outlatch;
69 
70 	/* memory pointers */
71 	required_shared_ptr<uint8_t> m_videoram;
72 	required_shared_ptr<uint8_t> m_spriteram;
73 
74 	required_device<gfxdecode_device> m_gfxdecode;
75 	required_device<screen_device> m_screen;
76 	required_device<palette_device> m_palette;
77 
78 	/* video-related */
79 	const uint8_t *m_syncprom;
80 	const uint8_t *m_wpprom;
81 	const uint8_t *m_priprom;
82 	bitmap_ind16 m_spritebitmap;
83 	double m_rweights[3];
84 	double m_gweights[3];
85 	double m_bweights[3];
86 	uint8_t m_bitmode_addr[2];
87 	uint8_t m_hscroll;
88 	uint8_t m_vscroll;
89 
90 	/* misc */
91 	int      m_vblank_start;
92 	int      m_vblank_end;
93 	emu_timer *m_irq_timer;
94 	uint8_t    m_irq_state;
95 };
96 
97 #endif // MAME_INCLUDES_CCASTLES_H
98