1 // license:BSD-3-Clause
2 // copyright-holders:Philip Bennett
3 /*************************************************************************
4 
5     Lock-On hardware
6 
7 *************************************************************************/
8 #ifndef MAME_INCLUDES_LOCKON_H
9 #define MAME_INCLUDES_LOCKON_H
10 
11 #pragma once
12 
13 #include "machine/watchdog.h"
14 #include "sound/flt_vol.h"
15 #include "emupal.h"
16 #include "screen.h"
17 #include "tilemap.h"
18 
19 /* Calculated from CRT controller writes */
20 #define PIXEL_CLOCK            (XTAL(21'000'000) / 3)
21 #define FRAMEBUFFER_CLOCK      XTAL(10'000'000)
22 #define HBSTART                320
23 #define HBEND                  0
24 #define HTOTAL                 448
25 #define VBSTART                240
26 #define VBEND                  0
27 #define VTOTAL                 280
28 
29 
30 class lockon_state : public driver_device
31 {
32 public:
lockon_state(const machine_config & mconfig,device_type type,const char * tag)33 	lockon_state(const machine_config &mconfig, device_type type, const char *tag)
34 		: driver_device(mconfig, type, tag)
35 		, m_char_ram(*this, "char_ram")
36 		, m_hud_ram(*this, "hud_ram")
37 		, m_scene_ram(*this, "scene_ram")
38 		, m_ground_ram(*this, "ground_ram")
39 		, m_object_ram(*this, "object_ram")
40 		, m_maincpu(*this, "maincpu")
41 		, m_audiocpu(*this, "audiocpu")
42 		, m_ground(*this, "ground")
43 		, m_object(*this, "object")
44 		, m_watchdog(*this, "watchdog")
45 		, m_f2203_1l(*this, "f2203.1l")
46 		, m_f2203_2l(*this, "f2203.2l")
47 		, m_f2203_3l(*this, "f2203.3l")
48 		, m_f2203_1r(*this, "f2203.1r")
49 		, m_f2203_2r(*this, "f2203.2r")
50 		, m_f2203_3r(*this, "f2203.3r")
51 		, m_gfxdecode(*this, "gfxdecode")
52 		, m_screen(*this, "screen")
53 		, m_palette(*this, "palette")
54 		, m_lamp(*this, "lamp1")
55 	{ }
56 
57 	void lockon(machine_config &config);
58 
59 protected:
60 	virtual void machine_start() override;
61 	virtual void machine_reset() override;
62 	virtual void video_start() override;
63 
64 private:
65 	/* memory pointers */
66 	required_shared_ptr<uint16_t> m_char_ram;
67 	required_shared_ptr<uint16_t> m_hud_ram;
68 	required_shared_ptr<uint16_t> m_scene_ram;
69 	required_shared_ptr<uint16_t> m_ground_ram;
70 	required_shared_ptr<uint16_t> m_object_ram;
71 
72 	/* video-related */
73 	tilemap_t       *m_tilemap;
74 	uint8_t           m_ground_ctrl;
75 	uint16_t          m_scroll_h;
76 	uint16_t          m_scroll_v;
77 	std::unique_ptr<bitmap_ind16> m_front_buffer;
78 	std::unique_ptr<bitmap_ind16> m_back_buffer;
79 	emu_timer       *m_bufend_timer;
80 	emu_timer       *m_cursor_timer;
81 
82 	/* Rotation Control */
83 	uint16_t      m_xsal;
84 	uint16_t      m_x0ll;
85 	uint16_t      m_dx0ll;
86 	uint16_t      m_dxll;
87 	uint16_t      m_ysal;
88 	uint16_t      m_y0ll;
89 	uint16_t      m_dy0ll;
90 	uint16_t      m_dyll;
91 
92 	/* Object palette RAM control */
93 	uint32_t      m_iden;
94 	std::unique_ptr<uint8_t[]>       m_obj_pal_ram;
95 	uint32_t      m_obj_pal_latch;
96 	uint32_t      m_obj_pal_addr;
97 
98 	/* misc */
99 	uint8_t       m_ctrl_reg;
100 	uint32_t      m_main_inten;
101 
102 	/* devices */
103 	required_device<cpu_device> m_maincpu;
104 	required_device<cpu_device> m_audiocpu;
105 	required_device<cpu_device> m_ground;
106 	required_device<cpu_device> m_object;
107 	required_device<watchdog_timer_device> m_watchdog;
108 	required_device<filter_volume_device> m_f2203_1l;
109 	required_device<filter_volume_device> m_f2203_2l;
110 	required_device<filter_volume_device> m_f2203_3l;
111 	required_device<filter_volume_device> m_f2203_1r;
112 	required_device<filter_volume_device> m_f2203_2r;
113 	required_device<filter_volume_device> m_f2203_3r;
114 	required_device<gfxdecode_device> m_gfxdecode;
115 	required_device<screen_device> m_screen;
116 	required_device<palette_device> m_palette;
117 	output_finder<> m_lamp;
118 
119 	uint16_t lockon_crtc_r();
120 	void lockon_crtc_w(offs_t offset, uint16_t data);
121 	void lockon_char_w(offs_t offset, uint16_t data);
122 	void lockon_scene_h_scr_w(uint16_t data);
123 	void lockon_scene_v_scr_w(uint16_t data);
124 	void lockon_ground_ctrl_w(uint16_t data);
125 	void lockon_tza112_w(offs_t offset, uint16_t data);
126 	uint16_t lockon_obj_4000_r();
127 	void lockon_obj_4000_w(uint16_t data);
128 	void lockon_fb_clut_w(offs_t offset, uint16_t data);
129 	void lockon_rotate_w(offs_t offset, uint16_t data);
130 	void adrst_w(uint16_t data);
131 	uint16_t main_gnd_r(offs_t offset);
132 	void main_gnd_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
133 	uint16_t main_obj_r(offs_t offset);
134 	void main_obj_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
135 	void tst_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
136 	uint16_t main_z80_r(offs_t offset);
137 	void main_z80_w(offs_t offset, uint16_t data);
138 	void inten_w(uint16_t data);
139 	void emres_w(uint16_t data);
140 	void sound_vol(uint8_t data);
141 	void ym2203_out_b(uint8_t data);
142 	TILE_GET_INFO_MEMBER(get_lockon_tile_info);
143 	void lockon_palette(palette_device &palette) const;
144 	uint32_t screen_update_lockon(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
145 	DECLARE_WRITE_LINE_MEMBER(screen_vblank_lockon);
146 	TIMER_CALLBACK_MEMBER(cursor_callback);
147 	TIMER_CALLBACK_MEMBER(bufend_callback);
148 	void scene_draw();
149 	void ground_draw();
150 	void objects_draw();
151 	void rotate_draw( bitmap_ind16 &bitmap, const rectangle &cliprect );
152 	void hud_draw( bitmap_ind16 &bitmap, const rectangle &cliprect );
153 	DECLARE_WRITE_LINE_MEMBER(ym2203_irq);
154 	void ground_v30(address_map &map);
155 	void main_v30(address_map &map);
156 	void object_v30(address_map &map);
157 	void sound_io(address_map &map);
158 	void sound_prg(address_map &map);
159 };
160 
161 #endif // MAME_INCLUDES_LOCKON_H
162