Port from MESS, nw

This commit is contained in:
Angelo Salese 2011-07-31 21:22:22 +00:00
parent 6e1e62bc47
commit ad84657450
4 changed files with 103 additions and 59 deletions

View File

@ -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*/
/*...*/

View File

@ -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;

View File

@ -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<saturn_state>();
/* 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;
}

View File

@ -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<saturn_state>();
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<saturn_state>();
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<saturn_state>();
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;
}
}