Previous 199869 Revisions Next

r21521 Friday 1st March, 2013 at 15:58:43 UTC by Angelo Salese
Added end mark
[src/mame/drivers]gunpey.c

trunk/src/mame/drivers/gunpey.c
r21520r21521
217217   TIMER_DEVICE_CALLBACK_MEMBER(gunpey_scanline);
218218   TIMER_CALLBACK_MEMBER(blitter_end);
219219   void gunpey_irq_check(UINT8 irq_type);
220   void flush_pal_data(int x, int y);
220   UINT8 draw_gfx(bitmap_ind16 &bitmap,const rectangle &cliprect,int count);
221221   UINT16 m_vram_bank;
222222
223
223224   //UINT16 main_vram[0x800][0x800];
224225};
225226
r21520r21521
229230   m_blit_buffer = auto_alloc_array(machine(), UINT16, 512*512);
230231}
231232
232UINT32 gunpey_state::screen_update_gunpey(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
233UINT8 gunpey_state::draw_gfx(bitmap_ind16 &bitmap,const rectangle &cliprect,int count)
233234{
234   //UINT16 *blit_buffer = m_blit_buffer;
235235   int x,y;
236   int count;
237236   int bpp_sel;
238237   int height;
239238   int width;
240239   int color;
241   UINT16 vram_bank = m_vram_bank & 0x7fff;
242240   UINT8 *vram = memregion("vram")->base();
243241
244   bitmap.fill(machine().pens[0], cliprect); //black pen
245
246   vram_bank ^= 0x2000;
247
248   /* last 4 entries are special, skip them for now. */
249   for(count = vram_bank/2;count<(vram_bank+0x2000-0x40)/2;count+=0x10/2)
242   if(!(m_wram[count+0] & 1))
250243   {
251      if(!(m_wram[count+0] & 1))
252      {
253         x = (m_wram[count+3] >> 8) | ((m_wram[count+4] & 0x03) << 8);
254         y = (m_wram[count+4] >> 8) | ((m_wram[count+4] & 0x30) << 4);
255         height = (m_wram[count+5] >> 8);
256         width = (m_wram[count+5] & 0xff);
257         bpp_sel = (m_wram[count+0] & 0x18);
258         color = (m_wram[count+0] >> 8);
244      x = (m_wram[count+3] >> 8) | ((m_wram[count+4] & 0x03) << 8);
245      y = (m_wram[count+4] >> 8) | ((m_wram[count+4] & 0x30) << 4);
246      height = (m_wram[count+5] >> 8);
247      width = (m_wram[count+5] & 0xff);
248      bpp_sel = (m_wram[count+0] & 0x18);
249      color = (m_wram[count+0] >> 8);
259250
260         x-=0x160;
261         y-=0x188;
251      x-=0x160;
252      y-=0x188;
262253
263         //UINT32 col = 0xffffff;
264
254      //UINT32 col = 0xffffff;
265255   //      UINT32 val = (m_wram[count+1] << 16) | ((m_wram[count+2]));
266
267         int xsource = ((m_wram[count+2] & 0x00ff) << 4) | ((m_wram[count+1] & 0xf000) >> 12);
268         int ysource = ((m_wram[count+2] & 0xf000) >> 12)| ((m_wram[count+3] & 0x00ff) << 4);
269
270         //printf("%08x  %04x %04x\n", val, m_wram[count+1],m_wram[count+2] );
271
256      int xsource = ((m_wram[count+2] & 0x00ff) << 4) | ((m_wram[count+1] & 0xf000) >> 12);
257      int ysource = ((m_wram[count+2] & 0xf000) >> 12)| ((m_wram[count+3] & 0x00ff) << 4);
258      //printf("%08x  %04x %04x\n", val, m_wram[count+1],m_wram[count+2] );
272259   //   UINT16 xsource = (m_wram[count+2] & 0x00ff << 4) | (m_wram[count+1] & 0xf000 >> 12);
273//         UINT16 ysource =  (m_wram[count+2] & 0xff00 >>8) | (m_wram[count+3] & 0x000f <<8);
260      //xsource<<=1;
274261
275         //xsource<<=1;
262      xsource<<=1;
263      ysource <<=2;
276264
277
278         xsource<<=1;
279         ysource <<=2;
280
281
282
283         if(bpp_sel == 0x00)  // 4bpp
265      if(bpp_sel == 0x00)  // 4bpp
266      {
267         for(int yi=0;yi<height;yi++)
284268         {
285            for(int yi=0;yi<height;yi++)
269            for(int xi=0;xi<width/2;xi++)
286270            {
287               for(int xi=0;xi<width/2;xi++)
288               {
289                  UINT8 data = vram[((((ysource+yi)&0x7ff)*0x800) + ((xsource+xi)&0x7ff))];
290                  UINT8 pix;
291                  UINT32 col_offs;
292                  UINT16 color_data;
271               UINT8 data = vram[((((ysource+yi)&0x7ff)*0x800) + ((xsource+xi)&0x7ff))];
272               UINT8 pix;
273               UINT32 col_offs;
274               UINT16 color_data;
293275
294                  pix = (data & 0x0f);
295                  col_offs = ((pix + color*0x10) & 0xff) << 1;
296                  col_offs+= ((pix + color*0x10) >> 8)*0x800;
297                  color_data = (vram[col_offs])|(vram[col_offs+1]<<8);
276               pix = (data & 0x0f);
277               col_offs = ((pix + color*0x10) & 0xff) << 1;
278               col_offs+= ((pix + color*0x10) >> 8)*0x800;
279               color_data = (vram[col_offs])|(vram[col_offs+1]<<8);
298280
299                  if(!(color_data & 0x8000))
300                  if(cliprect.contains(x+(xi*2), y+yi))
301                     bitmap.pix16(y+yi, x+(xi*2)) = color_data & 0x7fff;
281               if(!(color_data & 0x8000))
282               if(cliprect.contains(x+(xi*2), y+yi))
283                  bitmap.pix16(y+yi, x+(xi*2)) = color_data & 0x7fff;
302284
303                  pix = (data & 0xf0)>>4;
304                  col_offs = ((pix + color*0x10) & 0xff) << 1;
305                  col_offs+= ((pix + color*0x10) >> 8)*0x800;
306                  color_data = (vram[col_offs])|(vram[col_offs+1]<<8);
285               pix = (data & 0xf0)>>4;
286               col_offs = ((pix + color*0x10) & 0xff) << 1;
287               col_offs+= ((pix + color*0x10) >> 8)*0x800;
288               color_data = (vram[col_offs])|(vram[col_offs+1]<<8);
307289
308                  if(!(color_data & 0x8000))
290               if(!(color_data & 0x8000))
309291                  if(cliprect.contains(x+1+(xi*2), y+yi))
310292                     bitmap.pix16(y+yi, x+1+(xi*2)) = color_data & 0x7fff;
311               }
312293            }
313294         }
314         else if(bpp_sel == 0x08) // 6bpp
295      }
296      else if(bpp_sel == 0x08) // 6bpp
297      {
298         #if 0
299         for(int yi=0;yi<height;yi++)
315300         {
316            #if 0
317            for(int yi=0;yi<height;yi++)
301            for(int xi=0;xi<width;xi++)
318302            {
319               for(int xi=0;xi<width;xi++)
320               {
321                  UINT8 data = vram[((((ysource+yi)&0x7ff)*0x800) + ((xsource+xi)&0x7ff))];
322                  UINT8 pix;
323                  UINT32 col_offs;
324                  UINT16 color_data;
303               UINT8 data = vram[((((ysource+yi)&0x7ff)*0x800) + ((xsource+xi)&0x7ff))];
304               UINT8 pix;
305               UINT32 col_offs;
306               UINT16 color_data;
325307
326                  pix = (data & 0x3f);
327
328                  if(cliprect.contains(x+xi, y+yi))
329                     bitmap.pix16(y+yi, x+xi) = pix + color*64;
330               }
308               pix = (data & 0x3f);
309               if(cliprect.contains(x+xi, y+yi))
310                  bitmap.pix16(y+yi, x+xi) = pix + color*64;
331311            }
332            #endif
333312         }
334         else if(bpp_sel == 0x10) // 8bpp
313         #endif
314      }
315      else if(bpp_sel == 0x10) // 8bpp
316      {
317         for(int yi=0;yi<height;yi++)
335318         {
336            for(int yi=0;yi<height;yi++)
319            for(int xi=0;xi<width;xi++)
337320            {
338               for(int xi=0;xi<width;xi++)
339               {
340                  UINT8 data = vram[((((ysource+yi)&0x7ff)*0x800) + ((xsource+xi)&0x7ff))];
341                  UINT8 pix;
342                  UINT32 col_offs;
343                  UINT16 color_data;
321               UINT8 data = vram[((((ysource+yi)&0x7ff)*0x800) + ((xsource+xi)&0x7ff))];
322               UINT8 pix;
323               UINT32 col_offs;
324               UINT16 color_data;
344325
345                  pix = (data & 0xff);
346                  col_offs = ((pix + color*0x100) & 0xff) << 1;
347                  col_offs+= ((pix + color*0x100) >> 8)*0x800;
348                  color_data = (vram[col_offs])|(vram[col_offs+1]<<8);
326               pix = (data & 0xff);
327               col_offs = ((pix + color*0x100) & 0xff) << 1;
328               col_offs+= ((pix + color*0x100) >> 8)*0x800;
329               color_data = (vram[col_offs])|(vram[col_offs+1]<<8);
349330
350                  if(!(color_data & 0x8000))
351                  if(cliprect.contains(x+xi, y+yi))
352                     bitmap.pix16(y+yi, x+xi) = color_data & 0x7fff;
353               }
331               if(!(color_data & 0x8000))
332               if(cliprect.contains(x+xi, y+yi))
333                  bitmap.pix16(y+yi, x+xi) = color_data & 0x7fff;
354334            }
355335         }
356         else if(bpp_sel == 0x18) // RGB32k
357         {
358            // ...
359         }
360336      }
337      else if(bpp_sel == 0x18) // RGB32k
338      {
339         // ...
340      }
361341   }
362342
343   return m_wram[count+0] & 0x80;
344}
363345
346UINT32 gunpey_state::screen_update_gunpey(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
347{
348   //UINT16 *blit_buffer = m_blit_buffer;
349   int count;
350   UINT16 vram_bank = m_vram_bank & 0x7fff;
351   UINT8 end_mark;
352
353   bitmap.fill(machine().pens[0], cliprect); //black pen
354
355   vram_bank ^= 0x2000;
356
357   /* last 4 entries are special, skip them for now. */
358   for(count = vram_bank/2;count<(vram_bank+0x1000)/2;count+=0x10/2)
359   {
360      end_mark = draw_gfx(bitmap,cliprect,count);
361
362      if(end_mark == 0x80)
363         break;
364   }
365
366   for(count = (vram_bank+0x1000)/2;count<(vram_bank+0x2000)/2;count+=0x10/2)
367   {
368      end_mark = draw_gfx(bitmap,cliprect,count);
369
370      if(end_mark == 0x80)
371         break;
372   }
373
364374   return 0;
365375}
366376
r21520r21521
416426   gunpey_irq_check(4);
417427}
418428
419//flush_pal_data((dstx+x) & 0x7fe,(dsty+y) & 0x7ff);
420429
421void gunpey_state::flush_pal_data(int x, int y)
422{
423   if(y < 512 && x < 512)
424   {
425      UINT8 *vram = memregion("vram")->base();
426      int val = (vram[y*0x800+x]) | (vram[y*0x800+x+1]<<8);
427      int r,g,b;
428430
429      b = (val & 0x001f) >> 0;
430      g = (val & 0x03e0) >> 5;
431      r = (val & 0x7c00) >> 10;
432
433      palette_set_color(machine(), y*256+x/2, MAKE_RGB(pal5bit(r), pal5bit(g), pal5bit(b)));
434   }
435}
436
437431WRITE8_MEMBER(gunpey_state::gunpey_blitter_w)
438432{
439433//   UINT16 *blit_buffer = m_blit_buffer;
r21520r21521
485479         for (int x=0;x<xsize;x++)
486480         {
487481            vram[(((dsty+y)&0x7ff)*0x800)+((dstx+x)&0x7ff)] = blit_rom[(((srcy+y)&0x7ff)*0x800)+((srcx+x)&0x7ff)];
488            //flush_pal_data((dstx+x) & 0x7fe,(dsty+y) & 0x7ff);
489482         }
490483      }
491484

Previous 199869 Revisions Next


© 1997-2024 The MAME Team