Previous 15994 Revisions Next

r8779 Sunday 15th August, 2010 at 07:15:38 UTC by MooglyGuy
[SUPRACAN] Added mosaic support. Removed BG color support, as it was bogus. [Harmony]
[src/mess/drivers]supracan.c

src/mess/drivers/supracan.c
r8778r8779
132132    emu_timer *line_on_timer;
133133    emu_timer *line_off_timer;
134134   UINT16 *vram;
135    UINT8 bg_color;
135    UINT16 *pram;
136136
137137    bitmap_t *sprite_final_bitmap;
138138    UINT8 sprite_pri[1024*1024];
r8778r8779
370370    scrollx |= (scrollx & 0x800) ? 0xfffff000 : 0;
371371    scrolly |= (scrolly & 0x800) ? 0xfffff000 : 0;
372372
373    int gfx_mode = (state->tilemap_mode[layer] & 0x7000) >> 12;
374
375    int region = 1;
376    UINT16 tile_bank = 0;
377    UINT16 palette_bank = 0;
378    switch(gfx_mode)
379    {
380        case 7:
381            region = 2;
382            tile_bank = 0x1c00;
383            palette_bank = 0x00;
384            break;
385
386        case 4:
387            region = 1;
388            tile_bank = 0x800;
389            palette_bank = 0x00;
390            break;
391
392        case 2:
393            region = 1;
394            tile_bank = 0x400;
395            palette_bank = 0x00;
396            break;
397
398        case 0:
399            region = 1;
400            tile_bank = 0;
401            palette_bank = 0x00;
402            break;
403
404        default:
405            verboselog("maincpu", machine, 0, "Unsupported tilemap mode: %d\n", (state->tilemap_flags[layer] & 0x7000) >> 12);
406            break;
407    }
408
409373    int wrapped_x = scrollx;
410374    int wrapped_y = ypos + scrolly;
411375
r8778r8779
427391        }
428392    }
429393
430    UINT16 *src = BITMAP_ADDR16(state->tilemap_bitmap[layer], wrapped_y, 0);
431    UINT8 *srcpri = &state->tilemap_pri[layer][1024*wrapped_y];
394    int mosaic = (state->tilemap_flags[layer] & 0x001c) >> 2;
395    UINT32 mask = 0xffffffff;
432396
397    if(mosaic)
398    {
399        mosaic--;
400        mask = ~(1 << mosaic);
401    }
402
403    UINT16 *src = BITMAP_ADDR16(state->tilemap_bitmap[layer], wrapped_y & mask, 0);
404    UINT8 *srcpri = &state->tilemap_pri[layer][1024*(wrapped_y & mask)];
405
433406    if(state->tilemap_flags[layer] & 0x20)
434407    {
435408        while(wrapped_x >= width*8) wrapped_x -= width*8;
r8778r8779
437410
438411        for(int x = 0; x < 320; x++)
439412        {
440            scanline[x] = src[wrapped_x] ? src[wrapped_x] : scanline[x];
441            priline[x] = src[wrapped_x] ? srcpri[wrapped_x] : 8;
413            scanline[x] = src[wrapped_x & mask] ? src[wrapped_x & mask] : scanline[x];
414            priline[x] = src[wrapped_x & mask] ? srcpri[wrapped_x & mask] : 8;
442415            wrapped_x++;
443416            while(wrapped_x >= width*8) wrapped_x -= width*8;
444417        }
r8778r8779
449422        {
450423            if(wrapped_x >= 0 && wrapped_x < width*8)
451424            {
452                scanline[x] = src[wrapped_x] ? src[wrapped_x] : scanline[x];
453                priline[x] = src[wrapped_x] ? srcpri[wrapped_x] : 8;
425                scanline[x] = src[wrapped_x & mask] ? src[wrapped_x & mask] : scanline[x];
426                priline[x] = src[wrapped_x & mask] ? srcpri[wrapped_x & mask] : 8;
454427            }
455428            else
456429            {
r8778r8779
533506            break;
534507
535508        default:
536            verboselog("maincpu", machine, 0, "Unsupported tilemap mode: %d\n", (state->tilemap_flags[layer] & 0x7000) >> 12);
509            verboselog("maincpu", machine, 0, "Unsupported tilemap mode: %d\n", (state->tilemap_mode[layer] & 0x7000) >> 12);
537510            break;
538511   }
539512
513    if(layer == 2)
514    {
515        region = 1;
516        tile_bank = 0x400;
517        palette_bank = 0x00;
518    }
519
540520    if(state->tilemap_flags[layer] & 0x20)
541521    {
542522        bitmap_fill(state->tilemap_bitmap[layer], NULL, 0);
r8778r8779
824804      bool hflip = (supracan_vram[i+1] & 0x0800) ? true : false;
825805      bool vflip = (supracan_vram[i+1] & 0x0400) ? true : false;
826806#if !(DRAW_DEBUG_UNK_SPRITE)
827        UINT8 priority = ((supracan_vram[i+0] >> 12) & 7) + 1;
807        UINT8 priority = ((supracan_vram[i+2] >> 12) & 7) + 1;
828808#endif
829      while(x > cliprect->max_x)
809      while(x > 0x200)
830810        {
831         x -= 0x200;
811            x -= 0x200;
832812        }
833813
834      while(y > cliprect->max_y)
814      while(y > 0x200)
835815        {
836         y -= 0x200;
816            y -= 0x200;
837817        }
838818
839819      if(supracan_vram[i+3] != 0)
840820      {
841821            int xsize = 1 << (supracan_vram[i+1] & 7);
842            int ysize = ((supracan_vram[i+0] & 0x1e00) >> 9)+1;
822            int ysize = ((supracan_vram[i+0] & 0x1e00) >> 9) + 1;
843823            //int ysize = (((supracan_vram[i+0] & 0x0600) >> 9) + 1) * (1 << ((supracan_vram[i+0] & 0x1800) >> 11));
844824            //if(supracan_vram[i+2] & 0x2000) ysize = xsize;
845825            //int ysize = ((supracan_vram[i+2] & 0x1e00) >> 9)+1;
r8778r8779
10221002    // crash debug: printf("K"); fflush(stdout);
10231003    supracan_state *state = (supracan_state *)screen->machine->driver_data<supracan_state>();
10241004
1025    bitmap_fill(bitmap, cliprect, state->bg_color);
1005    bitmap_fill(bitmap, cliprect, 0);
10261006
10271007    bitmap_fill(state->sprite_final_bitmap, cliprect, 0);
10281008    memset(state->sprite_pri, 8, 1024*1024 * sizeof(UINT8));
r8778r8779
12001180   }
12011181}
12021182
1183/*
1184static WRITE16_HANDLER( supracan_pram_w )
1185{
1186    supracan_state *state = (supracan_state *)space->machine->driver_data<supracan_state>();
1187    state->pram[offset] &= ~mem_mask;
1188    state->pram[offset] |= data & mem_mask;
1189}
1190*/
1191
12031192static ADDRESS_MAP_START( supracan_mem, ADDRESS_SPACE_PROGRAM, 16 )
12041193   AM_RANGE( 0x000000, 0x3fffff ) AM_ROM AM_REGION( "cart", 0 )
12051194   AM_RANGE( 0xe80200, 0xe80201 ) AM_READ_PORT("P1")
r8778r8779
14321421   PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(4) PORT_NAME("P4 Button A")
14331422INPUT_PORTS_END
14341423
1435
14361424static PALETTE_INIT( supracan )
14371425{
14381426   // Used for debugging purposes for now
r8778r8779
14491437   //#endif
14501438}
14511439
1452
14531440static WRITE16_HANDLER( supracan_68k_soundram_w )
14541441{
14551442    // crash debug: printf("P"); fflush(stdout);
r8778r8779
15641551      case 0x00/2: // Video IRQ flags
15651552            if(!space->debugger_access)
15661553            {
1554                //verboselog("maincpu", space->machine, 0, "read video IRQ flags (%04x)\n", data);
15671555                cpu_set_input_line(space->machine->device("maincpu"), 7, CLEAR_LINE);
15681556            }
15691557         break;
15701558        case 0x02/2: // Current scanline
15711559            break;
1560        case 0x08/2: // Unknown (not video flags!)
1561            data = 0;
1562            break;
1563        case 0x100/2:
1564            if(!space->debugger_access) verboselog("maincpu", space->machine, 0, "read tilemap_flags[0] (%04x)\n", data);
1565            break;
1566        case 0x106/2:
1567            if(!space->debugger_access) verboselog("maincpu", space->machine, 0, "read tilemap_scrolly[0] (%04x)\n", data);
1568            break;
1569        case 0x120/2:
1570            if(!space->debugger_access) verboselog("maincpu", space->machine, 0, "read tilemap_flags[1] (%04x)\n", data);
1571            break;
15721572      default:
15731573            if(!space->debugger_access) verboselog("maincpu", space->machine, 0, "supracan_video_r: Unknown register: %08x (%04x & %04x)\n", 0xf00000 + (offset << 1), data, mem_mask);
15741574         break;
r8778r8779
16201620      state->video_regs[0] |= 0x8000;
16211621        if(state->irq_mask & 1)
16221622        {
1623            verboselog("maincpu", machine, 0, "Triggering VBL IRQ\n");
1623            verboselog("maincpu", machine, 0, "Triggering VBL IRQ\n\n");
16241624            cpu_set_input_line(machine->device("maincpu"), 7, HOLD_LINE);
16251625        }
16261626      break;
r8778r8779
16301630
16311631    if (vpos == 0)
16321632    {
1633        bitmap_fill(state->roz_final_bitmap, &machine->primary_screen->visible_area(), 0);
1634        bitmap_fill(state->roz_bitmap, &machine->primary_screen->visible_area(), 0);
1633        bitmap_fill(state->roz_final_bitmap, NULL, 0);
1634        bitmap_fill(state->roz_bitmap, NULL, 0);
16351635        bitmap_fill(state->tilemap_bitmap[0], NULL, 0);
16361636        bitmap_fill(state->tilemap_bitmap[1], NULL, 0);
16371637        bitmap_fill(state->tilemap_bitmap[2], NULL, 0);
r8778r8779
16621662
16631663        if(state->video_flags & 0x20)
16641664        {
1665            // Causes issues in Speedy Dragon; investigate later
16651666            draw_tilemap(machine, state->tilemap_bitmap[2], &machine->primary_screen->visible_area(), 2);
16661667        }
16671668    }
r8778r8779
16701671    {
16711672        UINT16 *scandata = BITMAP_ADDR16(state->roz_final_bitmap, vpos, 0);
16721673        UINT8 *pridata = &state->roz_final_pri[vpos*320];
1673        draw_roz_bitmap_scanline(machine, state->roz_bitmap, scandata, pridata, vpos, state->roz_scrollx, state->roz_scrolly, state->roz_coeffa, state->roz_coeffb, state->roz_coeffc, state->roz_coeffd, &state->roz_cx, &state->roz_cy, state->roz_changed);
1674        if(state->video_flags & 4)
1675        {
1676            draw_roz_bitmap_scanline(machine, state->roz_bitmap, scandata, pridata, vpos, state->roz_scrollx, state->roz_scrolly, state->roz_coeffa, state->roz_coeffb, state->roz_coeffc, state->roz_coeffd, &state->roz_cx, &state->roz_cy, state->roz_changed);
1677        }
16741678
16751679        for(int index = 0; index < 3; index++)
16761680        {
1681            if(index == 2)
1682            {
1683                // Tilemap 2 causes issues in Speedy Dragon; investigate later
1684                //break;
1685            }
16771686            if(state->video_flags & (0x80 >> index) )
16781687            {
16791688                scandata = BITMAP_ADDR16(state->tilemap_final_bitmap[index], vpos, 0);
r8778r8779
18291838        case 0x140/2: state->tilemap_flags[2] = data; verboselog("maincpu", space->machine, 0, "tilemap_flags[2] = %04x\n", data); break;
18301839        case 0x144/2: state->tilemap_scrollx[2] = data; verboselog("maincpu", space->machine, 0, "tilemap_scrollx[2] = %04x\n", data); break;
18311840        case 0x146/2: state->tilemap_scrolly[2] = data; verboselog("maincpu", space->machine, 0, "tilemap_scrolly[2] = %04x\n", data); break;
1832        case 0x148/2: state->tilemap_base_addr[2] = (data) << 1; verboselog("maincpu", space->machine, 0, "tilemap_base_addr[2] = %05x\n", data << 2); verboselog("maincpu", space->machine, 0, "tilemap_base_addr[2] = %05x\n", data << 1); break;
1841        case 0x148/2: state->tilemap_base_addr[2] = (data) << 1; verboselog("maincpu", space->machine, 0, "tilemap_base_addr[2] = %05x\n", data << 2); break;
18331842        case 0x14a/2: state->tilemap_mode[2] = data; verboselog("maincpu", space->machine, 0, "tilemap_mode[2] = %04x\n", data); break;
18341843
18351844      /* ROZ */
r8778r8779
18481857        case 0x19a/2: state->roz_unk_base1 = data << 1; verboselog("maincpu", space->machine, 3, "roz_unk_base1 = %05x\n", data << 2); break;
18491858        case 0x19e/2: state->roz_unk_base2 = data << 1; verboselog("maincpu", space->machine, 3, "roz_unk_base2 = %05x\n", data << 2); break;
18501859
1851        case 0x1d0/2: state->bg_color = data & 0x00ff; verboselog("maincpu", space->machine, 3, "bg_color = %02x\n", data & 0x00ff); break;
1860        //case 0x1d0/2: state->bg_color = data & 0x00ff; verboselog("maincpu", space->machine, 3, "bg_color = %04x\n", data); break;
18521861
18531862      case 0x1f0/2: //FIXME: this register is mostly not understood
18541863         state->irq_mask = data;//(data & 8) ? 0 : 1;
r8778r8779
20072016
20082017   MDRV_SCREEN_ADD( "screen", RASTER )
20092018   MDRV_SCREEN_FORMAT( BITMAP_FORMAT_INDEXED16 )
2019    //MDRV_SCREEN_FORMAT( BITMAP_FORMAT_RGB32 )
20102020   MDRV_SCREEN_RAW_PARAMS(XTAL_10_738635MHz/2, 348, 0, 256, 256, 0, 240 )   /* No idea if this is correct */
20112021
20122022   MDRV_PALETTE_LENGTH( 32768 )

Previous 15994 Revisions Next


© 1998-2018 The MESS Team