Some optimization.

This commit is contained in:
n-a-c-h
2005-02-27 02:25:07 +00:00
parent b080385896
commit 142536770e
2 changed files with 207 additions and 212 deletions

View File

@@ -2062,224 +2062,214 @@ void InitDSP4()
void DSP4SetByte() void DSP4SetByte()
{ {
if ((dsp4_address & 0xf000) == 0x6000 || (dsp4_address >= 0x8000 && dsp4_address < 0xc000)) // clear pending read
{ if (DSP4.out_index < DSP4.out_count)
// clear pending read {
if (DSP4.out_index < DSP4.out_count) DSP4.out_index++;
return;
}
if (DSP4.waiting4command)
{
if (DSP4.half_command)
{ {
DSP4.out_index++; DSP4.command |= (dsp4_byte << 8);
return; DSP4.in_index = 0;
} DSP4.waiting4command = FALSE;
DSP4.half_command = FALSE;
if (DSP4.waiting4command) DSP4.out_count = 0;
{ DSP4.out_index = 0;
if (DSP4.half_command)
DSP4_Logic = 0;
switch (DSP4.command)
{ {
DSP4.command |= (dsp4_byte << 8); case 0x0000:
DSP4.in_index = 0; DSP4.in_count = 4; break;
DSP4.waiting4command = FALSE; case 0x0001:
DSP4.half_command = FALSE; DSP4.in_count = 44; break;
DSP4.out_count = 0; case 0x0003:
DSP4.out_index = 0; DSP4.in_count = 0; break;
case 0x0005:
DSP4_Logic = 0; DSP4.in_count = 0; break;
case 0x0006:
DSP4.in_count = 0; break;
switch (DSP4.command) case 0x0007:
{ DSP4.in_count = 34; break;
case 0x0000: case 0x0008:
DSP4.in_count = 4; break; DSP4.in_count = 90; break;
case 0x0001: case 0x0009:
DSP4.in_count = 44; break; DSP4.in_count = 14; break;
case 0x0003: case 0x000a:
DSP4.in_count = 0; break; DSP4.in_count = 6; break;
case 0x0005: case 0x000b:
DSP4.in_count = 0; break; DSP4.in_count = 6; break;
case 0x0006: case 0x000d:
DSP4.in_count = 0; break; DSP4.in_count = 42; break;
case 0x0007: case 0x000e:
DSP4.in_count = 34; break; DSP4.in_count = 0; break;
case 0x0008: case 0x000f:
DSP4.in_count = 90; break; DSP4.in_count = 46; break;
case 0x0009: case 0x0010:
DSP4.in_count = 14; break; DSP4.in_count = 36; break;
case 0x000a: case 0x0011:
DSP4.in_count = 6; break; DSP4.in_count = 8; break;
case 0x000b: default:
DSP4.in_count = 6; break; DSP4.waiting4command = TRUE;
case 0x000d: break;
DSP4.in_count = 42; break;
case 0x000e:
DSP4.in_count = 0; break;
case 0x000f:
DSP4.in_count = 46; break;
case 0x0010:
DSP4.in_count = 36; break;
case 0x0011:
DSP4.in_count = 8; break;
default:
DSP4.waiting4command = TRUE;
break;
}
}
else
{
DSP4.command = dsp4_byte;
DSP4.half_command = TRUE;
} }
} }
else else
{ {
DSP4.parameters[DSP4.in_index] = dsp4_byte; DSP4.command = dsp4_byte;
DSP4.in_index++; DSP4.half_command = TRUE;
} }
}
if (!DSP4.waiting4command && DSP4.in_count == DSP4.in_index) else
{
DSP4.parameters[DSP4.in_index] = dsp4_byte;
DSP4.in_index++;
}
if (!DSP4.waiting4command && DSP4.in_count == DSP4.in_index)
{
// Actually execute the command
DSP4.waiting4command = TRUE;
DSP4.out_index = 0;
DSP4.in_index = 0;
switch (DSP4.command)
{ {
// Actually execute the command // 16-bit multiplication
DSP4.waiting4command = TRUE; case 0x0000:
DSP4.out_index = 0;
DSP4.in_index = 0;
switch (DSP4.command)
{ {
// 16-bit multiplication int16 multiplier, multiplicand;
case 0x0000: int32 product;
{
int16 multiplier, multiplicand;
int32 product;
multiplier = DSP4_READ_WORD(); multiplier = DSP4_READ_WORD();
multiplicand = DSP4_READ_WORD(); multiplicand = DSP4_READ_WORD();
DSP4_Multiply(multiplicand, multiplier, &product); DSP4_Multiply(multiplicand, multiplier, &product);
DSP4_CLEAR_OUT(); DSP4_CLEAR_OUT();
DSP4_WRITE_WORD(product); DSP4_WRITE_WORD(product);
DSP4_WRITE_WORD(product >> 16); DSP4_WRITE_WORD(product >> 16);
}
break;
// single-player track projection
case 0x0001:
DSP4_OP01(); break;
// single-player selection
case 0x0003:
DSP4_OP03(); break;
// clear OAM
case 0x0005:
DSP4_OP05(); break;
// transfer OAM
case 0x0006:
DSP4_OP06(); break;
// single-player track fork projection
case 0x0007:
DSP4_OP07(); break;
// solid polygon projection
case 0x0008:
DSP4_OP08(); break;
// sprite projection
case 0x0009:
DSP4_OP09(); break;
// unknown
case 0x000A:
{
int16 in1a = DSP4_READ_WORD();
int16 in2a = DSP4_READ_WORD();
int16 in3a = DSP4_READ_WORD();
int16 out1a, out2a, out3a, out4a;
DSP4_OP0A(in2a, &out2a, &out1a, &out4a, &out3a);
DSP4_CLEAR_OUT();
DSP4_WRITE_WORD(out1a);
DSP4_WRITE_WORD(out2a);
DSP4_WRITE_WORD(out3a);
DSP4_WRITE_WORD(out4a);
}
break;
// set OAM
case 0x000B:
{
int16 sp_x = DSP4_READ_WORD();
int16 sp_y = DSP4_READ_WORD();
int16 sp_attr = DSP4_READ_WORD();
bool8 draw = 1;
DSP4_CLEAR_OUT();
DSP4_OP0B(&draw, sp_x, sp_y, sp_attr, 0, 1);
}
break;
// multi-player track projection
case 0x000D:
DSP4_OP0D(); break;
// multi-player selection
case 0x000E:
DSP4_OP0E(); break;
// single-player track projection with lighting
case 0x000F:
DSP4_OP0F(); break;
// single-player track fork projection with lighting
case 0x0010:
DSP4_OP10(); break;
// unknown: horizontal mapping command
case 0x0011:
{
int16 a, b, c, d, m;
d = DSP4_READ_WORD();
c = DSP4_READ_WORD();
b = DSP4_READ_WORD();
a = DSP4_READ_WORD();
DSP4_OP11(a, b, c, d, &m);
DSP4_CLEAR_OUT();
DSP4_WRITE_WORD(m);
break;
}
default:
break;
} }
break;
// single-player track projection
case 0x0001:
DSP4_OP01(); break;
// single-player selection
case 0x0003:
DSP4_OP03(); break;
// clear OAM
case 0x0005:
DSP4_OP05(); break;
// transfer OAM
case 0x0006:
DSP4_OP06(); break;
// single-player track fork projection
case 0x0007:
DSP4_OP07(); break;
// solid polygon projection
case 0x0008:
DSP4_OP08(); break;
// sprite projection
case 0x0009:
DSP4_OP09(); break;
// unknown
case 0x000A:
{
int16 in1a = DSP4_READ_WORD();
int16 in2a = DSP4_READ_WORD();
int16 in3a = DSP4_READ_WORD();
int16 out1a, out2a, out3a, out4a;
DSP4_OP0A(in2a, &out2a, &out1a, &out4a, &out3a);
DSP4_CLEAR_OUT();
DSP4_WRITE_WORD(out1a);
DSP4_WRITE_WORD(out2a);
DSP4_WRITE_WORD(out3a);
DSP4_WRITE_WORD(out4a);
}
break;
// set OAM
case 0x000B:
{
int16 sp_x = DSP4_READ_WORD();
int16 sp_y = DSP4_READ_WORD();
int16 sp_attr = DSP4_READ_WORD();
bool8 draw = 1;
DSP4_CLEAR_OUT();
DSP4_OP0B(&draw, sp_x, sp_y, sp_attr, 0, 1);
}
break;
// multi-player track projection
case 0x000D:
DSP4_OP0D(); break;
// multi-player selection
case 0x000E:
DSP4_OP0E(); break;
// single-player track projection with lighting
case 0x000F:
DSP4_OP0F(); break;
// single-player track fork projection with lighting
case 0x0010:
DSP4_OP10(); break;
// unknown: horizontal mapping command
case 0x0011:
{
int16 a, b, c, d, m;
d = DSP4_READ_WORD();
c = DSP4_READ_WORD();
b = DSP4_READ_WORD();
a = DSP4_READ_WORD();
DSP4_OP11(a, b, c, d, &m);
DSP4_CLEAR_OUT();
DSP4_WRITE_WORD(m);
break;
}
default:
break;
} }
} }
} }
void DSP4GetByte() void DSP4GetByte()
{ {
if ((dsp4_address & 0xf000) == 0x6000 || (dsp4_address >= 0x8000 && dsp4_address < 0xc000)) if (DSP4.out_count)
{ {
if (DSP4.out_count) dsp4_byte = (uint8) DSP4.output[DSP4.out_index&0x1FF];
{ DSP4.out_index++;
dsp4_byte = (uint8) DSP4.output[DSP4.out_index&0x1FF]; if (DSP4.out_count == DSP4.out_index)
DSP4.out_index++; DSP4.out_count = 0;
if (DSP4.out_count == DSP4.out_index)
DSP4.out_count = 0;
}
else
{
dsp4_byte = 0xff;
}
} }
else else
{ {
dsp4_byte = 0x80; dsp4_byte = 0xff;
} }
} }

View File

@@ -25,11 +25,25 @@ EXTSYM regaccessbankr16,regaccessbankr8,regaccessbankw16,regaccessbankw8
SECTION .text SECTION .text
NEWSYM DSP4Read8b %macro RouteAccess 1
test ecx,8000h test ecx,08000h
jnz .dsp4area jnz .dsp4area
jmp regaccessbankr8 jmp %1
.dsp4area .dsp4area
mov dx,cx
and dx,0C000h
cmp dx,08000h
je .dsp4continue
mov dx,cx
and dx,0F000h
cmp dx,06000h
je .dsp4continue
ret
.dsp4continue
%endmacro
NEWSYM DSP4Read8b
RouteAccess regaccessbankr8
mov word[dsp4_address],cx mov word[dsp4_address],cx
pushad pushad
call DSP4GetByte call DSP4GetByte
@@ -38,10 +52,7 @@ NEWSYM DSP4Read8b
ret ret
NEWSYM DSP4Write8b NEWSYM DSP4Write8b
test ecx,8000h RouteAccess regaccessbankw8
jnz .dsp4area
jmp regaccessbankw8
.dsp4area
mov word[dsp4_address],cx mov word[dsp4_address],cx
mov byte[dsp4_byte],al mov byte[dsp4_byte],al
pushad pushad
@@ -50,10 +61,7 @@ NEWSYM DSP4Write8b
ret ret
NEWSYM DSP4Read16b NEWSYM DSP4Read16b
test ecx,8000h RouteAccess regaccessbankr16
jnz .dsp4area
jmp regaccessbankr16
.dsp4area
mov word[dsp4_address],cx mov word[dsp4_address],cx
pushad pushad
call DSP4GetByte call DSP4GetByte
@@ -67,10 +75,7 @@ NEWSYM DSP4Read16b
ret ret
NEWSYM DSP4Write16b NEWSYM DSP4Write16b
test ecx,8000h RouteAccess regaccessbankw16
jnz .dsp4area
jmp regaccessbankw16
.dsp4area
mov word[dsp4_address],cx mov word[dsp4_address],cx
mov byte[dsp4_byte],al mov byte[dsp4_byte],al
mov byte[dsp4temp],ah mov byte[dsp4temp],ah