summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorfires.gc <fires.gc@gmail.com>2008-10-11 08:43:50 +0000
committerfires.gc <fires.gc@gmail.com>2008-10-11 08:43:50 +0000
commitf9bd977ffdd92a70fc2c27cf6529873360f27533 (patch)
tree469535afd4e62196bc951bb020d6c1a750e3396e /Source
parent4d93e126de88e9e28e804290850182634b86c81e (diff)
some HLE LLE stuff :)
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@837 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source')
-rw-r--r--Source/Plugins/Plugin_DSP_HLE/Plugin_DSP_HLE.vcproj2
-rw-r--r--Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AXStructs.h32
-rw-r--r--Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.vcproj8
-rw-r--r--Source/Plugins/Plugin_DSP_LLE/Src/Globals.h5
-rw-r--r--Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp10
-rw-r--r--Source/Plugins/Plugin_DSP_LLE/Src/Tools.h2
-rw-r--r--Source/Plugins/Plugin_DSP_LLE/Src/disassemble.cpp3
-rw-r--r--Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.cpp8
-rw-r--r--Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.cpp9
-rw-r--r--Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.cpp73
-rw-r--r--Source/Plugins/Plugin_DSP_LLE/Src/main.cpp6
11 files changed, 119 insertions, 39 deletions
diff --git a/Source/Plugins/Plugin_DSP_HLE/Plugin_DSP_HLE.vcproj b/Source/Plugins/Plugin_DSP_HLE/Plugin_DSP_HLE.vcproj
index fe88de2a92..0aa25b7c03 100644
--- a/Source/Plugins/Plugin_DSP_HLE/Plugin_DSP_HLE.vcproj
+++ b/Source/Plugins/Plugin_DSP_HLE/Plugin_DSP_HLE.vcproj
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9.00"
+ Version="9,00"
Name="Plugin_DSP_HLE"
ProjectGUID="{D6E56527-BBB9-4EAD-A6EC-49D4BF6AFCD8}"
RootNamespace="Plugin_DSP"
diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AXStructs.h b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AXStructs.h
index 207e8d932c..19bea069b6 100644
--- a/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AXStructs.h
+++ b/Source/Plugins/Plugin_DSP_HLE/Src/UCodes/UCode_AXStructs.h
@@ -31,7 +31,13 @@ struct PBMixer
struct PBInitialTimeDelay
{
- u16 unknown[7];
+ u16 on;
+ u16 addrMemHigh;
+ u16 addrMemLow;
+ u16 offsetLeft;
+ u16 offsetRight;
+ u16 targetLeft;
+ u16 targetRight;
};
// Update data - read these each 1ms subframe and use them!
@@ -76,7 +82,7 @@ struct PBAudioAddr
struct PBADPCMInfo
{
s16 coefs[16];
- u16 unknown;
+ u16 gain;
u16 pred_scale;
s16 yn1;
s16 yn2;
@@ -112,17 +118,17 @@ struct AXParamBlock
u16 running; // 1=RUN 0=STOP
u16 is_stream; // 1 = stream, 0 = one shot
- PBMixer mixer;
- PBInitialTimeDelay initial_time_delay;
- PBUpdates updates;
- PBUnknown unknown2;
- PBVolumeEnvelope vol_env;
- PBUnknown2 unknown3;
- PBAudioAddr audio_addr;
- PBADPCMInfo adpcm;
- PBSampleRateConverter src;
- PBADPCMLoopInfo adpcm_loop_info;
- u16 unknown_maybe_padding[3];
+/* 9 */ PBMixer mixer;
+/* 27 */ PBInitialTimeDelay initial_time_delay;
+/* 34 */ PBUpdates updates;
+/* 41 */ PBUnknown unknown2;
+/* 50 */ PBVolumeEnvelope vol_env;
+/* 52 */ PBUnknown2 unknown3;
+/* 55 */ PBAudioAddr audio_addr;
+/* 63 */ PBADPCMInfo adpcm;
+/* 83 */ PBSampleRateConverter src;
+/* 90 */ PBADPCMLoopInfo adpcm_loop_info;
+/* 93 */ u16 unknown_maybe_padding[3];
};
enum {
diff --git a/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.vcproj b/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.vcproj
index 5864a44d85..59e2e3ca74 100644
--- a/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.vcproj
+++ b/Source/Plugins/Plugin_DSP_LLE/Plugin_DSP_LLE.vcproj
@@ -747,6 +747,14 @@
>
</File>
</Filter>
+ <Filter
+ Name="HLE"
+ >
+ <File
+ RelativePath=".\Src\HLE_Functions.cpp"
+ >
+ </File>
+ </Filter>
<File
RelativePath=".\Src\DSoundStream.cpp"
>
diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Globals.h b/Source/Plugins/Plugin_DSP_LLE/Src/Globals.h
index 5626b9db5e..42edd2d0ac 100644
--- a/Source/Plugins/Plugin_DSP_LLE/Src/Globals.h
+++ b/Source/Plugins/Plugin_DSP_LLE/Src/Globals.h
@@ -21,8 +21,9 @@
#include "pluginspecs_dsp.h"
#include <stdio.h>
-#define WITH_DSP_ON_THREAD 1
-#define DUMP_DSP_IMEM 0
+#define WITH_DSP_ON_THREAD 1
+#define DUMP_DSP_IMEM 0
+#define PROFILE 1
extern DSPInitialize g_dspInitialize;
void DebugLog(const char* _fmt, ...);
diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp
index 7cc05b8a7a..5401bab086 100644
--- a/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp
+++ b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.cpp
@@ -23,9 +23,11 @@
#include "gdsp_interpreter.h"
-bool DumpDSPCode(uint32 _Address, uint32 _Length)
+bool DumpDSPCode(uint32 _Address, uint32 _Length, uint32 crc)
{
- FILE* pFile = fopen("d:\\DSP_UCode.bin", "wb");
+ char szFilename[MAX_PATH];
+ sprintf(szFilename, "c:\\_\\DSP_UC_%08X.bin", crc);
+ FILE* pFile = fopen(szFilename, "wb");
if (pFile != NULL)
{
@@ -33,6 +35,10 @@ bool DumpDSPCode(uint32 _Address, uint32 _Length)
fclose(pFile);
return(true);
}
+ else
+ {
+ PanicAlert("Cant open file (%s) to dump UCode!!", szFilename);
+ }
return(false);
}
diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/Tools.h b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.h
index 13d7cc6444..b7fe485d4a 100644
--- a/Source/Plugins/Plugin_DSP_LLE/Src/Tools.h
+++ b/Source/Plugins/Plugin_DSP_LLE/Src/Tools.h
@@ -45,6 +45,6 @@ union UDSPControl
};
-bool DumpDSPCode(uint32 _Address, uint32 _Length);
+bool DumpDSPCode(uint32 _Address, uint32 _Length, uint32 crc);
uint32 GenerateCRC(const unsigned char* _pBuffer, int _pLength);
bool DumpCWCode(uint32 _Address, uint32 _Length);
diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.cpp
index 763f088fa6..442d8036c4 100644
--- a/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.cpp
+++ b/Source/Plugins/Plugin_DSP_LLE/Src/disassemble.cpp
@@ -74,6 +74,9 @@ const pdlabel_t pdlabels[] =
{0xffce, "DSMAH", "DSP DMA Mem Address H",},
{0xffcf, "DSMAL", "DSP DMA Mem Address L",},
{0xffd1, "SampleFormat", "SampleFormat",},
+
+ {0xffd3, "Unk Zelda", "Unk Zelda writes to it",},
+
{0xffd4, "ACSAH", "Accelerator start address H",},
{0xffd5, "ACSAL", "Accelerator start address L",},
{0xffd6, "ACEAH", "Accelerator end address H",},
diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.cpp
index 739af272a2..e77ae4da20 100644
--- a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.cpp
+++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interface.cpp
@@ -251,10 +251,6 @@ uint16 gdsp_ifx_read(uint16 addr)
void gdsp_idma_in(uint16 dsp_addr, uint32 addr, uint32 size)
{
-#if DUMP_DSP_IMEM
- DumpDSPCode(addr, size);
-#endif
-
uint8* dst = ((uint8*)g_dsp.iram);
for (uint32 i = 0; i < size; i += 2)
@@ -264,6 +260,10 @@ void gdsp_idma_in(uint16 dsp_addr, uint32 addr, uint32 size)
g_dsp.iram_crc = GenerateCRC(g_dsp.cpu_ram + (addr & 0x0fffffff), size);
DebugLog("*** Copy new UCode from 0x%08x to 0x%04x (crc: %8x)\n", addr, dsp_addr, g_dsp.iram_crc);
+
+#if DUMP_DSP_IMEM
+ DumpDSPCode(addr, size, g_dsp.iram_crc );
+#endif
}
diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.cpp
index 0d187f967b..c67005066a 100644
--- a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.cpp
+++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_interpreter.cpp
@@ -220,12 +220,19 @@ void gdsp_loop_step()
dsp_op[opc >> 12](opc);
}
-void Hacks();
+u16 HLE_ROM_80E7_81F8();
+void hacks();
void gdsp_step()
{
g_dsp.step_counter++;
+ if (g_dsp.pc == 0x80e7)
+ {
+ g_dsp.pc = HLE_ROM_80E7_81F8();
+ }
+
g_dsp.err_pc = g_dsp.pc;
+
uint16 opc = dsp_fetch_code();
dsp_op[opc >> 12](opc);
diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.cpp
index 8b2b4367d0..82bbcb77ab 100644
--- a/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.cpp
+++ b/Source/Plugins/Plugin_DSP_LLE/Src/gdsp_opcodes.cpp
@@ -403,28 +403,28 @@ void dsp_opc_lrr(uint16 opc)
void dsp_opc_srr(uint16 opc)
{
- uint8 sreg = (opc >> 5) & 0x3;
- uint8 dreg = opc & 0x1f;
+ uint8 dreg = (opc >> 5) & 0x3;
+ uint8 sreg = opc & 0x1f;
- uint16 val = dsp_op_read_reg(dreg);
- dsp_dmem_write(g_dsp.r[sreg], val);
+ uint16 val = dsp_op_read_reg(sreg);
+ dsp_dmem_write(g_dsp.r[dreg], val);
- // post processing of source reg
+ // post processing of dest reg
switch ((opc >> 7) & 0x3)
{
case 0x0: // SRR
break;
case 0x1: // SRRD
- g_dsp.r[sreg]--;
+ g_dsp.r[dreg]--;
break;
case 0x2: // SRRI
- g_dsp.r[sreg]++;
+ g_dsp.r[dreg]++;
break;
case 0x3: // SRRX
- g_dsp.r[sreg] += g_dsp.r[sreg + 4];
+ g_dsp.r[dreg] += g_dsp.r[dreg + 4];
break;
}
}
@@ -530,7 +530,14 @@ void dsp_opc_clrp(uint16 opc)
// NEW
void dsp_opc_mulc(uint16 opc)
{
- ErrorLog("dsp_opc_mulc ni");
+ // math new prod
+ uint8 sreg = (opc >> 11) & 0x1;
+ uint8 treg = (opc >> 12) & 0x1;
+
+ sint64 prod = dsp_get_acc_m(sreg) * dsp_get_ax_h(treg) * GetMultiplyModifier();
+ dsp_set_long_prod(prod);
+
+ Update_SR_Register(prod);
}
@@ -1023,6 +1030,17 @@ void dsp_opc_subr(uint16 opc)
Update_SR_Register(acc);
}
+// NEW
+void dsp_opc_subax(uint16 opc)
+{
+ int regD = (opc >> 8) & 0x1;
+ int regT = (opc >> 9) & 0x1;
+
+ sint64 Acc = dsp_get_long_acc(regD) - dsp_get_long_acx(regT);
+
+ dsp_set_long_acc(regD, Acc);
+ Update_SR_Register(Acc);
+}
void dsp_opc_addis(uint16 opc)
{
@@ -1248,12 +1266,24 @@ void dsp_opc_mul(uint16 opc)
sint64 prod = (sint64)dsp_get_ax_h(sreg) * (sint64)dsp_get_ax_l(sreg) * GetMultiplyModifier();
dsp_set_long_prod(prod);
-}
+ Update_SR_Register(prod);
+}
+// NEW
void dsp_opc_mulac(uint16 opc)
{
- ErrorLog("Not implemented dsp_opc_mulac() (pc:0x%04x)\n", g_dsp.err_pc);
+ // add old prod to acc
+ uint8 rreg = (opc >> 8) & 0x1;
+ sint64 acR = dsp_get_long_acc(rreg) + dsp_get_long_prod();
+ dsp_set_long_acc(rreg, acR);
+
+ // math new prod
+ uint8 sreg = (opc >> 11) & 0x1;
+ sint64 prod = dsp_get_ax_l(sreg) * dsp_get_ax_h(sreg) * GetMultiplyModifier();
+ dsp_set_long_prod(prod);
+
+ Update_SR_Register(prod);
}
@@ -1272,6 +1302,8 @@ void dsp_opc_mulmv(uint16 opc)
prod = val1 * val2 * GetMultiplyModifier();
dsp_set_long_prod(prod);
+
+ Update_SR_Register(prod);
}
@@ -1289,6 +1321,8 @@ void dsp_opc_mulmvz(uint16 opc)
// math prod
prod = (sint64)g_dsp.r[0x18 + sreg] * (sint64)g_dsp.r[0x1a + sreg] * GetMultiplyModifier();
dsp_set_long_prod(prod);
+
+ Update_SR_Register(prod);
}
@@ -1303,6 +1337,8 @@ void dsp_opc_mulx(uint16 opc)
sint64 prod = val1 * val2 * GetMultiplyModifier();
dsp_set_long_prod(prod);
+
+ Update_SR_Register(prod);
}
@@ -1323,6 +1359,8 @@ void dsp_opc_mulxac(uint16 opc)
sint64 prod = val1 * val2 * GetMultiplyModifier();
dsp_set_long_prod(prod);
+
+ Update_SR_Register(prod);
}
@@ -1343,6 +1381,8 @@ void dsp_opc_mulxmv(uint16 opc)
sint64 prod = val1 * val2 * GetMultiplyModifier();
dsp_set_long_prod(prod);
+
+ Update_SR_Register(prod);
}
@@ -1364,6 +1404,8 @@ void dsp_opc_mulxmvz(uint16 opc)
prod = val1 * val2 * GetMultiplyModifier();
dsp_set_long_prod(prod);
+
+ Update_SR_Register(prod);
}
@@ -1836,13 +1878,20 @@ void dsp_op5(uint16 opc)
dsp_opc_subr(opc);
break;
+ case 0x8:
+ case 0x9:
+ case 0xa:
+ case 0xb:
+ dsp_opc_subax(opc);
+ break;
+
case 0xc:
case 0xd:
dsp_opc_sub(opc);
break;
default:
- ErrorLog("dsp_op5");
+ ErrorLog("dsp_op5: %x", (opc >> 8) & 0xf);
break;
}
diff --git a/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp b/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp
index ff1cb92a32..e5827fe3ac 100644
--- a/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp
+++ b/Source/Plugins/Plugin_DSP_LLE/Src/main.cpp
@@ -258,10 +258,10 @@ void DSP_Initialize(DSPInitialize _dspInitialize)
// --------------
// Dump UCode to file...
-/* FILE* t = fopen("C:\\_\\ct.txt", "wb");
+ FILE* t = fopen("C:\\_\\DSP_UC_09CD143F.txt", "wb");
gd_globals_t gdg;
- gd_dis_file(&gdg, "C:\\_\\DSP_UCode.bin", t);
- fclose(t); */
+ gd_dis_file(&gdg, "C:\\_\\DSP_UC_09CD143F.bin", t);
+ fclose(t);
// --------------
#ifdef _WIN32