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