diff --git a/src/mame/drivers/saturn.c b/src/mame/drivers/saturn.c index 45efeaf7b5b..bd0cb79da2f 100644 --- a/src/mame/drivers/saturn.c +++ b/src/mame/drivers/saturn.c @@ -557,7 +557,7 @@ static WRITE32_HANDLER( saturn_scu_w ) /*LV 0 DMA*/ case 0x00/4: case 0x20/4: case 0x40/4: state->m_scu.src[DMA_CH] = ((state->m_scu_regs[offset] & 0x07ffffff) >> 0); break; case 0x04/4: case 0x24/4: case 0x44/4: state->m_scu.dst[DMA_CH] = ((state->m_scu_regs[offset] & 0x07ffffff) >> 0); break; - case 0x08/4: case 0x28/4: case 0x48/4: state->m_scu.size[DMA_CH] = ((state->m_scu_regs[offset] & ((offset == 2) ? 0x000fffff : 0x1fff)) >> 0); break; + case 0x08/4: case 0x28/4: case 0x48/4: state->m_scu.size[DMA_CH] = ((state->m_scu_regs[offset] & ((offset == 2) ? 0x000fffff : 0xfff)) >> 0); break; case 0x0c/4: case 0x2c/4: case 0x4c/4: state->m_scu.src_add[DMA_CH] = (state->m_scu_regs[offset] & 0x100) ? 4 : 0; state->m_scu.dst_add[DMA_CH] = 2 << (state->m_scu_regs[offset] & 7); @@ -673,7 +673,7 @@ static void scu_dma_direct(address_space *space, UINT8 dma_ch) DnMV_1(dma_ch); /* max size */ - if(state->m_scu.size[dma_ch] == 0) { state->m_scu.size[dma_ch] = (dma_ch == 0) ? 0x00100000 : 0x2000; } + if(state->m_scu.size[dma_ch] == 0) { state->m_scu.size[dma_ch] = (dma_ch == 0) ? 0x00100000 : 0x1000; } /*set here the boundaries checks*/ /*...*/ diff --git a/src/mame/machine/stvcd.c b/src/mame/machine/stvcd.c index 97dffcd0ab0..15ee934efae 100644 --- a/src/mame/machine/stvcd.c +++ b/src/mame/machine/stvcd.c @@ -779,22 +779,23 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data) break; case 0x1000: // Play Disc. FAD is in lowest 7 bits of cr1 and all of cr2. + UINT32 start_pos,end_pos; + CDROM_LOG(("%s:CD: Play Disc\n", machine.describe_context())) cd_stat = CD_STAT_PLAY; + //play_mode = cr3 >> 8; + if (!(cr3 & 0x8000)) // preserve current position if bit 7 set { - cd_curfad = ((cr1&0xff)<<16) | cr2; - fadstoplay = ((cr3&0xff)<<16) | cr4; + start_pos = ((cr1&0xff)<<16) | cr2; + //fadstoplay = ((cr3&0xff)<<16) | cr4; + end_pos = ((cr3&0xff)<<16) | cr4; - if (cd_curfad & 0x800000) + if (start_pos & 0x800000) { - if (cd_curfad != 0xffffff) - { - // fad mode - cd_curfad &= 0xfffff; - fadstoplay &= 0xfffff; - } + if (start_pos != 0xffffff) + cd_curfad = start_pos & 0xfffff; printf("fad mode\n"); cur_track = cdrom_get_track(cdrom, cd_curfad-150); @@ -802,16 +803,29 @@ static void cd_writeWord(running_machine &machine, UINT32 addr, UINT16 data) else { // track mode - cur_track = cd_curfad>>8; + cur_track = (start_pos)>>8; printf("track mode %d\n",cur_track); + if(cur_track == 0) + cur_track = 1; + cd_curfad = cdrom_get_track_start(cdrom, cur_track-1); - fadstoplay = cdrom_get_track_start(cdrom, cur_track) - cd_curfad; + } + + if (end_pos & 0x800000) + { + if (end_pos != 0xffffff) + fadstoplay = end_pos & 0xfffff; + } + else + { + UINT8 end_track; + + end_track = (end_pos)>>8; + fadstoplay = cdrom_get_track_start(cdrom, end_track) - cd_curfad; } } else // play until the end of the disc { - UINT32 start_pos,end_pos; - start_pos = ((cr1&0xff)<<16) | cr2; end_pos = ((cr3&0xff)<<16) | cr4; diff --git a/src/mame/video/stvvdp1.c b/src/mame/video/stvvdp1.c index 2a282cb0e2e..8822789038d 100644 --- a/src/mame/video/stvvdp1.c +++ b/src/mame/video/stvvdp1.c @@ -862,6 +862,11 @@ static void (*drawpixel)(running_machine &machine, int x, int y, int patterndata static void drawpixel_poly(running_machine &machine, int x, int y, int patterndata, int offsetcnt) { saturn_state *state = machine.driver_data(); + + /* Capcom Collection Dai 4 uses a dummy polygon to clear VDP1 framebuffer that goes over our current max size ... */ + if(x >= 1024 || y >= 512) + return; + state->m_vdp1.framebuffer_draw_lines[y][x] = stv2_current_sprite.CMDCOLR; } diff --git a/src/mame/video/stvvdp2.c b/src/mame/video/stvvdp2.c index 53a61d3097c..e48279e804a 100644 --- a/src/mame/video/stvvdp2.c +++ b/src/mame/video/stvvdp2.c @@ -1403,9 +1403,7 @@ bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09 #define STV_VDP2_BKTA_UL (state->m_vdp2_regs[0x0ac/4]) #define STV_VDP2_BKCLMD ((STV_VDP2_BKTA_UL & 0x80000000) >> 31) - #define STV_VDP2_BKTA ((STV_VDP2_BKTA_UL & 0x0003ffff) >> 0) - /*MSB of this register is used when the extra RAM cart is used,ignore it for now.*/ - // #define STV_VDP2_BKTA ((STV_VDP2_BKTA_UL & 0x0007ffff) >> 0) + #define STV_VDP2_BKTA ((STV_VDP2_BKTA_UL & 0x0007ffff) >> 0) /* 1800b0 - RPMD - Rotation Parameter Mode bit-> /----15----|----14----|----13----|----12----|----11----|----10----|----09----|----08----\ @@ -5270,41 +5268,36 @@ static void stv_vdp2_draw_RBG0(running_machine &machine, bitmap_t *bitmap, const static void stv_vdp2_draw_back(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect) { saturn_state *state = machine.driver_data(); - int xcnt,ycnt; + int x,y; UINT8* gfxdata = state->m_vdp2.gfx_decode; - static UINT16 *destline; - int r,b,g; - UINT16 data; + UINT32 base_offs,base_mask; - if(!(STV_VDP2_BDCLMD & 1)) + //popmessage("Back screen %08x %08x %08x",STV_VDP2_BDCLMD,STV_VDP2_BKCLMD,STV_VDP2_BKTA); + + /* draw black if BDCLMD and DISP are cleared */ + if(!(STV_VDP2_BDCLMD) && !(STV_VDP2_DISP)) bitmap_fill(bitmap, cliprect, get_black_pen(machine)); else { - #if DEBUG_MODE - //popmessage("Back screen enabled %08x",STV_VDP2_BKTA); - #endif - gfxdata+=((STV_VDP2_BKTA)<<1); + base_mask = STV_VDP2_VRAMSZ ? 0x7ffff : 0x3ffff; - b = ((gfxdata[0] & 0x7c) >> 2); - g = ((gfxdata[0] & 0x03) << 3) | ((gfxdata[1] & 0xe0) >> 5); - r = ((gfxdata[1] & 0x1f)); - data = b | g << 5 | r << 10; - - for (ycnt = cliprect->min_y; ycnt <= cliprect->max_y;ycnt++) + for(y=cliprect->min_y;y<=cliprect->max_y;y++) { - destline = BITMAP_ADDR16(bitmap, ycnt, 0); - - for (xcnt = cliprect->min_x; xcnt <=cliprect->max_x;xcnt++) - { - destline[xcnt] = data; - } + base_offs = (STV_VDP2_BKTA & base_mask) << 1; if(STV_VDP2_BKCLMD) + base_offs += (y << 1); + + for(x=cliprect->min_x;x<=cliprect->max_x;x++) { - gfxdata+=2; - b = ((gfxdata[0] & 0x7c) >> 2); - g = ((gfxdata[0] & 0x03) << 3) | ((gfxdata[1] & 0xe0) >> 5); - r = ((gfxdata[1] & 0x1f)); - data = b | g << 5 | r << 10; + int r,g,b; + UINT16 dot; + + dot = (gfxdata[base_offs+0]<<8)|gfxdata[base_offs+1]; + b = (dot & 0x7c00) >> 10; + g = (dot & 0x03e0) >> 5; + r = (dot & 0x001f) >> 0; + + *BITMAP_ADDR16(bitmap, y,x) = b | g << 5 | r << 10; } } } @@ -5423,6 +5416,10 @@ READ32_HANDLER ( saturn_vdp2_regs_r ) READ32_HANDLER ( saturn_vdp2_cram_r ) { saturn_state *state = space->machine().driver_data(); + UINT8 cmode0; + + cmode0 = ((STV_VDP2_CRMD & 3) == 0) || (STV_VDP2_CRMD & 2); + offset &= (0xfff) >> (cmode0+2); return state->m_vdp2_cram[offset]; } @@ -5439,9 +5436,9 @@ WRITE32_HANDLER ( saturn_vdp2_cram_w ) { saturn_state *state = space->machine().driver_data(); int r,g,b; - COMBINE_DATA(&state->m_vdp2_cram[offset]); + UINT8 cmode0; -// popmessage("%01x\n",STV_VDP2_CRMD); + cmode0 = (STV_VDP2_CRMD & 3) == 0; switch( STV_VDP2_CRMD ) { @@ -5449,6 +5446,10 @@ WRITE32_HANDLER ( saturn_vdp2_cram_w ) case 2: case 3: { + offset &= (0xfff) >> 3; + + COMBINE_DATA(&state->m_vdp2_cram[offset]); + b = ((state->m_vdp2_cram[offset] & 0x00ff0000) >> 16); g = ((state->m_vdp2_cram[offset] & 0x0000ff00) >> 8); r = ((state->m_vdp2_cram[offset] & 0x000000ff) >> 0); @@ -5459,16 +5460,22 @@ WRITE32_HANDLER ( saturn_vdp2_cram_w ) case 0: case 1: { - offset &= (0x3ff | ((offset & 1) << 10)); + offset &= (0xfff) >> (cmode0+2); + + COMBINE_DATA(&state->m_vdp2_cram[offset]); b = ((state->m_vdp2_cram[offset] & 0x00007c00) >> 10); g = ((state->m_vdp2_cram[offset] & 0x000003e0) >> 5); r = ((state->m_vdp2_cram[offset] & 0x0000001f) >> 0); palette_set_color_rgb(space->machine(),(offset*2)+1,pal5bit(r),pal5bit(g),pal5bit(b)); + if(cmode0) + palette_set_color_rgb(space->machine(),((offset*2)+1)^0x400,pal5bit(r),pal5bit(g),pal5bit(b)); b = ((state->m_vdp2_cram[offset] & 0x7c000000) >> 26); g = ((state->m_vdp2_cram[offset] & 0x03e00000) >> 21); r = ((state->m_vdp2_cram[offset] & 0x001f0000) >> 16); palette_set_color_rgb(space->machine(),offset*2,pal5bit(r),pal5bit(g),pal5bit(b)); + if(cmode0) + palette_set_color_rgb(space->machine(),(offset*2)^0x400,pal5bit(r),pal5bit(g),pal5bit(b)); } break; } @@ -5480,26 +5487,44 @@ static void refresh_palette_data(running_machine &machine) int r,g,b; int c_i; - for(c_i=0;c_i<0x800;c_i++) + switch( STV_VDP2_CRMD ) { - switch( STV_VDP2_CRMD ) + case 2: + case 3: { - /*Mode 2/3*/ - case 2: - case 3: + for(c_i=0;c_i<0x400;c_i++) { b = ((state->m_vdp2_cram[c_i] & 0x00ff0000) >> 16); g = ((state->m_vdp2_cram[c_i] & 0x0000ff00) >> 8); r = ((state->m_vdp2_cram[c_i] & 0x000000ff) >> 0); palette_set_color(machine,c_i,MAKE_RGB(r,g,b)); } - break; - /*Mode 0*/ - case 0: - case 1: - { - //c_i &= 0x3ff; + } + break; + case 0: + { + UINT8 bank; + for(bank=0;bank<2;bank++) + { + for(c_i=0;c_i<0x400;c_i++) + { + b = ((state->m_vdp2_cram[c_i] & 0x00007c00) >> 10); + g = ((state->m_vdp2_cram[c_i] & 0x000003e0) >> 5); + r = ((state->m_vdp2_cram[c_i] & 0x0000001f) >> 0); + palette_set_color_rgb(machine,(c_i*2)+1+bank*0x400,pal5bit(r),pal5bit(g),pal5bit(b)); + b = ((state->m_vdp2_cram[c_i] & 0x7c000000) >> 26); + g = ((state->m_vdp2_cram[c_i] & 0x03e00000) >> 21); + r = ((state->m_vdp2_cram[c_i] & 0x001f0000) >> 16); + palette_set_color_rgb(machine,c_i*2+bank*0x400,pal5bit(r),pal5bit(g),pal5bit(b)); + } + } + } + break; + case 1: + { + for(c_i=0;c_i<0x800;c_i++) + { b = ((state->m_vdp2_cram[c_i] & 0x00007c00) >> 10); g = ((state->m_vdp2_cram[c_i] & 0x000003e0) >> 5); r = ((state->m_vdp2_cram[c_i] & 0x0000001f) >> 0); @@ -5509,8 +5534,8 @@ static void refresh_palette_data(running_machine &machine) r = ((state->m_vdp2_cram[c_i] & 0x001f0000) >> 16); palette_set_color_rgb(machine,c_i*2,pal5bit(r),pal5bit(g),pal5bit(b)); } - break; } + break; } }