Implemented palette DMA brightness algorythm mode 5 in Seibu COP games, used by Seibu Cup Soccer, Godzilla, SD Gundam Rainbow Tairiku Senki and Legionnaire for fading effects [Angelo Salese]

This commit is contained in:
Angelo Salese 2010-12-28 02:22:14 +00:00
parent 9cb5563740
commit a09de9e736

View File

@ -1956,6 +1956,72 @@ static UINT16 cop_hit_status,cop_hit_internal_status;
static UINT32 cop_hit_val; static UINT32 cop_hit_val;
static UINT32 cop_sort_lookup,cop_sort_ram_addr,cop_sort_param; static UINT32 cop_sort_lookup,cop_sort_ram_addr,cop_sort_param;
static const UINT8 fade_table[0x400] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,
0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,
0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,
0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x02,
0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,
0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,
0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,
0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,
0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x07,0x07,
0x00,0x00,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,
0x04,0x04,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x08,0x08,
0x00,0x00,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x03,0x04,0x04,0x04,
0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x09,0x09,
0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x05,
0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x08,0x09,0x09,0x09,0x0A,0x0A,
0x00,0x00,0x01,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x04,0x04,0x04,0x05,0x05,0x05,
0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x09,0x09,0x09,0x0A,0x0A,0x0A,0x0B,0x0B,
0x00,0x00,0x01,0x01,0x02,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x05,0x06,
0x06,0x07,0x07,0x07,0x08,0x08,0x09,0x09,0x09,0x0A,0x0A,0x0A,0x0B,0x0B,0x0C,0x0C,
0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x05,0x06,0x06,
0x07,0x07,0x08,0x08,0x08,0x09,0x09,0x0A,0x0A,0x0A,0x0B,0x0B,0x0C,0x0C,0x0D,0x0D,
0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x05,0x06,0x06,0x07,
0x07,0x08,0x08,0x09,0x09,0x09,0x0A,0x0A,0x0B,0x0B,0x0C,0x0C,0x0D,0x0D,0x0E,0x0E,
0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,
0x08,0x08,0x09,0x09,0x0A,0x0A,0x0B,0x0B,0x0C,0x0C,0x0D,0x0D,0x0E,0x0E,0x0F,0x0F,
0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,0x08,
0x08,0x09,0x09,0x0A,0x0A,0x0B,0x0B,0x0C,0x0C,0x0D,0x0D,0x0E,0x0E,0x0F,0x0F,0x10,
0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x07,0x07,0x08,0x08,
0x09,0x09,0x0A,0x0A,0x0B,0x0C,0x0C,0x0D,0x0D,0x0E,0x0E,0x0F,0x0F,0x10,0x10,0x11,
0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x05,0x05,0x06,0x06,0x07,0x08,0x08,0x09,
0x09,0x0A,0x0A,0x0B,0x0C,0x0C,0x0D,0x0D,0x0E,0x0F,0x0F,0x10,0x10,0x11,0x11,0x12,
0x00,0x01,0x01,0x02,0x02,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x08,0x09,0x09,
0x0A,0x0A,0x0B,0x0C,0x0C,0x0D,0x0D,0x0E,0x0F,0x0F,0x10,0x11,0x11,0x12,0x12,0x13,
0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x0A,
0x0A,0x0B,0x0C,0x0C,0x0D,0x0E,0x0E,0x0F,0x0F,0x10,0x11,0x11,0x12,0x13,0x13,0x14,
0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x05,0x06,0x07,0x07,0x08,0x09,0x09,0x0A,
0x0B,0x0C,0x0C,0x0D,0x0E,0x0E,0x0F,0x10,0x10,0x11,0x12,0x12,0x13,0x14,0x14,0x15,
0x00,0x01,0x01,0x02,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x09,0x09,0x0A,0x0B,
0x0B,0x0C,0x0D,0x0D,0x0E,0x0F,0x10,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x15,0x16,
0x00,0x01,0x01,0x02,0x03,0x04,0x04,0x05,0x06,0x07,0x07,0x08,0x09,0x0A,0x0A,0x0B,
0x0C,0x0D,0x0D,0x0E,0x0F,0x10,0x10,0x11,0x12,0x13,0x13,0x14,0x15,0x16,0x16,0x17,
0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x05,0x06,0x07,0x08,0x09,0x09,0x0A,0x0B,0x0C,
0x0C,0x0D,0x0E,0x0F,0x0F,0x10,0x11,0x12,0x13,0x13,0x14,0x15,0x16,0x16,0x17,0x18,
0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x06,0x07,0x08,0x09,0x0A,0x0A,0x0B,0x0C,
0x0D,0x0E,0x0F,0x0F,0x10,0x11,0x12,0x13,0x13,0x14,0x15,0x16,0x17,0x17,0x18,0x19,
0x00,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,0x08,0x09,0x0A,0x0B,0x0C,0x0D,
0x0D,0x0E,0x0F,0x10,0x11,0x12,0x12,0x13,0x14,0x15,0x16,0x17,0x17,0x18,0x19,0x1A,
0x00,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0A,0x0B,0x0C,0x0D,
0x0E,0x0F,0x10,0x11,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x18,0x19,0x1A,0x1B,
0x00,0x01,0x02,0x03,0x04,0x05,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,
0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x17,0x18,0x19,0x1A,0x1B,0x1C,
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,
0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F };
static UINT16 u1,u2; static UINT16 u1,u2;
#define COP_CMD(_1_,_2_,_3_,_4_,_5_,_6_,_7_,_8_,_u1_,_u2_) \ #define COP_CMD(_1_,_2_,_3_,_4_,_5_,_6_,_7_,_8_,_u1_,_u2_) \
@ -2368,28 +2434,60 @@ static WRITE16_HANDLER( generic_cop_w )
static UINT32 src,dst,size,i; static UINT32 src,dst,size,i;
/* /*
Apparently all of those are just different DMA channels, brightness effects are done thru a RAM table and the pal_brightness_val / mode (Not yet done) Apparently all of those are just different DMA channels, brightness effects are done thru a RAM table and the pal_brightness_val / mode
0x80 is used by Legionnaire 0x80 is used by Legionnaire
0x81 is used by SD Gundam and Godzilla 0x81 is used by SD Gundam and Godzilla
0x82 is used by Zero Team and X Se Dae
0x86 is used by Seibu Cup Soccer 0x86 is used by Seibu Cup Soccer
0x87 is used by Denjin Makai 0x87 is used by Denjin Makai
TODO:
Denjin Makai triggers mode 4
*/ */
//if(dma_trigger != 0x87) //if(dma_trigger != 0x87)
printf("SRC: %08x %08x DST:%08x SIZE:%08x TRIGGER: %08x %02x %02x\n",cop_dma_src[cop_dma_trigger] << 6,cop_dma_fade_table * 0x400,cop_dma_dst[cop_dma_trigger] << 6,cop_dma_size[cop_dma_trigger] << 5,cop_dma_trigger,pal_brightness_val,pal_brightness_mode); //printf("SRC: %08x %08x DST:%08x SIZE:%08x TRIGGER: %08x %02x %02x\n",cop_dma_src[cop_dma_trigger] << 6,cop_dma_fade_table * 0x400,cop_dma_dst[cop_dma_trigger] << 6,cop_dma_size[cop_dma_trigger] << 5,cop_dma_trigger,pal_brightness_val,pal_brightness_mode);
if(cop_dma_trigger == 0x81)
src = (cop_dma_src[cop_dma_trigger] << 6);
else
src = (cop_dma_src[cop_dma_trigger] << 6) + (cop_dma_fade_table * 0x400);
src = (cop_dma_src[cop_dma_trigger] << 6) ;
dst = (cop_dma_dst[cop_dma_trigger] << 6); dst = (cop_dma_dst[cop_dma_trigger] << 6);
size = ((cop_dma_size[cop_dma_trigger] << 5) - (cop_dma_dst[cop_dma_trigger] << 6) + 0x20)/2; size = ((cop_dma_size[cop_dma_trigger] << 5) - (cop_dma_dst[cop_dma_trigger] << 6) + 0x20)/2;
for(i = 0;i < size;i++) for(i = 0;i < size;i++)
{ {
space->write_word(dst, space->read_word(src)); static UINT32 pal_val;
int r,g,b;
int rt,gt,bt;
if(pal_brightness_mode == 5)
{
bt = ((space->read_word(src + (cop_dma_fade_table * 0x400))) & 0x7c00) >> 5;
bt = fade_table[bt|(pal_brightness_val ^ 0)];
b = ((space->read_word(src)) & 0x7c00) >> 5;
b = fade_table[b|(pal_brightness_val ^ 0x1f)];
pal_val = ((b + bt) & 0x1f) << 10;
gt = ((space->read_word(src + (cop_dma_fade_table * 0x400))) & 0x03e0);
gt = fade_table[gt|(pal_brightness_val ^ 0)];
g = ((space->read_word(src)) & 0x03e0);
g = fade_table[g|(pal_brightness_val ^ 0x1f)];
pal_val |= ((g + gt) & 0x1f) << 5;
rt = ((space->read_word(src + (cop_dma_fade_table * 0x400))) & 0x001f) << 5;
rt = fade_table[rt|(pal_brightness_val ^ 0)];
r = ((space->read_word(src)) & 0x001f) << 5;
r = fade_table[r|(pal_brightness_val ^ 0x1f)];
pal_val |= ((r + rt) & 0x1f);
}
else if(pal_brightness_mode == 4) //Denjin Makai, TODO
{
pal_val = space->read_word(src);
}
else
{
printf("Warning: palette DMA used with mode %02x!",pal_brightness_mode);
pal_val = space->read_word(src);
}
space->write_word(dst, pal_val);
src+=2; src+=2;
dst+=2; dst+=2;
} }
@ -2449,10 +2547,6 @@ static WRITE16_HANDLER( generic_cop_w )
address = (cop_dma_src[cop_dma_trigger] << 6); address = (cop_dma_src[cop_dma_trigger] << 6);
length = ((cop_dma_size[cop_dma_trigger]+1) << 4); length = ((cop_dma_size[cop_dma_trigger]+1) << 4);
/* guess: palette can't be cleared by this, only by 0x8* commands? */
if((address & 0x11f000) == 0x104000)
return;
for (i=address;i<address+length;i+=4) for (i=address;i<address+length;i+=4)
{ {
space->write_dword(i, fill_val); space->write_dword(i, fill_val);