Previous 199869 Revisions Next

r30690 Wednesday 28th May, 2014 at 01:52:31 UTC by Alex Jackson
neogeo: use real palette_device (nw)
[src/mame/drivers]neogeo.c
[src/mame/includes]neogeo.h
[src/mame/video]neogeo.c neogeo_spr.c neogeo_spr.h
[src/mess/drivers]ng_aes.c

trunk/src/mame/drivers/neogeo.c
r30689r30690
984984   {
985985      default:
986986      case 0x00:
987         neogeo_set_screen_dark(bit);
987         neogeo_set_screen_shadow(bit);
988988         break;
989989
990990      case 0x01:
r30689r30690
17921792   MCFG_SCREEN_UPDATE_DRIVER(neogeo_state, screen_update_neogeo)
17931793
17941794   /* 4096 colors * two banks * normal and shadow */
1795   MCFG_PALETTE_ADD("palette", 4096*2*2)
1795   MCFG_PALETTE_ADD_INIT_BLACK("palette", 4096*2*2)
17961796
17971797   MCFG_DEVICE_ADD("spritegen", NEOGEO_SPRITE_OPTIMZIED, 0)
17981798   
trunk/src/mame/includes/neogeo.h
r30689r30690
151151   void neogeo_set_display_counter_lsb(UINT16 data);
152152   void set_video_control( UINT16 data );
153153
154   void compute_rgb_weights(  );
155154   void create_rgb_lookups();
156   void regenerate_pens();
157   pen_t get_pen( UINT16 data );
158   void neogeo_set_palette_bank( UINT8 data );
159   void neogeo_set_screen_dark( UINT8 data );
155   void set_pens();
156   void neogeo_set_screen_shadow( int data );
157   void neogeo_set_palette_bank( int data );
160158
161159   void audio_cpu_check_nmi();
162160   void select_controller( UINT8 data );
r30689r30690
346344   UINT16 get_video_control(  );
347345
348346   // color/palette related
349   UINT8      m_palette_lookup[32][4];
350   double     m_rgb_weights_normal[5];
351   double     m_rgb_weights_normal_bit15[5];
352   double     m_rgb_weights_dark[5];
353   double     m_rgb_weights_dark_bit15[5];
354   UINT16     *m_palettes[2]; /* 0x100*16 2 byte palette entries */
355   pen_t      *m_pens;
356   UINT8      m_palette_bank;
357   UINT8      m_screen_dark;
347   dynamic_array<UINT16> m_paletteram;
348   UINT8        m_palette_lookup[32][4];
349   const pen_t *m_bg_pen;
350   int          m_screen_shadow;
351   int          m_palette_bank;
358352
359353   // cartridge-specific hardware
360354   // TODO: move into separate devices
trunk/src/mame/video/neogeo.c
r30689r30690
1919 *
2020 *************************************/
2121
22void neogeo_state::compute_rgb_weights(  )
23{
24   static const int resistances[] = { 220, 470, 1000, 2200, 3900 };
25
26   /* compute four sets of weights - with or without the pulldowns -
27      ensuring that we use the same scaler for all */
28
29   double scaler = compute_resistor_weights(0, 0xff, -1,
30                        5, resistances, m_rgb_weights_normal, 0, 0,
31                        0, 0, 0, 0, 0,
32                        0, 0, 0, 0, 0);
33
34   compute_resistor_weights(0, 0xff, scaler,
35                        5, resistances, m_rgb_weights_normal_bit15, 8200, 0,
36                        0, 0, 0, 0, 0,
37                        0, 0, 0, 0, 0);
38
39   compute_resistor_weights(0, 0xff, scaler,
40                        5, resistances, m_rgb_weights_dark, 150, 0,
41                        0, 0, 0, 0, 0,
42                        0, 0, 0, 0, 0);
43
44   compute_resistor_weights(0, 0xff, scaler,
45                        5, resistances, m_rgb_weights_dark_bit15, 1 / ((1.0 / 8200) + (1.0 / 150)), 0,
46                        0, 0, 0, 0, 0,
47                        0, 0, 0, 0, 0);
48}
49
50
5122void neogeo_state::create_rgb_lookups()
5223{
5324   static const int resistances[] = {3900, 2200, 1000, 470, 220};
r30689r30690
9263   }
9364}
9465
95
96pen_t neogeo_state::get_pen( UINT16 data )
66void neogeo_state::set_pens()
9767{
98   double *weights;
99   UINT8 r, g, b;
100
101   if (m_screen_dark)
102   {
103      if (data & 0x8000)
104         weights = m_rgb_weights_dark_bit15;
105      else
106         weights = m_rgb_weights_dark;
107   }
108   else
109   {
110      if (data & 0x8000)
111         weights = m_rgb_weights_normal_bit15;
112      else
113         weights = m_rgb_weights_normal;
114   }
115
116   r = combine_5_weights(weights,
117                     (data >> 11) & 0x01,
118                     (data >> 10) & 0x01,
119                     (data >>  9) & 0x01,
120                     (data >>  8) & 0x01,
121                     (data >> 14) & 0x01);
122
123   g = combine_5_weights(weights,
124                     (data >>  7) & 0x01,
125                     (data >>  6) & 0x01,
126                     (data >>  5) & 0x01,
127                     (data >>  4) & 0x01,
128                     (data >> 13) & 0x01);
129
130   b = combine_5_weights(weights,
131                     (data >>  3) & 0x01,
132                     (data >>  2) & 0x01,
133                     (data >>  1) & 0x01,
134                     (data >>  0) & 0x01,
135                     (data >> 12) & 0x01);
136
137   return rgb_t(r, g, b);
68   const pen_t *pen_base = m_palette->pens() + m_palette_bank + (m_screen_shadow ? 0x2000 : 0);
69   m_sprgen->set_pens(pen_base);
70   m_bg_pen = pen_base + 0xfff;
13871}
13972
14073
141void neogeo_state::regenerate_pens()
74void neogeo_state::neogeo_set_screen_shadow( int data )
14275{
143   int i;
144
145   for (i = 0; i < NUM_PENS; i++)
146      m_pens[i] = get_pen(m_palettes[m_palette_bank][i]);
76   m_screen_shadow = data;
77   set_pens();
14778}
14879
14980
150void neogeo_state::neogeo_set_palette_bank( UINT8 data )
81void neogeo_state::neogeo_set_palette_bank( int data )
15182{
152   if (data != m_palette_bank)
153   {
154      m_palette_bank = data;
155
156      regenerate_pens();
157   }
83   m_palette_bank = data ? 0x1000 : 0;
84   set_pens();
15885}
15986
16087
161void neogeo_state::neogeo_set_screen_dark( UINT8 data )
162{
163   if (data != m_screen_dark)
164   {
165      m_screen_dark = data;
166
167      regenerate_pens();
168   }
169}
170
171
17288READ16_MEMBER(neogeo_state::neogeo_paletteram_r)
17389{
174   return m_palettes[m_palette_bank][offset];
90   return m_paletteram[m_palette_bank + offset];
17591}
17692
17793
17894WRITE16_MEMBER(neogeo_state::neogeo_paletteram_w)
17995{
180   UINT16 *addr = &m_palettes[m_palette_bank][offset];
96   offset += m_palette_bank;
97   data = COMBINE_DATA(&m_paletteram[offset]);
18198
182   COMBINE_DATA(addr);
99   int dark = data >> 15;
100   int r = ((data >> 14) & 0x1) | ((data >> 7) & 0x1e);
101   int g = ((data >> 13) & 0x1) | ((data >> 3) & 0x1e);
102   int b = ((data >> 12) & 0x1) | ((data << 1) & 0x1e);
183103
184   m_pens[offset] = get_pen(*addr);
104   m_palette->set_pen_color(offset,
105                        m_palette_lookup[r][dark],
106                        m_palette_lookup[g][dark],
107                        m_palette_lookup[b][dark]);   // normal
108
109   m_palette->set_pen_color(offset + 0x2000,
110                        m_palette_lookup[r][dark+2],
111                        m_palette_lookup[g][dark+2],
112                        m_palette_lookup[b][dark+2]); // shadow
185113}
186114
187115
r30689r30690
194122
195123void neogeo_state::video_start()
196124{
197   /* allocate memory not directly mapped */
198   m_palettes[0] = auto_alloc_array(machine(), UINT16, NUM_PENS);
199   m_palettes[1] = auto_alloc_array(machine(), UINT16, NUM_PENS);
200   m_pens = auto_alloc_array(machine(), pen_t, NUM_PENS);
201
202   compute_rgb_weights();
203125   create_rgb_lookups();
204126
205   memset(m_palettes[0], 0x00, NUM_PENS * sizeof(UINT16));
206   memset(m_palettes[1], 0x00, NUM_PENS * sizeof(UINT16));
207   memset(m_pens, 0x00, NUM_PENS * sizeof(pen_t));
127   m_paletteram.resize_and_clear(0x1000 * 2);
208128
209   save_pointer(NAME(m_palettes[0]), NUM_PENS);
210   save_pointer(NAME(m_palettes[1]), NUM_PENS);
211   save_item(NAME(m_screen_dark));
129   m_screen_shadow = 0;
130   m_palette_bank = 0;
131
132   save_item(NAME(m_paletteram));
133   save_item(NAME(m_screen_shadow));
212134   save_item(NAME(m_palette_bank));
213   machine().save().register_postload(save_prepost_delegate(FUNC(neogeo_state::regenerate_pens), this));
135   machine().save().register_postload(save_prepost_delegate(FUNC(neogeo_state::set_pens), this));
214136
215   m_sprgen->set_pens(m_pens);
137   set_pens();
216138}
217139
218140
r30689r30690
239161UINT32 neogeo_state::screen_update_neogeo(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
240162{
241163   // fill with background color first
242   bitmap.fill(m_pens[0x0fff], cliprect);
164   bitmap.fill(*m_bg_pen, cliprect);
243165
244166   m_sprgen->draw_sprites(bitmap, cliprect.min_y);
245167
trunk/src/mame/video/neogeo_spr.c
r30689r30690
234234         int i;
235235         int gfx_offset = ((code << 5) | (scanline & 0x07)) & addr_mask;
236236
237         pen_t *char_pens;
237         const pen_t *char_pens;
238238         
239239         char_pens = &m_pens[code_and_palette >> 12 << m_bppshift];
240240
r30689r30690
252252}
253253
254254
255inline void neosprite_base_device::draw_fixed_layer_2pixels(UINT32*&pixel_addr, int offset, UINT8* gfx_base, pen_t* char_pens)
255inline void neosprite_base_device::draw_fixed_layer_2pixels(UINT32*&pixel_addr, int offset, UINT8* gfx_base, const pen_t* char_pens)
256256{
257257   UINT8 data = gfx_base[offset];
258258
r30689r30690
377377         UINT16 attr;
378378         UINT32 code;
379379         const int *zoom_x_table;
380         pen_t *line_pens;
380         const pen_t *line_pens;
381381         int x_inc;
382382
383383         int sprite_line = (scanline - y) & 0x1ff;
r30689r30690
627627   m_screen = screen;
628628}
629629
630void neosprite_base_device::set_pens(pen_t* pens)
630void neosprite_base_device::set_pens(const pen_t* pens)
631631{
632632   m_pens = pens;
633633}
r30689r30690
670670   m_sprite_gfx_address_mask = mask;
671671}
672672
673inline void neosprite_regular_device::draw_pixel(int romaddr, UINT32* dst, pen_t *line_pens)
673inline void neosprite_regular_device::draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens)
674674{
675675   const UINT8* src = m_region_sprites->base() + (((romaddr &~0xff)>>1) | (((romaddr&0x8)^0x8)<<3) | ((romaddr & 0xf0)  >> 2));
676676   const int x = romaddr & 0x7;
r30689r30690
739739   }
740740}
741741
742inline void neosprite_optimized_device::draw_pixel(int romaddr, UINT32* dst, pen_t *line_pens)
742inline void neosprite_optimized_device::draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens)
743743{
744744   const UINT8 gfx = m_sprite_gfx[romaddr];
745745
r30689r30690
765765}
766766
767767
768inline void neosprite_midas_device::draw_pixel(int romaddr, UINT32* dst, pen_t *line_pens)
768inline void neosprite_midas_device::draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens)
769769{
770770   const UINT8* src = m_region_sprites->base() + (((romaddr &~0xff)) | (((romaddr&0x8)^0x8)<<4) | ((romaddr & 0xf0)  >> 1));
771771   const int x = romaddr & 0x7;
r30689r30690
800800   memcpy(m_videoram_buffer, m_videoram, (0x8000 + 0x800) * sizeof(UINT16));
801801}
802802
803inline void neosprite_midas_device::draw_fixed_layer_2pixels(UINT32*&pixel_addr, int offset, UINT8* gfx_base, pen_t* char_pens)
803inline void neosprite_midas_device::draw_fixed_layer_2pixels(UINT32*&pixel_addr, int offset, UINT8* gfx_base, const pen_t* char_pens)
804804{
805805   UINT8 data;
806806   
trunk/src/mame/video/neogeo_spr.h
r30689r30690
2323//   neosprite_base_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
2424
2525   virtual void optimize_sprite_data();
26   virtual void draw_fixed_layer_2pixels(UINT32*&pixel_addr, int offset, UINT8* gfx_base, pen_t* char_pens);
26   virtual void draw_fixed_layer_2pixels(UINT32*&pixel_addr, int offset, UINT8* gfx_base, const pen_t* char_pens);
2727   void draw_fixed_layer( bitmap_rgb32 &bitmap, int scanline );
2828   void set_videoram_offset( UINT16 data );
2929   UINT16 get_videoram_data(  );
r30689r30690
3737   void start_auto_animation_timer(  );
3838   void neogeo_set_fixed_layer_source( UINT8 data );
3939   inline bool sprite_on_scanline(int scanline, int y, int rows);
40   virtual void draw_pixel(int romaddr, UINT32* dst, pen_t *line_pens) = 0;
40   virtual void draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens) = 0;
4141   void draw_sprites( bitmap_rgb32 &bitmap, int scanline );
4242   void parse_sprites( int scanline );
4343   void create_sprite_line_timer(  );
r30689r30690
4545   virtual void set_sprite_region(memory_region* region_sprites);
4646   void set_fixed_regions(memory_region* fix_cart, memory_region* fix_bios);
4747   void set_screen(screen_device* screen);
48   void set_pens(pen_t* pens);
48   void set_pens(const pen_t* pens);
4949
5050   UINT16     *m_videoram;
5151   UINT16     *m_videoram_drawsource;
r30689r30690
8383   memory_region* m_region_fixed;
8484   memory_region* m_region_fixedbios;
8585   screen_device* m_screen;
86   pen_t      *m_pens;
86   const pen_t   *m_pens;
8787
8888private:
8989
r30689r30690
9696{
9797public:
9898   neosprite_regular_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
99   virtual void draw_pixel(int romaddr, UINT32* dst, pen_t *line_pens);
99   virtual void draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens);
100100   virtual void set_sprite_region(memory_region* region_sprites);
101101
102102};
r30689r30690
109109public:
110110   neosprite_optimized_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
111111   virtual void optimize_sprite_data();
112   virtual void draw_pixel(int romaddr, UINT32* dst, pen_t *line_pens);
112   virtual void draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens);
113113   dynamic_array<UINT8> m_sprite_gfx;
114114
115115};
r30689r30690
125125public:
126126   neosprite_midas_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
127127   
128   virtual void draw_pixel(int romaddr, UINT32* dst, pen_t *line_pens);
128   virtual void draw_pixel(int romaddr, UINT32* dst, const pen_t *line_pens);
129129
130130   UINT16* m_videoram_buffer;
131131   void buffer_vram();
132   virtual void draw_fixed_layer_2pixels(UINT32*&pixel_addr, int offset, UINT8* gfx_base, pen_t* char_pens);
132   virtual void draw_fixed_layer_2pixels(UINT32*&pixel_addr, int offset, UINT8* gfx_base, const pen_t* char_pens);
133133   virtual void set_sprite_region(memory_region* region_sprites);
134134
135135   protected:
trunk/src/mess/drivers/ng_aes.c
r30689r30690
14551455UINT32 ng_aes_state::screen_update_neocd(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
14561456{
14571457   // fill with background color first
1458   bitmap.fill(m_pens[0x0fff], cliprect);
1458   bitmap.fill(*m_bg_pen, cliprect);
14591459
14601460   if (m_has_sprite_bus) m_sprgen->draw_sprites(bitmap, cliprect.min_y);
14611461

Previous 199869 Revisions Next


© 1997-2024 The MAME Team