Previous 199869 Revisions Next

r32634 Friday 10th October, 2014 at 23:27:04 UTC by David Haywood
improve graphics in gostop (nw)
[src/mame/machine]st0016.c

trunk/src/mame/machine/st0016.c
r32633r32634
337337   /*
338338   object ram :
339339
340    each entry is 8 bytes:
340   each entry is 8 bytes:
341341
342      76543210 (bit)
343    0 llllllll
344    1 ---1SSSl
345    2 oooooooo
346    3 fooooooo
347    4 xxxxxxxx
348    5 ------xx
349    6 yyyyyyyy
350    7 ------yy
342   76543210 (bit)
343   0 llllllll
344   1 ---gSSSl
345   2 oooooooo
346   3 fooooooo
347   4 xxxxxxxx
348   5 ----XXxx
349   6 yyyyyyyy
350   7 ----XYyy
351351
352      1 - always(?) set
353      S - scroll index ? (ports $40-$60, X(word),Y(word) )
354      l - sublist length (8 byte entries -1)
355      o - sublist offset (*8 to get real offset)
356      f - end of list  flag
357      x,y - sprite coords
352   1 - always(?) set
353   S - scroll index ? (ports $40-$60, X(word),Y(word) )
354   l - sublist length (8 byte entries -1)
355   o - sublist offset (*8 to get real offset)
356   f - end of list  flag
357   x,y - sprite coords
358   
359   (complete guess)
360   g - use tile sizes specified in list (global / fixed ones if not set?) (gostop)
361   X = global X size?
362   Y = global Y size?
358363
359    sublist format (8 bytes/entry):
364   sublist format (8 bytes/entry):
360365
361      76543210
362    0 cccccccc
363    1 cccccccc
364    2 --kkkkkk
365    3 QW------
366    4 xxxxxxxx
367    5 -B---XXx
368    6 yyyyyyyy
369    7 -----YYy
366   76543210
367   0 cccccccc
368   1 cccccccc
369   2 --kkkkkk
370   3 QW------
371   4 xxxxxxxx
372   5 -B--XX-x
373   6 yyyyyyyy
374   7 ----YY-y
370375
371     c - character code
372     k - palette
373     QW - flips
374     x,y - coords
375     XX,YY - size (1<<size)
376     B - merge pixel data with prevoius one (8bpp mode - neratte: seta logo and title screen)
376   c - character code
377   k - palette
378   QW - flips
379   x,y - coords
380   XX,YY - size (1<<size)
381   B - merge pixel data with prevoius one (8bpp mode - neratte: seta logo and title screen)
377382
378383   */
379384
380385   gfx_element *gfx = m_gfxdecode->gfx(st0016_ramgfx);
381   int i,j,lx,ly,x,y,code,offset,length,sx,sy,color,flipx,flipy,scrollx,scrolly/*,plx,ply*/;
386   int i, j, lx, ly, x, y, code, offset, length, sx, sy, color, flipx, flipy, scrollx, scrolly/*,plx,ply*/;
382387
383388
384   for(i=0;i<ST0016_SPR_BANK_SIZE*ST0016_MAX_SPR_BANK;i+=8)
389   for (i = 0; i < ST0016_SPR_BANK_SIZE*ST0016_MAX_SPR_BANK; i += 8)
385390   {
386      x=st0016_spriteram[i+4]+((st0016_spriteram[i+5]&3)<<8);
387   y=st0016_spriteram[i+6]+((st0016_spriteram[i+7]&3)<<8);
391      x = st0016_spriteram[i + 4] + ((st0016_spriteram[i + 5] & 3) << 8);
392      y = st0016_spriteram[i + 6] + ((st0016_spriteram[i + 7] & 3) << 8);
388393
389   scrollx=(st0016_vregs[(((st0016_spriteram[i+1]&0x0f)>>1)<<2)+0x40]+256*st0016_vregs[(((st0016_spriteram[i+1]&0x0f)>>1)<<2)+1+0x40])&0x3ff;
390   scrolly=(st0016_vregs[(((st0016_spriteram[i+1]&0x0f)>>1)<<2)+2+0x40]+256*st0016_vregs[(((st0016_spriteram[i+1]&0x0f)>>1)<<2)+3+0x40])&0x3ff;
394      int use_sizes = (st0016_spriteram[i + 1] & 0x10);
395      int globalx = (st0016_spriteram[i + 5] & 0x0c)>>2;
396      int globaly = (st0016_spriteram[i + 7] & 0x0c)>>2;
391397
392   if(!ISMACS)
393   {
394      if (x & 0x200) x-= 0x400; //sign
395      if (y & 0x200) y-= 0x400;
398      scrollx = (st0016_vregs[(((st0016_spriteram[i + 1] & 0x0f) >> 1) << 2) + 0x40] + 256 * st0016_vregs[(((st0016_spriteram[i + 1] & 0x0f) >> 1) << 2) + 1 + 0x40]) & 0x3ff;
399      scrolly = (st0016_vregs[(((st0016_spriteram[i + 1] & 0x0f) >> 1) << 2) + 2 + 0x40] + 256 * st0016_vregs[(((st0016_spriteram[i + 1] & 0x0f) >> 1) << 2) + 3 + 0x40]) & 0x3ff;
396400
397      if (scrollx & 0x200) scrollx-= 0x400; //sign
398      if (scrolly & 0x200) scrolly-= 0x400;
399   }
401      if (!ISMACS)
402      {
403         if (x & 0x200) x -= 0x400; //sign
404         if (y & 0x200) y -= 0x400;
400405
401   if(ISMACS1)
402   {
403      if (x & 0x200) x-= 0x400; //sign
404      if (y & 0x200) y-= 0x2b0;//0x400;
406         if (scrollx & 0x200) scrollx -= 0x400; //sign
407         if (scrolly & 0x200) scrolly -= 0x400;
408      }
405409
406      if (scrollx & 0x200) scrollx-= 0x400; //sign
407      if (scrolly & 0x200) scrolly-= 0x400;
408   }
410      if (ISMACS1)
411      {
412         if (x & 0x200) x -= 0x400; //sign
413         if (y & 0x200) y -= 0x2b0;//0x400;
409414
410   x+=scrollx;
411   y+=scrolly;
415         if (scrollx & 0x200) scrollx -= 0x400; //sign
416         if (scrolly & 0x200) scrolly -= 0x400;
417      }
412418
413   if(ISMACS)
414   {
415      y+=0x20;
416   }
419      x += scrollx;
420      y += scrolly;
417421
418   if( st0016_spriteram[i+3]&0x80) /* end of list */
419      break;
422      if (ISMACS)
423      {
424         y += 0x20;
425      }
420426
421      offset=st0016_spriteram[i+2]+256*(st0016_spriteram[i+3]);
422      offset<<=3;
427      if (st0016_spriteram[i + 3] & 0x80) /* end of list */
428         break;
423429
424      length=st0016_spriteram[i+0]+1+256*(st0016_spriteram[i+1]&1);
430      offset = st0016_spriteram[i + 2] + 256 * (st0016_spriteram[i + 3]);
431      offset <<= 3;
425432
433      length = st0016_spriteram[i + 0] + 1 + 256 * (st0016_spriteram[i + 1] & 1);
434
426435      //plx=(st0016_spriteram[i+5]>>2)&0x3;
427436      //ply=(st0016_spriteram[i+7]>>2)&0x3;
428437
429      if(offset<ST0016_SPR_BANK_SIZE*ST0016_MAX_SPR_BANK)
438      if (offset < ST0016_SPR_BANK_SIZE*ST0016_MAX_SPR_BANK)
430439      {
431         for(j=0;j<length;j++)
440         for (j = 0; j < length; j++)
432441         {
433            code=st0016_spriteram[offset]+256*st0016_spriteram[offset+1];
434            sx=st0016_spriteram[offset+4]+((st0016_spriteram[offset+5]&1)<<8);
435            sy=st0016_spriteram[offset+6]+((st0016_spriteram[offset+7]&1)<<8);
442            code = st0016_spriteram[offset] + 256 * st0016_spriteram[offset + 1];
443            sx = st0016_spriteram[offset + 4] + ((st0016_spriteram[offset + 5] & 1) << 8);
444            sy = st0016_spriteram[offset + 6] + ((st0016_spriteram[offset + 7] & 1) << 8);
436445
437            if(ISMACS && !(ISMACS1))
446            if (ISMACS && !(ISMACS1))
438447            {
439               if (sy & 0x100) sy-= 0x200; //yuka & yujan
448               if (sy & 0x100) sy -= 0x200; //yuka & yujan
440449            }
441450
442            if(ISMACS)
451            if (ISMACS)
443452            {
444               sy=0xe0-sy;
453               sy = 0xe0 - sy;
445454            }
446455
447            sx+=x;
448            sy+=y;
449            color=st0016_spriteram[offset+2]&0x3f;
450            lx=(st0016_spriteram[offset+5]>>2)&3;
451            ly=(st0016_spriteram[offset+7]>>2)&3;
452         /*
453             if(plx |ply) //parent
454             {
455                 lx=plx;
456                 ly=ply;
457             }
458             */
456            sx += x;
457            sy += y;
458            color = st0016_spriteram[offset + 2] & 0x3f;
459           
460            if (use_sizes)
461            {
462               lx = (st0016_spriteram[offset + 5] >> 2) & 3;
463               ly = (st0016_spriteram[offset + 7] >> 2) & 3;
464            }
465            else
466            {
467               lx = globalx;
468               ly = globaly;
459469
460            flipx=st0016_spriteram[offset+3]&0x80;
461            flipy=st0016_spriteram[offset+3]&0x40;
470            }
462471
463            if(ISMACS)
464               sy-=(1<<ly)*8;
472            /*
473               if(plx |ply) //parent
474               {
475               lx=plx;
476               ly=ply;
477               }
478               */
465479
480            flipx = st0016_spriteram[offset + 3] & 0x80;
481            flipy = st0016_spriteram[offset + 3] & 0x40;
482
483            if (ISMACS)
484               sy -= (1 << ly) * 8;
485
466486            {
467               int x0,y0,i0=0;
468               for(x0=(flipx?((1<<lx)-1):0);x0!=(flipx?-1:(1<<lx));x0+=(flipx?-1:1))
469                  for(y0=(flipy?((1<<ly)-1):0);y0!=(flipy?-1:(1<<ly));y0+=(flipy?-1:1))
487               int x0, y0, i0 = 0;
488               for (x0 = (flipx ? ((1 << lx) - 1) : 0); x0 != (flipx ? -1 : (1 << lx)); x0 += (flipx ? -1 : 1))
489                  for (y0 = (flipy ? ((1 << ly) - 1) : 0); y0 != (flipy ? -1 : (1 << ly)); y0 += (flipy ? -1 : 1))
470490                  {
471                     /* custom draw */
472                     UINT16 *destline;
473                     int yloop,xloop;
474                     int ypos, xpos;
475                     int tileno;
476                     const UINT8 *srcgfx;
477                     int gfxoffs;
478                     ypos = sy+y0*8+spr_dy;
479                     xpos = sx+x0*8+spr_dx;
480                     tileno = (code+i0++)&ST0016_CHAR_BANK_MASK ;
491                  /* custom draw */
492                  UINT16 *destline;
493                  int yloop, xloop;
494                  int ypos, xpos;
495                  int tileno;
496                  const UINT8 *srcgfx;
497                  int gfxoffs;
498                  ypos = sy + y0 * 8 + spr_dy;
499                  xpos = sx + x0 * 8 + spr_dx;
500                  tileno = (code + i0++)&ST0016_CHAR_BANK_MASK;
481501
482                     gfxoffs = 0;
483                     srcgfx= gfx->get_data(tileno);
502                  gfxoffs = 0;
503                  srcgfx = gfx->get_data(tileno);
484504
485                     for (yloop=0; yloop<8; yloop++)
486                     {
487                        UINT16 drawypos;
505                  for (yloop = 0; yloop < 8; yloop++)
506                  {
507                     UINT16 drawypos;
488508
489                        if (!flipy) {drawypos = ypos+yloop;} else {drawypos = (ypos+8-1)-yloop;}
490                        destline = &bitmap.pix16(drawypos);
509                     if (!flipy) { drawypos = ypos + yloop; }
510                     else { drawypos = (ypos + 8 - 1) - yloop; }
511                     destline = &bitmap.pix16(drawypos);
491512
492                        for (xloop=0; xloop<8; xloop++)
493                        {
494                           UINT16 drawxpos;
495                           int pixdata;
496                           pixdata = srcgfx[gfxoffs];
513                     for (xloop = 0; xloop<8; xloop++)
514                     {
515                        UINT16 drawxpos;
516                        int pixdata;
517                        pixdata = srcgfx[gfxoffs];
497518
498                           if (!flipx) { drawxpos = xpos+xloop; } else { drawxpos = (xpos+8-1)-xloop; }
519                        if (!flipx) { drawxpos = xpos + xloop; }
520                        else { drawxpos = (xpos + 8 - 1) - xloop; }
499521
500                           if (drawxpos > cliprect.max_x)
501                              drawxpos -= 512; // wrap around
522                        if (drawxpos > cliprect.max_x)
523                           drawxpos -= 512; // wrap around
502524
503                           if (cliprect.contains(drawxpos, drawypos))
525                        if (cliprect.contains(drawxpos, drawypos))
526                        {
527                           if (st0016_spriteram[offset + 5] & 0x40)
504528                           {
505                              if(st0016_spriteram[offset+5]&0x40)
529                              destline[drawxpos] = (destline[drawxpos] | pixdata << 4) & 0x3ff;
530                           }
531                           else
532                           {
533                              if (ISMACS2)
506534                              {
507                                 destline[drawxpos] =(destline[drawxpos] | pixdata<<4)&0x3ff;
535                                 if (pixdata)//|| destline[drawxpos]==UNUSED_PEN)
536                                 {
537                                    destline[drawxpos] = pixdata + (color * 16);
538                                 }
508539                              }
509540                              else
510541                              {
511                                 if(ISMACS2)
542                                 if (pixdata || destline[drawxpos] == UNUSED_PEN)
512543                                 {
513                                    if(pixdata )//|| destline[drawxpos]==UNUSED_PEN)
514                                    {
515                                       destline[drawxpos] = pixdata + (color*16);
516                                    }
544                                    destline[drawxpos] = pixdata + (color * 16);
517545                                 }
518                                 else
519                                 {
520                                    if(pixdata || destline[drawxpos]==UNUSED_PEN)
521                                    {
522                                       destline[drawxpos] = pixdata + (color*16);
523                                    }
524                                 }
525546                              }
526547                           }
548                        }
527549
528                           gfxoffs++;
529                        }
550                        gfxoffs++;
530551                     }
531552                  }
553                  }
532554            }
533            offset+=8;
534            if(offset>=ST0016_SPR_BANK_SIZE*ST0016_MAX_SPR_BANK)
555            offset += 8;
556            if (offset >= ST0016_SPR_BANK_SIZE*ST0016_MAX_SPR_BANK)
535557               break;
536558         }
537559      }
r32633r32634
582604}
583605
584606
585void st0016_cpu_device::draw_bgmap(bitmap_ind16 &bitmap,const rectangle &cliprect, int priority)
607void st0016_cpu_device::draw_bgmap(bitmap_ind16 &bitmap, const rectangle &cliprect, int priority)
586608{
587609   gfx_element *gfx = m_gfxdecode->gfx(st0016_ramgfx);
588610   int j;
589611   //for(j=0x40-8;j>=0;j-=8)
590   for(j=0;j<0x40;j+=8)
612   for (j = 0; j < 0x40; j += 8)
591613   {
592      if(st0016_vregs[j+1] && ((priority && (st0016_vregs[j+3]==0xff))||((!priority)&&(st0016_vregs[j+3]!=0xff))))
614      if (st0016_vregs[j + 1] && ((priority && (st0016_vregs[j + 3] == 0xff)) || ((!priority) && (st0016_vregs[j + 3] != 0xff))))
593615      {
594         int x,y,code,color,flipx,flipy;
595         int i=st0016_vregs[j+1]*0x1000;
596         for(x=0;x<32*2;x++)
597            for(y=0;y<8*4;y++)
616         int x, y, code, color, flipx, flipy;
617         int i = st0016_vregs[j + 1] * 0x1000;
618
619         for (x = 0; x < 32 * 2; x++)
620         {
621            for (y = 0; y < 8 * 4; y++)
598622            {
599               code=st0016_spriteram[i]+256*st0016_spriteram[i+1];
600               color=st0016_spriteram[i+2]&0x3f;
623               code = st0016_spriteram[i] + 256 * st0016_spriteram[i + 1];
624               color = st0016_spriteram[i + 2] & 0x3f;
601625
602               flipx=st0016_spriteram[i+3]&0x80;
603               flipy=st0016_spriteram[i+3]&0x40;
626               flipx = st0016_spriteram[i + 3] & 0x80;
627               flipy = st0016_spriteram[i + 3] & 0x40;
604628
605               if(priority)
629               if (priority)
606630               {
607                  gfx->transpen(bitmap,cliprect,
608                              code,
609                              color,
610                              flipx,flipy,
611                              x*8+spr_dx,y*8+spr_dy,0);
631                  gfx->transpen(bitmap, cliprect,
632                     code,
633                     color,
634                     flipx, flipy,
635                     x * 8 + spr_dx, y * 8 + spr_dy, 0);
612636               }
613637               else
614638               {
615                     UINT16 *destline;
616                     int yloop,xloop;
617                     int ypos, xpos;
618                     const UINT8 *srcgfx;
619                     int gfxoffs;
620                     ypos = y*8+spr_dy;//+((st0016_vregs[j+2]==0xaf)?0x50:0);//hack for mayjinsen title screen
621                     xpos = x*8+spr_dx;
622                     gfxoffs = 0;
623                     srcgfx= gfx->get_data(code);
639                  UINT16 *destline;
640                  int yloop, xloop;
641                  int ypos, xpos;
642                  const UINT8 *srcgfx;
643                  int gfxoffs;
644                  ypos = y * 8 + spr_dy;//+((st0016_vregs[j+2]==0xaf)?0x50:0);//hack for mayjinsen title screen
645                  xpos = x * 8 + spr_dx;
646                  gfxoffs = 0;
647                  srcgfx = gfx->get_data(code);
624648
625                     for (yloop=0; yloop<8; yloop++)
626                     {
627                        UINT16 drawypos;
649                  for (yloop = 0; yloop < 8; yloop++)
650                  {
651                     UINT16 drawypos;
628652
629                        if (!flipy) {drawypos = ypos+yloop;} else {drawypos = (ypos+8-1)-yloop;}
630                        destline = &bitmap.pix16(drawypos);
653                     if (!flipy) { drawypos = ypos + yloop; }
654                     else { drawypos = (ypos + 8 - 1) - yloop; }
655                     destline = &bitmap.pix16(drawypos);
631656
632                        for (xloop=0; xloop<8; xloop++)
633                        {
634                           UINT16 drawxpos;
635                           int pixdata;
636                           pixdata = srcgfx[gfxoffs];
657                     for (xloop = 0; xloop<8; xloop++)
658                     {
659                        UINT16 drawxpos;
660                        int pixdata;
661                        pixdata = srcgfx[gfxoffs];
637662
638                           if (!flipx) { drawxpos = xpos+xloop; } else { drawxpos = (xpos+8-1)-xloop; }
663                        if (!flipx) { drawxpos = xpos + xloop; }
664                        else { drawxpos = (xpos + 8 - 1) - xloop; }
639665
640                           if (drawxpos > cliprect.max_x)
641                              drawxpos -= 512; // wrap around
666                        if (drawxpos > cliprect.max_x)
667                           drawxpos -= 512; // wrap around
642668
643                           if (cliprect.contains(drawxpos, drawypos))
669                        if (cliprect.contains(drawxpos, drawypos))
670                        {
671                           if (st0016_vregs[j + 7] == 0x12)
672                              destline[drawxpos] = (destline[drawxpos] | (pixdata << 4)) & 0x3ff;
673                           else
644674                           {
645                              if(st0016_vregs[j+7]==0x12)
646                                 destline[drawxpos] = (destline[drawxpos] | (pixdata<<4))&0x3ff;
647                              else
675                              if (ISMACS2)
648676                              {
649                                 if(ISMACS2)
677                                 if (pixdata)// || destline[drawxpos]==UNUSED_PEN)
650678                                 {
651                                    if(pixdata)// || destline[drawxpos]==UNUSED_PEN)
652                                    {
653                                       destline[drawxpos] = pixdata + (color*16);
654                                    }
679                                    destline[drawxpos] = pixdata + (color * 16);
655680                                 }
656                                 else
681                              }
682                              else
683                              {
684                                 if (pixdata || destline[drawxpos] == UNUSED_PEN)
657685                                 {
658                                    if(pixdata || destline[drawxpos]==UNUSED_PEN)
659                                    {
660                                       destline[drawxpos] = pixdata + (color*16);
661                                    }
686                                    destline[drawxpos] = pixdata + (color * 16);
662687                                 }
688                              }
663689
664                              }
665690                           }
691                        }
666692
667                           gfxoffs++;
693                        gfxoffs++;
668694
669                        }
670695                     }
696                  }
671697               }
672               i+=4;
698               i += 4;
673699            }
700         }
674701      }
675702   }
676703}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team