mirror of https://github.com/PCSX2/pcsx2.git
iop: remove unused iPsxMem.cpp file
This commit is contained in:
parent
afdf5cdfe2
commit
52b4604d3b
|
@ -501,7 +501,6 @@ set(pcsx2x86Sources
|
||||||
x86/iFPUd.cpp
|
x86/iFPUd.cpp
|
||||||
x86/iMisc.cpp
|
x86/iMisc.cpp
|
||||||
x86/iMMI.cpp
|
x86/iMMI.cpp
|
||||||
x86/iPsxMem.cpp
|
|
||||||
x86/iR3000A.cpp
|
x86/iR3000A.cpp
|
||||||
x86/iR3000Atables.cpp
|
x86/iR3000Atables.cpp
|
||||||
x86/iR5900Misc.cpp
|
x86/iR5900Misc.cpp
|
||||||
|
|
|
@ -1,869 +0,0 @@
|
||||||
/* PCSX2 - PS2 Emulator for PCs
|
|
||||||
* Copyright (C) 2002-2009 PCSX2 Dev Team
|
|
||||||
*
|
|
||||||
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
|
|
||||||
* of the GNU Lesser General Public License as published by the Free Software Found-
|
|
||||||
* ation, either version 3 of the License, or (at your option) any later version.
|
|
||||||
*
|
|
||||||
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
|
|
||||||
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
||||||
* PURPOSE. See the GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License along with PCSX2.
|
|
||||||
* If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#include "PrecompiledHeader.h"
|
|
||||||
|
|
||||||
#include "IopCommon.h"
|
|
||||||
#include "iR3000A.h"
|
|
||||||
#include "VU.h"
|
|
||||||
|
|
||||||
|
|
||||||
extern int g_psxWriteOk;
|
|
||||||
extern u32 g_psxMaxRecMem;
|
|
||||||
static u32 writectrl;
|
|
||||||
|
|
||||||
#ifdef PCSX2_VIRTUAL_MEM
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
|
|
||||||
#define ASSERT_WRITEOK \
|
|
||||||
{ \
|
|
||||||
__asm cmp g_psxWriteOk, 1 \
|
|
||||||
__asm je WriteOk \
|
|
||||||
__asm int 10 \
|
|
||||||
} \
|
|
||||||
WriteOk: \
|
|
||||||
|
|
||||||
#else
|
|
||||||
#define ASSERT_WRITEOK
|
|
||||||
#endif
|
|
||||||
|
|
||||||
__declspec(naked) void psxRecMemRead8()
|
|
||||||
{
|
|
||||||
__asm {
|
|
||||||
mov edx, ecx
|
|
||||||
shr edx, 16
|
|
||||||
cmp dx, 0x1f80
|
|
||||||
je hwread
|
|
||||||
cmp dx, 0x1f40
|
|
||||||
je hw4read
|
|
||||||
cmp dx, 0x1000
|
|
||||||
je devread
|
|
||||||
cmp dx, 0x1f00
|
|
||||||
je spuread
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_WRITEOK
|
|
||||||
|
|
||||||
__asm {
|
|
||||||
memread:
|
|
||||||
// rom reads, has to be PS2MEM_BASE_
|
|
||||||
mov eax, dword ptr [ecx+PS2MEM_BASE_]
|
|
||||||
ret
|
|
||||||
|
|
||||||
hwread:
|
|
||||||
cmp cx, 0x1000
|
|
||||||
jb memread
|
|
||||||
|
|
||||||
push ecx
|
|
||||||
call psxHwRead8
|
|
||||||
add esp, 4
|
|
||||||
ret
|
|
||||||
|
|
||||||
hw4read:
|
|
||||||
push ecx
|
|
||||||
call psxHw4Read8
|
|
||||||
add esp, 4
|
|
||||||
ret
|
|
||||||
|
|
||||||
devread:
|
|
||||||
push ecx
|
|
||||||
call DEV9read8
|
|
||||||
// stack already incremented
|
|
||||||
ret
|
|
||||||
|
|
||||||
spuread:
|
|
||||||
push ecx
|
|
||||||
call SPU2read
|
|
||||||
// stack already incremented
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int psxRecMemConstRead8(u32 x86reg, u32 mem, u32 sign)
|
|
||||||
{
|
|
||||||
u32 t = (mem >> 16) & 0x1fff;
|
|
||||||
|
|
||||||
switch(t) {
|
|
||||||
case 0x1f80:
|
|
||||||
return psxHwConstRead8(x86reg, mem&0x1fffffff, sign);
|
|
||||||
|
|
||||||
#ifdef _DEBUG
|
|
||||||
case 0x1d00: assert(0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
case 0x1f40:
|
|
||||||
return psxHw4ConstRead8(x86reg, mem&0x1fffffff, sign);
|
|
||||||
|
|
||||||
case 0x1000:
|
|
||||||
xPUSH(mem&0x1fffffff);
|
|
||||||
xCALL((void*)(uptr)DEV9read8);
|
|
||||||
if( sign ) xMOVSX(xRegister32(x86reg), al);
|
|
||||||
else xMOVZX(xRegister32(x86reg), al);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
default:
|
|
||||||
_eeReadConstMem8(x86reg, (u32)PSXM(mem), sign);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__declspec(naked) void psxRecMemRead16()
|
|
||||||
{
|
|
||||||
__asm {
|
|
||||||
mov edx, ecx
|
|
||||||
shr edx, 16
|
|
||||||
cmp dx, 0x1f80
|
|
||||||
je hwread
|
|
||||||
cmp dx, 0x1f90
|
|
||||||
je spuread
|
|
||||||
cmp dx, 0x1d00
|
|
||||||
je sifread
|
|
||||||
cmp dx, 0x1000
|
|
||||||
je devread
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_WRITEOK
|
|
||||||
|
|
||||||
__asm {
|
|
||||||
memread:
|
|
||||||
// rom reads, has to be PS2MEM_BASE_
|
|
||||||
mov eax, dword ptr [ecx+PS2MEM_BASE_]
|
|
||||||
ret
|
|
||||||
|
|
||||||
hwread:
|
|
||||||
cmp cx, 0x1000
|
|
||||||
jb memread
|
|
||||||
|
|
||||||
push ecx
|
|
||||||
call psxHwRead16
|
|
||||||
add esp, 4
|
|
||||||
ret
|
|
||||||
|
|
||||||
sifread:
|
|
||||||
mov edx, ecx
|
|
||||||
and edx, 0xf0
|
|
||||||
cmp dl, 0x60
|
|
||||||
je Sif60
|
|
||||||
|
|
||||||
|
|
||||||
mov eax, dword ptr [edx+PS2MEM_BASE_+0x1000f200]
|
|
||||||
|
|
||||||
cmp dl, 0x40
|
|
||||||
jne End
|
|
||||||
|
|
||||||
// 0x40
|
|
||||||
or eax, 2
|
|
||||||
jmp End
|
|
||||||
Sif60:
|
|
||||||
xor eax, eax
|
|
||||||
jmp End
|
|
||||||
|
|
||||||
spuread:
|
|
||||||
push ecx
|
|
||||||
call SPU2read
|
|
||||||
// stack already incremented
|
|
||||||
|
|
||||||
End:
|
|
||||||
ret
|
|
||||||
|
|
||||||
devread:
|
|
||||||
push ecx
|
|
||||||
call DEV9read16
|
|
||||||
// stack already incremented
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int psxRecMemConstRead16(u32 x86reg, u32 mem, u32 sign)
|
|
||||||
{
|
|
||||||
u32 t = (mem >> 16) & 0x1fff;
|
|
||||||
|
|
||||||
switch(t) {
|
|
||||||
case 0x1f80: return psxHwConstRead16(x86reg, mem&0x1fffffff, sign);
|
|
||||||
|
|
||||||
case 0x1d00:
|
|
||||||
|
|
||||||
switch(mem & 0xF0)
|
|
||||||
{
|
|
||||||
case 0x40:
|
|
||||||
_eeReadConstMem16(x86reg, (u32)PS2MEM_HW+0xF240, sign);
|
|
||||||
xOR(xRegister32(x86reg), 0x0002);
|
|
||||||
break;
|
|
||||||
case 0x60:
|
|
||||||
xXOR(xRegister32(x86reg), xRegister32(x86reg));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
_eeReadConstMem16(x86reg, (u32)PS2MEM_HW+0xf200+(mem&0xf0), sign);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1f90:
|
|
||||||
xPUSH(mem&0x1fffffff);
|
|
||||||
xCALL((void*)(uptr)SPU2read);
|
|
||||||
if( sign ) xMOVSX(xRegister32(x86reg), ax);
|
|
||||||
else xMOVZX(xRegister32(x86reg), ax);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1000:
|
|
||||||
xPUSH(mem&0x1fffffff);
|
|
||||||
xCALL((void*)(uptr)DEV9read16);
|
|
||||||
if( sign ) xMOVSX(xRegister32(x86reg), ax);
|
|
||||||
else xMOVZX(xRegister32(x86reg), ax);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
default:
|
|
||||||
assert( g_psxWriteOk );
|
|
||||||
_eeReadConstMem16(x86reg, (u32)PSXM(mem), sign);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
__declspec(naked) void psxRecMemRead32()
|
|
||||||
{
|
|
||||||
__asm {
|
|
||||||
mov edx, ecx
|
|
||||||
shr edx, 16
|
|
||||||
cmp dx, 0x1f80
|
|
||||||
je hwread
|
|
||||||
cmp dx, 0x1d00
|
|
||||||
je sifread
|
|
||||||
cmp dx, 0x1000
|
|
||||||
je devread
|
|
||||||
cmp ecx, 0x1ffe0130
|
|
||||||
je WriteCtrlRead
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_WRITEOK
|
|
||||||
|
|
||||||
__asm {
|
|
||||||
memread:
|
|
||||||
// rom reads, has to be PS2MEM_BASE_
|
|
||||||
mov eax, dword ptr [ecx+PS2MEM_BASE_]
|
|
||||||
ret
|
|
||||||
|
|
||||||
hwread:
|
|
||||||
cmp cx, 0x1000
|
|
||||||
jb memread
|
|
||||||
|
|
||||||
push ecx
|
|
||||||
call psxHwRead32
|
|
||||||
add esp, 4
|
|
||||||
ret
|
|
||||||
|
|
||||||
sifread:
|
|
||||||
mov edx, ecx
|
|
||||||
and edx, 0xf0
|
|
||||||
cmp dl, 0x60
|
|
||||||
je Sif60
|
|
||||||
|
|
||||||
// do the read from ps2 mem
|
|
||||||
mov eax, dword ptr [edx+PS2MEM_BASE_+0x1000f200]
|
|
||||||
|
|
||||||
cmp dl, 0x40
|
|
||||||
jne End
|
|
||||||
|
|
||||||
// 0x40
|
|
||||||
or eax, 0xf0000002
|
|
||||||
jmp End
|
|
||||||
Sif60:
|
|
||||||
xor eax, eax
|
|
||||||
End:
|
|
||||||
ret
|
|
||||||
|
|
||||||
devread:
|
|
||||||
push ecx
|
|
||||||
call DEV9read32
|
|
||||||
// stack already incremented
|
|
||||||
ret
|
|
||||||
|
|
||||||
WriteCtrlRead:
|
|
||||||
mov eax, writectrl
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int psxRecMemConstRead32(u32 x86reg, u32 mem)
|
|
||||||
{
|
|
||||||
u32 t = (mem >> 16) & 0x1fff;
|
|
||||||
|
|
||||||
switch(t) {
|
|
||||||
case 0x1f80: return psxHwConstRead32(x86reg, mem&0x1fffffff);
|
|
||||||
|
|
||||||
case 0x1d00:
|
|
||||||
switch(mem & 0xF0)
|
|
||||||
{
|
|
||||||
case 0x40:
|
|
||||||
_eeReadConstMem32(x86reg, (u32)PS2MEM_HW+0xF240);
|
|
||||||
xOR(xRegister32(x86reg), 0xf0000002);
|
|
||||||
break;
|
|
||||||
case 0x60:
|
|
||||||
xXOR(xRegister32(x86reg), xRegister32(x86reg));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
_eeReadConstMem32(x86reg, (u32)PS2MEM_HW+0xf200+(mem&0xf0));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1000:
|
|
||||||
xPUSH(mem&0x1fffffff);
|
|
||||||
xCALL((void*)(uptr)DEV9read32);
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
default:
|
|
||||||
if( mem == 0xfffe0130 )
|
|
||||||
xMOV(xRegister32(x86reg), ptr[&writectrl]);
|
|
||||||
else {
|
|
||||||
xXOR(xRegister32(x86reg), xRegister32(x86reg));
|
|
||||||
xCMP(ptr32[&g_psxWriteOk], 0);
|
|
||||||
CMOVNE32MtoR(x86reg, (u32)PSXM(mem));
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__declspec(naked) void psxRecMemWrite8()
|
|
||||||
{
|
|
||||||
__asm {
|
|
||||||
mov edx, ecx
|
|
||||||
shr edx, 16
|
|
||||||
cmp dx, 0x1f80
|
|
||||||
je hwwrite
|
|
||||||
cmp dx, 0x1f40
|
|
||||||
je hw4write
|
|
||||||
cmp dx, 0x1000
|
|
||||||
je devwrite
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_WRITEOK
|
|
||||||
|
|
||||||
__asm {
|
|
||||||
memwrite:
|
|
||||||
// rom writes, has to be PS2MEM_BASE_
|
|
||||||
mov byte ptr [ecx+PS2MEM_BASE_], al
|
|
||||||
ret
|
|
||||||
|
|
||||||
hwwrite:
|
|
||||||
cmp cx, 0x1000
|
|
||||||
jb memwrite
|
|
||||||
|
|
||||||
push eax
|
|
||||||
push ecx
|
|
||||||
call psxHwWrite8
|
|
||||||
add esp, 8
|
|
||||||
ret
|
|
||||||
|
|
||||||
hw4write:
|
|
||||||
push eax
|
|
||||||
push ecx
|
|
||||||
call psxHw4Write8
|
|
||||||
add esp, 8
|
|
||||||
ret
|
|
||||||
|
|
||||||
devwrite:
|
|
||||||
push eax
|
|
||||||
push ecx
|
|
||||||
call DEV9write8
|
|
||||||
// stack alwritey incremented
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int psxRecMemConstWrite8(u32 mem, int mmreg)
|
|
||||||
{
|
|
||||||
u32 t = (mem >> 16) & 0x1fff;
|
|
||||||
|
|
||||||
switch(t) {
|
|
||||||
case 0x1f80:
|
|
||||||
psxHwConstWrite8(mem&0x1fffffff, mmreg);
|
|
||||||
return 0;
|
|
||||||
case 0x1f40:
|
|
||||||
psxHw4ConstWrite8(mem&0x1fffffff, mmreg);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1d00:
|
|
||||||
assert(0);
|
|
||||||
_eeWriteConstMem8((u32)(PS2MEM_HW+0xf200+(mem&0xff)), mmreg);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1000:
|
|
||||||
_recPushReg(mmreg);
|
|
||||||
xPUSH(mem&0x1fffffff);
|
|
||||||
xCALL((void*)(uptr)DEV9write8);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
default:
|
|
||||||
_eeWriteConstMem8((u32)PSXM(mem), mmreg);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__declspec(naked) void psxRecMemWrite16()
|
|
||||||
{
|
|
||||||
__asm {
|
|
||||||
mov edx, ecx
|
|
||||||
shr edx, 16
|
|
||||||
cmp dx, 0x1f80
|
|
||||||
je hwwrite
|
|
||||||
cmp dx, 0x1f90
|
|
||||||
je spuwrite
|
|
||||||
cmp dx, 0x1d00
|
|
||||||
je sifwrite
|
|
||||||
cmp dx, 0x1000
|
|
||||||
je devwrite
|
|
||||||
cmp dx, 0x1600
|
|
||||||
je ignorewrite
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT_WRITEOK
|
|
||||||
|
|
||||||
__asm {
|
|
||||||
memwrite:
|
|
||||||
// rom writes, has to be PS2MEM_BASE_
|
|
||||||
mov word ptr [ecx+PS2MEM_BASE_], ax
|
|
||||||
ret
|
|
||||||
|
|
||||||
hwwrite:
|
|
||||||
cmp cx, 0x1000
|
|
||||||
jb memwrite
|
|
||||||
|
|
||||||
push eax
|
|
||||||
push ecx
|
|
||||||
call psxHwWrite16
|
|
||||||
add esp, 8
|
|
||||||
ret
|
|
||||||
|
|
||||||
sifwrite:
|
|
||||||
mov edx, ecx
|
|
||||||
and edx, 0xf0
|
|
||||||
cmp dl, 0x60
|
|
||||||
je Sif60
|
|
||||||
cmp dl, 0x40
|
|
||||||
je Sif40
|
|
||||||
|
|
||||||
mov word ptr [edx+PS2MEM_BASE_+0x1000f200], ax
|
|
||||||
ret
|
|
||||||
|
|
||||||
Sif40:
|
|
||||||
mov bx, word ptr [edx+PS2MEM_BASE_+0x1000f200]
|
|
||||||
test ax, 0xa0
|
|
||||||
jz Sif40_2
|
|
||||||
// psHu16(0x1000F240) &= ~0xF000;
|
|
||||||
// psHu16(0x1000F240) |= 0x2000;
|
|
||||||
and bx, 0x0fff
|
|
||||||
or bx, 0x2000
|
|
||||||
|
|
||||||
Sif40_2:
|
|
||||||
// if(psHu16(0x1000F240) & temp) psHu16(0x1000F240) &= ~temp;
|
|
||||||
// else psHu16(0x1000F240) |= temp;
|
|
||||||
and ax, 0xf0
|
|
||||||
test bx, ax
|
|
||||||
jz Sif40_3
|
|
||||||
|
|
||||||
not ax
|
|
||||||
and bx, ax
|
|
||||||
jmp Sif40_4
|
|
||||||
Sif40_3:
|
|
||||||
or bx, ax
|
|
||||||
Sif40_4:
|
|
||||||
mov word ptr [edx+PS2MEM_BASE_+0x1000f200], bx
|
|
||||||
ret
|
|
||||||
|
|
||||||
Sif60:
|
|
||||||
mov word ptr [edx+PS2MEM_BASE_+0x1000f200], 0
|
|
||||||
ret
|
|
||||||
|
|
||||||
spuwrite:
|
|
||||||
push eax
|
|
||||||
push ecx
|
|
||||||
call SPU2write
|
|
||||||
// stack alwritey incremented
|
|
||||||
ret
|
|
||||||
|
|
||||||
devwrite:
|
|
||||||
push eax
|
|
||||||
push ecx
|
|
||||||
call DEV9write16
|
|
||||||
// stack alwritey incremented
|
|
||||||
ret
|
|
||||||
|
|
||||||
ignorewrite:
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int psxRecMemConstWrite16(u32 mem, int mmreg)
|
|
||||||
{
|
|
||||||
u32 t = (mem >> 16) & 0x1fff;
|
|
||||||
switch(t) {
|
|
||||||
case 0x1600:
|
|
||||||
//HACK: DEV9 VM crash fix
|
|
||||||
return 0;
|
|
||||||
case 0x1f80:
|
|
||||||
psxHwConstWrite16(mem&0x1fffffff, mmreg);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1d00:
|
|
||||||
switch (mem & 0xf0) {
|
|
||||||
case 0x10:
|
|
||||||
// write to ps2 mem
|
|
||||||
_eeWriteConstMem16((u32)(PS2MEM_HW+0xf210), mmreg);
|
|
||||||
return 0;
|
|
||||||
case 0x40:
|
|
||||||
{
|
|
||||||
// delete x86reg
|
|
||||||
_eeMoveMMREGtoR(EAX, mmreg);
|
|
||||||
|
|
||||||
assert( mmreg != EBX );
|
|
||||||
xMOV(bx, ptr[(void*)((u32)PS2MEM_HW+0xf240)]);
|
|
||||||
xTEST(ax, 0xa0);
|
|
||||||
j8Ptr[0] = JZ8(0);
|
|
||||||
|
|
||||||
xAND(bx, 0x0fff);
|
|
||||||
xOR(bx, 0x2000);
|
|
||||||
|
|
||||||
x86SetJ8(j8Ptr[0]);
|
|
||||||
|
|
||||||
xAND(ax, 0xf0);
|
|
||||||
xTEST(ax, xRegister16(0xf0));
|
|
||||||
j8Ptr[0] = JZ8(0);
|
|
||||||
|
|
||||||
xNOT(eax);
|
|
||||||
xAND(bx, ax);
|
|
||||||
j8Ptr[1] = JMP8(0);
|
|
||||||
|
|
||||||
x86SetJ8(j8Ptr[0]);
|
|
||||||
xOR(bx, ax);
|
|
||||||
|
|
||||||
x86SetJ8(j8Ptr[1]);
|
|
||||||
|
|
||||||
xMOV(ptr[(void*)((u32)PS2MEM_HW+0xf240)], bx);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
case 0x60:
|
|
||||||
xMOV(ptr32[(u32*)((u32)(PS2MEM_HW+0xf260))], 0);
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1f90:
|
|
||||||
_recPushReg(mmreg);
|
|
||||||
xPUSH(mem&0x1fffffff);
|
|
||||||
xCALL((void*)(uptr)SPU2write);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1000:
|
|
||||||
_recPushReg(mmreg);
|
|
||||||
xPUSH(mem&0x1fffffff);
|
|
||||||
xCALL((void*)(uptr)DEV9write16);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
default:
|
|
||||||
_eeWriteConstMem16((u32)PSXM(mem), mmreg);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__declspec(naked) void psxRecMemWrite32()
|
|
||||||
{
|
|
||||||
__asm {
|
|
||||||
mov edx, ecx
|
|
||||||
shr edx, 16
|
|
||||||
cmp dx, 0x1f80
|
|
||||||
je hwwrite
|
|
||||||
cmp dx, 0x1d00
|
|
||||||
je sifwrite
|
|
||||||
cmp dx, 0x1000
|
|
||||||
je devwrite
|
|
||||||
cmp dx, 0x1ffe
|
|
||||||
je WriteCtrl
|
|
||||||
}
|
|
||||||
|
|
||||||
__asm {
|
|
||||||
// rom writes, has to be PS2MEM_BASE_
|
|
||||||
test g_psxWriteOk, 1
|
|
||||||
jz endwrite
|
|
||||||
|
|
||||||
memwrite:
|
|
||||||
mov dword ptr [ecx+PS2MEM_BASE_], eax
|
|
||||||
endwrite:
|
|
||||||
ret
|
|
||||||
|
|
||||||
hwwrite:
|
|
||||||
cmp cx, 0x1000
|
|
||||||
jb memwrite
|
|
||||||
|
|
||||||
push eax
|
|
||||||
push ecx
|
|
||||||
call psxHwWrite32
|
|
||||||
add esp, 8
|
|
||||||
ret
|
|
||||||
|
|
||||||
sifwrite:
|
|
||||||
mov edx, ecx
|
|
||||||
and edx, 0xf0
|
|
||||||
cmp dl, 0x60
|
|
||||||
je Sif60
|
|
||||||
cmp dl, 0x40
|
|
||||||
je Sif40
|
|
||||||
cmp dl, 0x30
|
|
||||||
je Sif30
|
|
||||||
cmp dl, 0x20
|
|
||||||
je Sif20
|
|
||||||
|
|
||||||
mov dword ptr [edx+PS2MEM_BASE_+0x1000f200], eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
Sif40:
|
|
||||||
mov bx, word ptr [edx+PS2MEM_BASE_+0x1000f200]
|
|
||||||
test ax, 0xa0
|
|
||||||
jz Sif40_2
|
|
||||||
// psHu16(0x1000F240) &= ~0xF000;
|
|
||||||
// psHu16(0x1000F240) |= 0x2000;
|
|
||||||
and bx, 0x0fff
|
|
||||||
or bx, 0x2000
|
|
||||||
|
|
||||||
Sif40_2:
|
|
||||||
// if(psHu16(0x1000F240) & temp) psHu16(0x1000F240) &= ~temp;
|
|
||||||
// else psHu16(0x1000F240) |= temp;
|
|
||||||
and ax, 0xf0
|
|
||||||
test bx, ax
|
|
||||||
jz Sif40_3
|
|
||||||
|
|
||||||
not ax
|
|
||||||
and bx, ax
|
|
||||||
jmp Sif40_4
|
|
||||||
Sif40_3:
|
|
||||||
or bx, ax
|
|
||||||
Sif40_4:
|
|
||||||
mov word ptr [edx+PS2MEM_BASE_+0x1000f200], bx
|
|
||||||
ret
|
|
||||||
|
|
||||||
Sif30:
|
|
||||||
or dword ptr [edx+PS2MEM_BASE_+0x1000f200], eax
|
|
||||||
ret
|
|
||||||
Sif20:
|
|
||||||
not eax
|
|
||||||
and dword ptr [edx+PS2MEM_BASE_+0x1000f200], eax
|
|
||||||
ret
|
|
||||||
Sif60:
|
|
||||||
mov dword ptr [edx+PS2MEM_BASE_+0x1000f200], 0
|
|
||||||
ret
|
|
||||||
|
|
||||||
devwrite:
|
|
||||||
push eax
|
|
||||||
push ecx
|
|
||||||
call DEV9write32
|
|
||||||
// stack alwritey incremented
|
|
||||||
ret
|
|
||||||
|
|
||||||
WriteCtrl:
|
|
||||||
cmp ecx, 0x1ffe0130
|
|
||||||
jne End
|
|
||||||
|
|
||||||
mov writectrl, eax
|
|
||||||
|
|
||||||
cmp eax, 0x800
|
|
||||||
je SetWriteNotOk
|
|
||||||
cmp eax, 0x804
|
|
||||||
je SetWriteNotOk
|
|
||||||
cmp eax, 0xc00
|
|
||||||
je SetWriteNotOk
|
|
||||||
cmp eax, 0xc04
|
|
||||||
je SetWriteNotOk
|
|
||||||
cmp eax, 0xcc0
|
|
||||||
je SetWriteNotOk
|
|
||||||
cmp eax, 0xcc4
|
|
||||||
je SetWriteNotOk
|
|
||||||
cmp eax, 0x0c4
|
|
||||||
je SetWriteNotOk
|
|
||||||
|
|
||||||
// test ok
|
|
||||||
cmp eax, 0x1e988
|
|
||||||
je SetWriteOk
|
|
||||||
cmp eax, 0x1edd8
|
|
||||||
je SetWriteOk
|
|
||||||
|
|
||||||
End:
|
|
||||||
ret
|
|
||||||
|
|
||||||
SetWriteNotOk:
|
|
||||||
mov g_psxWriteOk, 0
|
|
||||||
ret
|
|
||||||
SetWriteOk:
|
|
||||||
mov g_psxWriteOk, 1
|
|
||||||
ret
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int psxRecMemConstWrite32(u32 mem, int mmreg)
|
|
||||||
{
|
|
||||||
u32 t = (mem >> 16) & 0x1fff;
|
|
||||||
switch(t) {
|
|
||||||
case 0x1f80:
|
|
||||||
psxHwConstWrite32(mem&0x1fffffff, mmreg);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1d00:
|
|
||||||
switch (mem & 0xf0) {
|
|
||||||
case 0x10:
|
|
||||||
// write to ps2 mem
|
|
||||||
_eeWriteConstMem32((u32)PS2MEM_HW+0xf210, mmreg);
|
|
||||||
return 0;
|
|
||||||
case 0x20:
|
|
||||||
// write to ps2 mem
|
|
||||||
// delete x86reg
|
|
||||||
if( IS_PSXCONSTREG(mmreg) ) {
|
|
||||||
xAND(ptr32[(u32*)((u32)PS2MEM_HW+0xf220)], ~g_psxConstRegs[(mmreg>>16)&0x1f]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
xNOT(xRegister32(mmreg));
|
|
||||||
xAND(ptr[(void*)((u32)PS2MEM_HW+0xf220)], xRegister32(mmreg));
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
case 0x30:
|
|
||||||
// write to ps2 mem
|
|
||||||
_eeWriteConstMem32OP((u32)PS2MEM_HW+0xf230, mmreg, 1);
|
|
||||||
return 0;
|
|
||||||
case 0x40:
|
|
||||||
{
|
|
||||||
// delete x86reg
|
|
||||||
assert( mmreg != EBX );
|
|
||||||
|
|
||||||
_eeMoveMMREGtoR(EAX, mmreg);
|
|
||||||
|
|
||||||
xMOV(bx, ptr[(void*)((u32)PS2MEM_HW+0xf240)]);
|
|
||||||
xTEST(ax, 0xa0);
|
|
||||||
j8Ptr[0] = JZ8(0);
|
|
||||||
|
|
||||||
xAND(bx, 0x0fff);
|
|
||||||
xOR(bx, 0x2000);
|
|
||||||
|
|
||||||
x86SetJ8(j8Ptr[0]);
|
|
||||||
|
|
||||||
xAND(ax, 0xf0);
|
|
||||||
xTEST(ax, xRegister16(0xf0));
|
|
||||||
j8Ptr[0] = JZ8(0);
|
|
||||||
|
|
||||||
xNOT(eax);
|
|
||||||
xAND(bx, ax);
|
|
||||||
j8Ptr[1] = JMP8(0);
|
|
||||||
|
|
||||||
x86SetJ8(j8Ptr[0]);
|
|
||||||
xOR(bx, ax);
|
|
||||||
|
|
||||||
x86SetJ8(j8Ptr[1]);
|
|
||||||
|
|
||||||
xMOV(ptr[(void*)((u32)PS2MEM_HW+0xf240)], bx);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
case 0x60:
|
|
||||||
xMOV(ptr32[(u32*)((u32)(PS2MEM_HW+0xf260))], 0);
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1000:
|
|
||||||
_recPushReg(mmreg);
|
|
||||||
xPUSH(mem&0x1fffffff);
|
|
||||||
xCALL((void*)(uptr)DEV9write32);
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
case 0x1ffe:
|
|
||||||
if( mem == 0xfffe0130 ) {
|
|
||||||
u8* ptrs[9];
|
|
||||||
|
|
||||||
_eeWriteConstMem32((uptr)&writectrl, mmreg);
|
|
||||||
|
|
||||||
if( IS_PSXCONSTREG(mmreg) ) {
|
|
||||||
switch (g_psxConstRegs[(mmreg>>16)&0x1f]) {
|
|
||||||
case 0x800: case 0x804:
|
|
||||||
case 0xc00: case 0xc04:
|
|
||||||
case 0xcc0: case 0xcc4:
|
|
||||||
case 0x0c4:
|
|
||||||
xMOV(ptr32[&g_psxWriteOk], 0);
|
|
||||||
break;
|
|
||||||
case 0x1e988:
|
|
||||||
case 0x1edd8:
|
|
||||||
xMOV(ptr32[&g_psxWriteOk], 1);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// not ok
|
|
||||||
xCMP(xRegister32(mmreg), 0x800);
|
|
||||||
ptrs[0] = JE8(0);
|
|
||||||
xCMP(xRegister32(mmreg), 0x804);
|
|
||||||
ptrs[1] = JE8(0);
|
|
||||||
xCMP(xRegister32(mmreg), 0xc00);
|
|
||||||
ptrs[2] = JE8(0);
|
|
||||||
xCMP(xRegister32(mmreg), 0xc04);
|
|
||||||
ptrs[3] = JE8(0);
|
|
||||||
xCMP(xRegister32(mmreg), 0xcc0);
|
|
||||||
ptrs[4] = JE8(0);
|
|
||||||
xCMP(xRegister32(mmreg), 0xcc4);
|
|
||||||
ptrs[5] = JE8(0);
|
|
||||||
xCMP(xRegister32(mmreg), 0x0c4);
|
|
||||||
ptrs[6] = JE8(0);
|
|
||||||
|
|
||||||
// ok
|
|
||||||
xCMP(xRegister32(mmreg), 0x1e988);
|
|
||||||
ptrs[7] = JE8(0);
|
|
||||||
xCMP(xRegister32(mmreg), 0x1edd8);
|
|
||||||
ptrs[8] = JE8(0);
|
|
||||||
|
|
||||||
x86SetJ8(ptrs[0]);
|
|
||||||
x86SetJ8(ptrs[1]);
|
|
||||||
x86SetJ8(ptrs[2]);
|
|
||||||
x86SetJ8(ptrs[3]);
|
|
||||||
x86SetJ8(ptrs[4]);
|
|
||||||
x86SetJ8(ptrs[5]);
|
|
||||||
x86SetJ8(ptrs[6]);
|
|
||||||
xMOV(ptr32[&g_psxWriteOk], 0);
|
|
||||||
ptrs[0] = JMP8(0);
|
|
||||||
|
|
||||||
x86SetJ8(ptrs[7]);
|
|
||||||
x86SetJ8(ptrs[8]);
|
|
||||||
xMOV(ptr32[&g_psxWriteOk], 1);
|
|
||||||
|
|
||||||
x86SetJ8(ptrs[0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
default:
|
|
||||||
xTEST(ptr8[(u8*)((uptr)&g_psxWriteOk)], 1);
|
|
||||||
j8Ptr[0] = JZ8(0);
|
|
||||||
_eeWriteConstMem32((u32)PSXM(mem), mmreg);
|
|
||||||
x86SetJ8(j8Ptr[0]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in New Issue