Previous 15994 Revisions Next

r5397 Monday 10th August, 2009 at 15:01:48 UTC by Robbbert
[JAGUAR] Added variable pixel width.
Fixed display of screens wider than 360 pixels.
Enabled use of RGB16.
[src/mame/video]jagobj.c jaguar.c
[src/mess/drivers]jaguar.c

src/mame/video/jagobj.c
r5396r5397
8484      while (firstpix & 7)
8585      {
8686         int pix = (pixsrc >> (4 * (~firstpix & 7))) & 0x0f;
87         if ((!(flags & 4) || pix) && (UINT32)xpos < 360)
87         if ((!(flags & 4) || pix) && (UINT32)xpos < 760)
8888         {
8989            if (!(flags & 2))
9090               scanline[xpos] = clutbase[BYTE_XOR_BE(pix)];
r5396r5397
105105      UINT32 pix = src[firstpix++];
106106      if (!(flags & 4) || pix)
107107      {
108         if ((!(flags & 4) || (pix & 0xf0000000)) && (UINT32)xpos < 360)
108         if ((!(flags & 4) || (pix & 0xf0000000)) && (UINT32)xpos < 760)
109109         {
110110            if (!(flags & 2))
111111               scanline[xpos] = clutbase[BYTE_XOR_BE(pix >> 28)];
r5396r5397
114114         }
115115         xpos += dxpos;
116116
117         if ((!(flags & 4) || (pix & 0x0f000000)) && (UINT32)xpos < 360)
117         if ((!(flags & 4) || (pix & 0x0f000000)) && (UINT32)xpos < 760)
118118         {
119119            if (!(flags & 2))
120120               scanline[xpos] = clutbase[BYTE_XOR_BE((pix >> 24) & 0x0f)];
r5396r5397
123123         }
124124         xpos += dxpos;
125125
126         if ((!(flags & 4) || (pix & 0x00f00000)) && (UINT32)xpos < 360)
126         if ((!(flags & 4) || (pix & 0x00f00000)) && (UINT32)xpos < 760)
127127         {
128128            if (!(flags & 2))
129129               scanline[xpos] = clutbase[BYTE_XOR_BE((pix >> 20) & 0x0f)];
r5396r5397
132132         }
133133         xpos += dxpos;
134134
135         if ((!(flags & 4) || (pix & 0x000f0000)) && (UINT32)xpos < 360)
135         if ((!(flags & 4) || (pix & 0x000f0000)) && (UINT32)xpos < 760)
136136         {
137137            if (!(flags & 2))
138138               scanline[xpos] = clutbase[BYTE_XOR_BE((pix >> 16) & 0x0f)];
r5396r5397
141141         }
142142         xpos += dxpos;
143143
144         if ((!(flags & 4) || (pix & 0x0000f000)) && (UINT32)xpos < 360)
144         if ((!(flags & 4) || (pix & 0x0000f000)) && (UINT32)xpos < 760)
145145         {
146146            if (!(flags & 2))
147147               scanline[xpos] = clutbase[BYTE_XOR_BE((pix >> 12) & 0x0f)];
r5396r5397
150150         }
151151         xpos += dxpos;
152152
153         if ((!(flags & 4) || (pix & 0x00000f00)) && (UINT32)xpos < 360)
153         if ((!(flags & 4) || (pix & 0x00000f00)) && (UINT32)xpos < 760)
154154         {
155155            if (!(flags & 2))
156156               scanline[xpos] = clutbase[BYTE_XOR_BE((pix >> 8) & 0x0f)];
r5396r5397
159159         }
160160         xpos += dxpos;
161161
162         if ((!(flags & 4) || (pix & 0x000000f0)) && (UINT32)xpos < 360)
162         if ((!(flags & 4) || (pix & 0x000000f0)) && (UINT32)xpos < 760)
163163         {
164164            if (!(flags & 2))
165165               scanline[xpos] = clutbase[BYTE_XOR_BE((pix >> 4) & 0x0f)];
r5396r5397
168168         }
169169         xpos += dxpos;
170170
171         if ((!(flags & 4) || (pix & 0x0000000f)) && (UINT32)xpos < 360)
171         if ((!(flags & 4) || (pix & 0x0000000f)) && (UINT32)xpos < 760)
172172         {
173173            if (!(flags & 2))
174174               scanline[xpos] = clutbase[BYTE_XOR_BE(pix & 0x0f)];
r5396r5397
250250      while (firstpix & 3)
251251      {
252252         UINT8 pix = pixsrc >> (8 * (~firstpix & 3));
253         if ((!(flags & 4) || pix) && (UINT32)xpos < 360)
253         if ((!(flags & 4) || pix) && (UINT32)xpos < 760)
254254         {
255255            if (!(flags & 2))
256256               scanline[xpos] = clutbase[BYTE_XOR_BE(pix)];
r5396r5397
271271      UINT32 pix = src[firstpix++];
272272      if (!(flags & 4) || pix)
273273      {
274         if ((!(flags & 4) || (pix & 0xff000000)) && (UINT32)xpos < 360)
274         if ((!(flags & 4) || (pix & 0xff000000)) && (UINT32)xpos < 760)
275275         {
276276            if (!(flags & 2))
277277               scanline[xpos] = clutbase[BYTE_XOR_BE(pix >> 24)];
r5396r5397
280280         }
281281         xpos += dxpos;
282282
283         if ((!(flags & 4) || (pix & 0x00ff0000)) && (UINT32)xpos < 360)
283         if ((!(flags & 4) || (pix & 0x00ff0000)) && (UINT32)xpos < 760)
284284         {
285285            if (!(flags & 2))
286286               scanline[xpos] = clutbase[BYTE_XOR_BE((pix >> 16) & 0xff)];
r5396r5397
289289         }
290290         xpos += dxpos;
291291
292         if ((!(flags & 4) || (pix & 0x0000ff00)) && (UINT32)xpos < 360)
292         if ((!(flags & 4) || (pix & 0x0000ff00)) && (UINT32)xpos < 760)
293293         {
294294            if (!(flags & 2))
295295               scanline[xpos] = clutbase[BYTE_XOR_BE((pix >> 8) & 0xff)];
r5396r5397
298298         }
299299         xpos += dxpos;
300300
301         if ((!(flags & 4) || (pix & 0x000000ff)) && (UINT32)xpos < 360)
301         if ((!(flags & 4) || (pix & 0x000000ff)) && (UINT32)xpos < 760)
302302         {
303303            if (!(flags & 2))
304304               scanline[xpos] = clutbase[BYTE_XOR_BE(pix & 0xff)];
r5396r5397
377377   if (firstpix & 1)
378378   {
379379      UINT16 pix = src[firstpix / 2];
380      if ((!(flags & 4) || pix) && (UINT32)xpos < 360)
380      if ((!(flags & 4) || pix) && (UINT32)xpos < 760)
381381      {
382382         if (!(flags & 2))
383383            scanline[xpos] = pix;
r5396r5397
396396      UINT32 pix = src[firstpix++];
397397      if (!(flags & 4) || pix)
398398      {
399         if ((!(flags & 4) || (pix >> 16)) && (UINT32)xpos < 360)
399         if ((!(flags & 4) || (pix >> 16)) && (UINT32)xpos < 760)
400400         {
401401            if (!(flags & 2))
402402               scanline[xpos] = pix >> 16;
r5396r5397
405405         }
406406         xpos += dxpos;
407407
408         if ((!(flags & 4) || (pix & 0xffff)) && (UINT32)xpos < 360)
408         if ((!(flags & 4) || (pix & 0xffff)) && (UINT32)xpos < 760)
409409         {
410410            if (!(flags & 2))
411411               scanline[xpos] = pix;
r5396r5397
557557               {
558558                  UINT8 pix = lookup_pixel(src, i, pitch, 1);
559559
560                  if (xpos >= 0 && xpos < 360 && (pix || !(flags & 4)))
560                  if (xpos >= 0 && xpos < 760 && (pix || !(flags & 4)))
561561                     scanline[xpos] = clut[BYTE_XOR_BE(pix)];
562562                  xpos += dxpos;
563563               }
r5396r5397
570570               {
571571                  UINT8 pix = lookup_pixel(src, i, pitch, 1);
572572
573                  if (xpos >= 0 && xpos < 360 && (pix || !(flags & 4)))
573                  if (xpos >= 0 && xpos < 760 && (pix || !(flags & 4)))
574574                     BLEND(scanline[xpos], clut[BYTE_XOR_BE(pix)]);
575575                  xpos += dxpos;
576576               }
r5396r5397
591591               {
592592                  UINT8 pix = lookup_pixel(src, i, pitch, 2);
593593
594                  if (xpos >= 0 && xpos < 360 && (pix || !(flags & 4)))
594                  if (xpos >= 0 && xpos < 760 && (pix || !(flags & 4)))
595595                     scanline[xpos] = clut[BYTE_XOR_BE(pix)];
596596                  xpos += dxpos;
597597               }
r5396r5397
604604               {
605605                  UINT8 pix = lookup_pixel(src, i, pitch, 2);
606606
607                  if (xpos >= 0 && xpos < 360 && (pix || !(flags & 4)))
607                  if (xpos >= 0 && xpos < 760 && (pix || !(flags & 4)))
608608                     BLEND(scanline[xpos], clut[BYTE_XOR_BE(pix)]);
609609                  xpos += dxpos;
610610               }
r5396r5397
754754
755755                  while (xleft > 0)
756756                  {
757                     if (xpos >= 0 && xpos < 360 && (pix || !(flags & 4)))
757                     if (xpos >= 0 && xpos < 760 && (pix || !(flags & 4)))
758758                        scanline[xpos] = clut[BYTE_XOR_BE(pix)];
759759                     xpos += dxpos;
760760                     xleft -= 0x20;
r5396r5397
776776
777777                  while (xleft > 0)
778778                  {
779                     if (xpos >= 0 && xpos < 360 && (pix || !(flags & 4)))
779                     if (xpos >= 0 && xpos < 760 && (pix || !(flags & 4)))
780780                        scanline[xpos] = clut[BYTE_XOR_BE(pix)];
781781                     xpos += dxpos;
782782                     xleft -= 0x20;
r5396r5397
794794
795795                  while (xleft > 0)
796796                  {
797                     if (xpos >= 0 && xpos < 360 && (pix || !(flags & 4)))
797                     if (xpos >= 0 && xpos < 760 && (pix || !(flags & 4)))
798798                        scanline[xpos] = pix;
799799                     xpos += dxpos;
800800                     xleft -= 0x20;
r5396r5397
908908
909909   /* erase the scanline first */
910910   scanline = _scanline;
911   for (x = 0; x < 360; x++)
911   for (x = 0; x < 760; x++)
912912      scanline[x] = gpu_regs[BG];
913913
914914   logit = LOG_OBJECTS;
src/mame/video/jaguar.c
r5396r5397
435435
436436      /* YCC/RGB VARMOD */
437437      case 0x100:
438      case 0x107:
438      case 0x106:
439439         for (i = 0; i < 65536; i++)
440440         {
441441            UINT8 r = (red_lookup[i >> 8] * (i & 0xff)) >> 8;
r5396r5397
646646
647647WRITE16_HANDLER( jaguar_tom_regs_w )
648648{
649   UINT32 reg_store = gpu_regs[offset];
650
649651   if (offset < GPU_REGS)
650652   {
651653      COMBINE_DATA(&gpu_regs[offset]);
r5396r5397
658660            break;
659661
660662         case VMODE:
661            jaguar_set_palette(gpu_regs[VMODE]);
663            if (reg_store != gpu_regs[offset])
664               jaguar_set_palette(gpu_regs[VMODE]);
662665            break;
663666
664667         case OBF:   /* clear GPU interrupt */
r5396r5397
678681         case VDB:
679682         case VDE:
680683         {
681            int hperiod = 2 * ((gpu_regs[HP] & 0x3ff) + 1);
682            int hbend = effective_hvalue(ENABLE_BORDERS ? gpu_regs[HBE] : MIN(gpu_regs[HDB1], gpu_regs[HDB2]));
683            int hbstart = effective_hvalue(gpu_regs[ENABLE_BORDERS ? HBB : HDE]);
684            int vperiod = (gpu_regs[VP] & 0x7ff) + 1;
685            int vbend = gpu_regs[VBE] & 0x7ff;
686            int vbstart = gpu_regs[VBB] & 0x7ff;
684            if (reg_store != gpu_regs[offset])
685            {
686               int hperiod = 2 * ((gpu_regs[HP] & 0x3ff) + 1);
687               int hbend = effective_hvalue(ENABLE_BORDERS ? gpu_regs[HBE] : MIN(gpu_regs[HDB1], gpu_regs[HDB2]));
688               int hbstart = effective_hvalue(gpu_regs[ENABLE_BORDERS ? HBB : HDE]);
689               int vperiod = (gpu_regs[VP] & 0x7ff) + 1;
690               int vbend = gpu_regs[VBE] & 0x7ff;
691               int vbstart = gpu_regs[VBB] & 0x7ff;
687692
688            /* adjust for the half-lines */
689            if (hperiod != 0 && vperiod != 0 && hbend < hbstart && vbend < vbstart && hbstart < hperiod)
690            {
691               rectangle visarea;
692               visarea.min_x = hbend / 2;
693               visarea.max_x = MIN((hbstart >> 1) - 1, 0x19c);
694//               visarea.max_x = hbstart / 2 - 1;
695               visarea.min_y = vbend / 2;
696               visarea.max_y = vbstart / 2 - 1;
697               video_screen_configure(space->machine->primary_screen, hperiod / 2, vperiod / 2, &visarea, HZ_TO_ATTOSECONDS((double)COJAG_PIXEL_CLOCK * 2 / hperiod / vperiod));
693               /* adjust for the half-lines */
694               if (hperiod != 0 && vperiod != 0 && hbend < hbstart && vbend < vbstart && hbstart < hperiod)
695               {
696                  rectangle visarea;
697                  visarea.min_x = hbend / 2;
698                  visarea.max_x = hbstart / 2 - 1;
699                  visarea.min_y = vbend / 2;
700                  visarea.max_y = vbstart / 2 - 1;
701                  video_screen_configure(space->machine->primary_screen, hperiod / 2, vperiod / 2, &visarea, HZ_TO_ATTOSECONDS((double)COJAG_PIXEL_CLOCK * 2 / hperiod / vperiod));
702               }
698703            }
699704            break;
700705         }
r5396r5397
772777      UINT32 *dest = BITMAP_ADDR32(screen_bitmap, vc / 2, 0);
773778      int maxx = visarea->max_x;
774779      int hde = effective_hvalue(gpu_regs[HDE]) / 2;
775      UINT16 scanline[360];
776      int x;
780      UINT16 x,scanline[760];
781      UINT8 y,pixel_width = ((gpu_regs[VMODE]>>10)&3)+1;
777782
778783      /* if we are first on this scanline, clear to the border color */
779784      if (ENABLE_BORDERS && vc % 2 == 0)
r5396r5397
787792      process_object_list(machine, vc, scanline);
788793
789794      /* copy the data to the target, clipping */
790      for (x = 0; x < 360 && hdb <= maxx && hdb < hde; x++, hdb++)
791         dest[hdb] = pen_table[scanline[x]];
795      for (x = 0; x < 760 && hdb <= maxx && hdb < hde; x++)
796         for (y = 0; y < pixel_width; y++)
797            dest[hdb++] = pen_table[scanline[x]];
792798   }
793799
794800   /* adjust the timer in a loop, to handle missed cases */
r5396r5397
822828   object_timer = timer_alloc(machine, cojag_scanline_update, NULL);
823829   adjust_object_timer(machine, 0);
824830
825   screen_bitmap = auto_bitmap_alloc(machine, 720, 512, BITMAP_FORMAT_RGB32);
831   screen_bitmap = auto_bitmap_alloc(machine, 760, 512, BITMAP_FORMAT_RGB32);
826832
827833   jagobj_init(machine);
828834
src/mess/drivers/jaguar.c
r5396r5397
563563
564564   /* cartridge */
565565   MDRV_CARTSLOT_ADD("cart")
566   MDRV_CARTSLOT_EXTENSION_LIST("jag,abs,rom,j64")
566   MDRV_CARTSLOT_EXTENSION_LIST("jag,abs,rom,j64,j01")
567567   MDRV_CARTSLOT_LOAD(jaguar)
568568MACHINE_DRIVER_END
569569
r5396r5397
635635   memcpy(jaguar_shared_ram, rom_base, 0x10);
636636
637637   /* Fix endian-ness */
638   if (!mame_stricmp(image_filetype(image), "j01"))
639   {
640      for (i = 0; i < image_length(image) / 4; i++)
641      {
642         j = cart_base[i];
643         cart_base[i] = ((j & 0xff) << 16) | ((j & 0xff00) << 16) | ((j & 0xff0000) >> 16) | ((j & 0xff000000) >> 16);
644      }
645   }
646   else
638647   for (i = 0; i < image_length(image) / 4; i++)
639648   {
640649      j = cart_base[i];
r5396r5397
656665 *************************************/
657666
658667/*    YEAR   NAME      PARENT    COMPAT  MACHINE   INPUT     INIT      CONFIG  COMPANY    FULLNAME */
659CONS( 1993,  jaguar,   0,        0,      jaguar,   jaguar,   jaguar,   0,      "Atari",   "Atari Jaguar", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )
668CONS( 1993,  jaguar,   0,        0,      jaguar,   jaguar,   jaguar,   0,      "Atari",   "Atari Jaguar", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND)
660669CONS( 1995,  jaguarcd, jaguar,   0,      jaguar,   jaguar,   jaguar,   0,      "Atari",   "Atari Jaguar CD", GAME_UNEMULATED_PROTECTION | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING)

Previous 15994 Revisions Next


© 1998-2018 The MESS Team