Previous 199869 Revisions Next

r20770 Wednesday 6th February, 2013 at 14:36:08 UTC by Ville Linde
k001604: Rewrote the ROZ rendering. [Ville Linde]
[src/mame/video]konicdev.c konicdev.h

trunk/src/mame/video/konicdev.c
r20769r20770
1013510135{
1013610136   screen_device *screen;
1013710137   tilemap_t        *layer_8x8[2];
10138   tilemap_t        *layer_roz[2];
10138   tilemap_t        *layer_roz;
1013910139   int            gfx_index[2];
1014010140
1014110141   UINT32 *       tile_ram;
r20769r20770
1023510235   return (row * 128) + col + 64 + 16384;
1023610236}
1023710237
10238TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_0_size0)
10238TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_128)
1023910239{
1024010240   /* logical (col,row) -> memory offset */
1024110241   return (row * 128) + col;
1024210242}
1024310243
10244TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_0_size1)
10244TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_256)
1024510245{
1024610246   /* logical (col,row) -> memory offset */
1024710247   return (row * 256) + col + 128;
1024810248}
1024910249
10250TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_1_size0)
10251{
10252   /* logical (col,row) -> memory offset */
10253   return (row * 128) + col + 64;
10254}
10255
10256TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_1_size1)
10257{
10258   /* logical (col,row) -> memory offset */
10259   return (row * 256) + col + 128 + 64;
10260}
10261
1026210250TILE_GET_INFO_MEMBER(k001604_device::k001604_tile_info_layer_8x8)
1026310251{
1026410252   k001604_state *k001604 = k001604_get_safe_token(this);
r20769r20770
1029710285void k001604_draw_back_layer( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect )
1029810286{
1029910287   k001604_state *k001604 = k001604_get_safe_token(device);
10300   int layer;
10301   int num_layers;
1030210288   bitmap.fill(0, cliprect);
1030310289
10304   num_layers = k001604->layer_size ? 2 : 1;
10305
1030610290   if ((k001604->reg[0x60 / 4] & 0x40000000) == 0)
1030710291      return;
1030810292
10309   for (layer = 0; layer < num_layers; layer++)
10293   int tile_size = k001604->roz_size ? 16 : 8;
10294
10295   INT32 x  = (INT16)((k001604->reg[0x08] >> 16) & 0xffff);
10296   INT32 y  = (INT16)((k001604->reg[0x08] >>  0) & 0xffff);
10297   INT32 xx = (INT16)((k001604->reg[0x09] >>  0) & 0xffff);
10298   INT32 xy = (INT16)((k001604->reg[0x09] >> 16) & 0xffff);
10299   INT32 yx = (INT16)((k001604->reg[0x0a] >>  0) & 0xffff);
10300   INT32 yy = (INT16)((k001604->reg[0x0a] >> 16) & 0xffff);
10301
10302   int pivotx = (INT16)((k001604->reg[0x00] >> 16) & 0xffff);
10303   int pivoty = (INT16)((k001604->reg[0x00] >>  0) & 0xffff);
10304
10305   int startx  = ((x - pivotx) * 256) * 32;
10306   int starty  = ((y - pivoty) * 256) * 32;
10307   int incxx = (xx) * 32;
10308   int incxy = (-xy) * 32;
10309   int incyx = (-yx) * 32;
10310   int incyy = (yy) * 32;
10311
10312   bitmap_ind16& pixmap = k001604->layer_roz->pixmap();
10313
10314   // extract start/end points
10315   int sx = cliprect.min_x;
10316   int sy = cliprect.min_y;
10317   int ex = cliprect.max_x;
10318   int ey = cliprect.max_y;
10319
10320   const rgb_t *clut = palette_entry_list_raw(bitmap.palette());
10321
10322   int window_x, window_y, window_xmask, window_ymask;
10323
10324   int layer_size = (k001604->reg[0x1b] >> 9) & 3;
10325
10326   if (k001604->roz_size)
10327      window_x = ((k001604->reg[0x1b] >> 1) & 3) * 512;
10328   else
10329      window_x = ((k001604->reg[0x1b] >> 1) & 1) * 512;
10330   
10331   window_y = 0;
10332
10333   switch (layer_size)
1031010334   {
10311      int reg = 0x08;
10335      case 0: window_xmask = (128 * tile_size) - 1; break;
10336      case 2: window_xmask = (64 * tile_size) - 1; break;
10337      case 3: window_xmask = (32 * tile_size) - 1; break;
10338      default: fatalerror("k001604_draw_back_layer(): layer_size %d\n", layer_size); break;
10339   }
1031210340
10313      INT32 x  = (INT16)((k001604->reg[reg + 0] >> 16) & 0xffff);
10314      INT32 y  = (INT16)((k001604->reg[reg + 0] >>  0) & 0xffff);
10315      INT32 xx = (INT16)((k001604->reg[reg + 1] >>  0) & 0xffff);
10316      INT32 xy = (INT16)((k001604->reg[reg + 1] >> 16) & 0xffff);
10317      INT32 yx = (INT16)((k001604->reg[reg + 2] >>  0) & 0xffff);
10318      INT32 yy = (INT16)((k001604->reg[reg + 2] >> 16) & 0xffff);
10341   window_ymask = pixmap.height() - 1;
10342   
1031910343
10320      x  = (x + 320) * 256;
10321      y  = (y + 208) * 256;
10322//      xx = (xx);
10323      xy = (-xy);
10324      yx = (-yx);
10325//      yy = (yy);
10344   // loop over rows
10345   while (sy <= ey)
10346   {
10347      // initialize X counters
10348      int x = sx;
10349      UINT32 cx = startx;
10350      UINT32 cy = starty;
1032610351
10327      if ((k001604->reg[0x6c / 4] & (0x08 >> layer)) != 0)
10352      UINT32 *dest = &bitmap.pix(sy, sx);
10353
10354      // loop over columns
10355      while (x <= ex)
1032810356      {
10329         k001604->layer_roz[layer]->draw_roz(bitmap, cliprect,
10330                        x << 5, y << 5, xx << 5, xy << 5, yx << 5, yy << 5, 1, 0, 0);
10357         *dest = clut[pixmap.pix16(((cy >> 16) & window_ymask) + window_y, ((cx >> 16) & window_xmask) + window_x)];
10358
10359         // advance in X
10360         cx += incxx;
10361         cy += incxy;
10362         x++;
10363         dest++;
1033110364      }
10365
10366      // advance in Y
10367      startx += incyx;
10368      starty += incyy;
10369      sy++;
1033210370   }
1033310371}
1033410372
r20769r20770
1041310451      {
1041410452         k001604->layer_8x8[1]->mark_tile_dirty(offset);
1041510453      }
10416      else if (x < 192)
10417      {
10418         k001604->layer_roz[0]->mark_tile_dirty(offset);
10419      }
1042010454      else
1042110455      {
10422         k001604->layer_roz[1]->mark_tile_dirty(offset);
10456         k001604->layer_roz->mark_tile_dirty(offset);
1042310457      }
1042410458   }
1042510459   else
r20769r20770
1042710461      if (x < 64)
1042810462      {
1042910463         k001604->layer_8x8[0]->mark_tile_dirty(offset);
10430         k001604->layer_roz[0]->mark_tile_dirty(offset);
1043110464      }
1043210465      else
1043310466      {
1043410467         k001604->layer_8x8[1]->mark_tile_dirty(offset);
10435         k001604->layer_roz[1]->mark_tile_dirty(offset);
1043610468      }
10469
10470      k001604->layer_roz->mark_tile_dirty(offset);
1043710471   }
1043810472}
1043910473
r20769r20770
1052610560      {
1052710561         k001604->layer_8x8[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_8x8_0_size1),this), 8, 8, 64, 64);
1052810562         k001604->layer_8x8[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_8x8_1_size1),this), 8, 8, 64, 64);
10529         k001604->layer_roz[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_0_size1),this), roz_tile_size, roz_tile_size, 64, 64);
10530         k001604->layer_roz[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_1_size1),this), roz_tile_size, roz_tile_size, 64, 64);
10563
10564         k001604->layer_roz = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_256),this), roz_tile_size, roz_tile_size, 128, 64);
1053110565      }
1053210566      else
1053310567      {
1053410568         k001604->layer_8x8[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_8x8_0_size0),this), 8, 8, 64, 64);
1053510569         k001604->layer_8x8[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_8x8_1_size0),this), 8, 8, 64, 64);
10536         k001604->layer_roz[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_0_size0),this), roz_tile_size, roz_tile_size, 128, 64);
10537         k001604->layer_roz[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_1_size0),this), roz_tile_size, roz_tile_size, 64, 64);
10570
10571         k001604->layer_roz = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_128),this), roz_tile_size, roz_tile_size, 128, 64);
1053810572      }
1053910573   }
1054010574   else    /* slrasslt has shifted tilemaps (but only has k001604->layer_size =  0) */
1054110575   {
1054210576      k001604->layer_8x8[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::slrasslt_scan_layer_8x8_0_size0),this), 8, 8, 64, 64);
1054310577      k001604->layer_8x8[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::slrasslt_scan_layer_8x8_1_size0),this), 8, 8, 64, 64);
10544      k001604->layer_roz[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_0_size0),this), roz_tile_size, roz_tile_size, 128, 64);
10545      k001604->layer_roz[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_1_size0),this), roz_tile_size, roz_tile_size, 64, 64);
10578
10579      k001604->layer_roz = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_128),this), roz_tile_size, roz_tile_size, 128, 64);
1054610580   }
1054710581
1054810582   k001604->layer_8x8[0]->set_transparent_pen(0);
trunk/src/mame/video/konicdev.h
r20769r20770
556556   TILEMAP_MAPPER_MEMBER(k001604_scan_layer_8x8_1_size1);
557557   TILEMAP_MAPPER_MEMBER(slrasslt_scan_layer_8x8_0_size0);
558558   TILEMAP_MAPPER_MEMBER(slrasslt_scan_layer_8x8_1_size0);
559   TILEMAP_MAPPER_MEMBER(k001604_scan_layer_roz_0_size0);
560   TILEMAP_MAPPER_MEMBER(k001604_scan_layer_roz_0_size1);
561   TILEMAP_MAPPER_MEMBER(k001604_scan_layer_roz_1_size0);
562   TILEMAP_MAPPER_MEMBER(k001604_scan_layer_roz_1_size1);
559   TILEMAP_MAPPER_MEMBER(k001604_scan_layer_roz_256);
560   TILEMAP_MAPPER_MEMBER(k001604_scan_layer_roz_128);
563561   TILE_GET_INFO_MEMBER(k001604_tile_info_layer_8x8);
564562   TILE_GET_INFO_MEMBER(k001604_tile_info_layer_roz);
565563};

Previous 199869 Revisions Next


© 1997-2024 The MAME Team