1 // license:BSD-3-Clause
2 // copyright-holders:Bryan McPhail,Ernesto Corvi,Andrew Prime,Zsolt Vasvari
3 // thanks-to:Fuzz
4 #ifndef MAME_VIDEO_NEOGEO_SPR_H
5 #define MAME_VIDEO_NEOGEO_SPR_H
6 
7 #pragma once
8 
9 // todo, move these back, currently the sprite code needs some of the values tho
10 #define NEOGEO_MASTER_CLOCK                     (24000000)
11 #define NEOGEO_MAIN_CPU_CLOCK                   (NEOGEO_MASTER_CLOCK / 2)
12 #define NEOGEO_AUDIO_CPU_CLOCK                  (NEOGEO_MASTER_CLOCK / 6)
13 #define NEOGEO_YM2610_CLOCK                     (NEOGEO_MASTER_CLOCK / 3)
14 #define NEOGEO_PIXEL_CLOCK                      (NEOGEO_MASTER_CLOCK / 4)
15 #define NEOGEO_HTOTAL                           (0x180)
16 #define NEOGEO_HBEND                            (0x01e) /* this should really be 29.5 */
17 #define NEOGEO_HBSTART                          (0x15e) /* this should really be 349.5 */
18 #define NEOGEO_VTOTAL                           (0x108)
19 #define NEOGEO_VBEND                            (0x010)
20 #define NEOGEO_VBSTART                          (0x0f0)
21 #define NEOGEO_VSSTART                          (0x100)
22 
23 // todo, sort out what needs to be public and make the rest private/protected
24 class neosprite_base_device : public device_t, public device_video_interface
25 {
26 public:
27 	virtual void optimize_sprite_data();
28 	virtual void set_optimized_sprite_data(uint8_t* sprdata, uint32_t mask);
29 
30 	virtual void draw_fixed_layer_2pixels(uint32_t*&pixel_addr, int offset, uint8_t* gfx_base, const pen_t* char_pens);
31 	void draw_fixed_layer(bitmap_rgb32 &bitmap, int scanline);
32 	void set_videoram_offset(uint16_t data);
33 	uint16_t get_videoram_data();
34 	void set_videoram_data(uint16_t data);
35 	void set_videoram_modulo(uint16_t data);
36 	uint16_t get_videoram_modulo();
37 	void set_auto_animation_speed(uint8_t data);
38 	void set_auto_animation_disabled(uint8_t data);
39 	uint8_t neogeo_get_auto_animation_counter();
40 	void create_auto_animation_timer();
41 	void start_auto_animation_timer();
42 	void neogeo_set_fixed_layer_source(uint8_t data);
43 	inline bool sprite_on_scanline(int scanline, int y, int rows);
44 	virtual void draw_pixel(int romaddr, uint32_t* dst, const pen_t *line_pens) = 0;
45 	void draw_sprites(bitmap_rgb32 &bitmap, int scanline);
46 	void parse_sprites(int scanline);
47 	void create_sprite_line_timer();
48 	void start_sprite_line_timer();
49 	virtual void set_sprite_region(uint8_t* region_sprites, uint32_t region_sprites_size);
50 	void set_fixed_regions(uint8_t* fix_cart, uint32_t fix_cart_size, memory_region* fix_bios);
51 	void set_pens(const pen_t* pens);
52 
53 	std::unique_ptr<uint16_t[]>     m_videoram;
54 	uint16_t     *m_videoram_drawsource;
55 
56 	uint16_t     m_vram_offset;
57 	uint16_t     m_vram_read_buffer;
58 	uint16_t     m_vram_modulo;
59 
60 	uint32_t     m_sprite_gfx_address_mask;
61 
62 	uint8_t      m_auto_animation_speed;
63 	uint8_t      m_auto_animation_disabled;
64 	uint8_t      m_auto_animation_counter;
65 	uint8_t      m_auto_animation_frame_counter;
66 
67 	uint8_t      m_fixed_layer_source;
68 	uint8_t      m_fixed_layer_bank_type;
69 
70 	emu_timer  *m_auto_animation_timer;
71 	emu_timer  *m_sprite_line_timer;
72 
73 	TIMER_CALLBACK_MEMBER(auto_animation_timer_callback);
74 	TIMER_CALLBACK_MEMBER(sprite_line_timer_callback);
75 
76 	int m_bppshift; // 4 for 4bpp gfx (NeoGeo) 8 for 8bpp gfx (Midas)
77 
78 protected:
79 	neosprite_base_device(
80 			const machine_config &mconfig,
81 			device_type type,
82 			const char *tag,
83 			device_t *owner,
84 			uint32_t clock);
85 
86 	virtual void device_start() override;
87 	virtual void device_reset() override;
88 	uint32_t get_region_mask(uint8_t* rgn, uint32_t rgn_size);
89 	uint8_t* m_region_sprites; uint32_t m_region_sprites_size;
90 	uint8_t* m_region_fixed; uint32_t m_region_fixed_size;
91 	memory_region* m_region_fixedbios;
92 	const pen_t   *m_pens;
93 
94 	required_region_ptr<uint8_t> m_region_zoomy;
95 };
96 
97 
98 class neosprite_regular_device : public neosprite_base_device
99 {
100 public:
101 	neosprite_regular_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
102 	virtual void draw_pixel(int romaddr, uint32_t* dst, const pen_t *line_pens) override;
103 	virtual void set_sprite_region(uint8_t* region_sprites, uint32_t region_sprites_size) override;
104 
105 };
106 
DECLARE_DEVICE_TYPE(NEOGEO_SPRITE_REGULAR,neosprite_regular_device)107 DECLARE_DEVICE_TYPE(NEOGEO_SPRITE_REGULAR, neosprite_regular_device)
108 
109 
110 class neosprite_optimized_device : public neosprite_base_device
111 {
112 public:
113 	neosprite_optimized_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
114 	virtual void optimize_sprite_data() override;
115 	virtual void set_optimized_sprite_data(uint8_t* sprdata, uint32_t mask) override;
116 	virtual void draw_pixel(int romaddr, uint32_t* dst, const pen_t *line_pens) override;
117 	std::vector<uint8_t> m_sprite_gfx;
118 	uint8_t* m_spritegfx8;
119 
120 private:
121 	uint32_t optimize_helper(std::vector<uint8_t> &spritegfx, uint8_t* region_sprites, uint32_t region_sprites_size);
122 };
123 
DECLARE_DEVICE_TYPE(NEOGEO_SPRITE_OPTIMZIED,neosprite_optimized_device)124 DECLARE_DEVICE_TYPE(NEOGEO_SPRITE_OPTIMZIED, neosprite_optimized_device)
125 
126 
127 class neosprite_midas_device : public neosprite_base_device
128 {
129 public:
130 	neosprite_midas_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
131 
132 	virtual void draw_pixel(int romaddr, uint32_t* dst, const pen_t *line_pens) override;
133 
134 	std::unique_ptr<uint16_t[]> m_videoram_buffer;
135 	void buffer_vram();
136 	virtual void draw_fixed_layer_2pixels(uint32_t*&pixel_addr, int offset, uint8_t* gfx_base, const pen_t* char_pens) override;
137 	virtual void set_sprite_region(uint8_t* region_sprites, uint32_t region_sprites_size) override;
138 
139 	protected:
140 	virtual void device_start() override;
141 
142 };
143 
144 DECLARE_DEVICE_TYPE(NEOGEO_SPRITE_MIDAS, neosprite_midas_device)
145 
146 #endif // MAME_VIDEO_NEOGEO_SPR_H
147