mirror of
https://github.com/PCSX2/pcsx2.git
synced 2025-04-02 10:52:54 -04:00
git-svn-id: http://pcsx2.googlecode.com/svn/branches/pcsx2_0.9.4@186 96395faa-99c1-11dd-bbfe-3dabce05a288
1165 lines
26 KiB
C
1165 lines
26 KiB
C
/* Pcsx2 - Pc Ps2 Emulator
|
|
* Copyright (C) 2002-2005 Pcsx2 Team
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program 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 this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
// stop compiling if NORECBUILD build (only for Visual Studio)
|
|
#if !(defined(_MSC_VER) && defined(PCSX2_NORECBUILD))
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include "PsxCommon.h"
|
|
#include "iR5900.h"
|
|
|
|
extern int g_pbufi;
|
|
extern s8 g_pbuf[1024];
|
|
|
|
#define CONSTREAD8_CALL(name) { \
|
|
iFlushCall(0); \
|
|
CALLFunc((uptr)name); \
|
|
if( sign ) MOVSX32R8toR(EAX, EAX); \
|
|
else MOVZX32R8toR(EAX, EAX); \
|
|
} \
|
|
|
|
static u32 s_16 = 0x10;
|
|
|
|
int psxHwConstRead8(u32 x86reg, u32 add, u32 sign) {
|
|
|
|
if (add >= 0x1f801600 && add < 0x1f801700) {
|
|
PUSH32I(add);
|
|
CONSTREAD8_CALL(USBread8);
|
|
// since calling from different dll, esp already changed
|
|
return 1;
|
|
}
|
|
|
|
switch (add) {
|
|
case 0x1f801040:
|
|
CONSTREAD8_CALL(sioRead8);
|
|
return 1;
|
|
// case 0x1f801050: hard = serial_read8(); break;//for use of serial port ignore for now
|
|
|
|
#ifdef PCSX2_DEVBUILD
|
|
case 0x1f801100:
|
|
case 0x1f801104:
|
|
case 0x1f801108:
|
|
case 0x1f801110:
|
|
case 0x1f801114:
|
|
case 0x1f801118:
|
|
case 0x1f801120:
|
|
case 0x1f801124:
|
|
case 0x1f801128:
|
|
case 0x1f801480:
|
|
case 0x1f801484:
|
|
case 0x1f801488:
|
|
case 0x1f801490:
|
|
case 0x1f801494:
|
|
case 0x1f801498:
|
|
case 0x1f8014a0:
|
|
case 0x1f8014a4:
|
|
case 0x1f8014a8:
|
|
SysPrintf("8bit counter read %x\n", add);
|
|
_eeReadConstMem8(x86reg, (uptr)&psxH[(add) & 0xffff], sign);
|
|
return 0;
|
|
#endif
|
|
|
|
case 0x1f80146e: // DEV9_R_REV
|
|
PUSH32I(add);
|
|
CONSTREAD8_CALL(DEV9read8);
|
|
return 1;
|
|
|
|
case 0x1f801800: CONSTREAD8_CALL(cdrRead0); return 1;
|
|
case 0x1f801801: CONSTREAD8_CALL(cdrRead1); return 1;
|
|
case 0x1f801802: CONSTREAD8_CALL(cdrRead2); return 1;
|
|
case 0x1f801803: CONSTREAD8_CALL(cdrRead3); return 1;
|
|
|
|
case 0x1f803100: // PS/EE/IOP conf related
|
|
if( IS_XMMREG(x86reg) ) SSEX_MOVD_M32_to_XMM(x86reg&0xf, (uptr)&s_16);
|
|
MMXONLY(else if( IS_MMXREG(x86reg) ) MOVDMtoMMX(x86reg&0xf, (uptr)&s_16);)
|
|
else MOV32ItoR(x86reg, 0x10);
|
|
return 0;
|
|
|
|
case 0x1F808264: //sio2 serial data feed/fifo_out
|
|
CONSTREAD8_CALL(sio2_fifoOut);
|
|
return 1;
|
|
|
|
default:
|
|
_eeReadConstMem8(x86reg, (uptr)&psxH[(add) & 0xffff], sign);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
#define CONSTREAD16_CALL(name) { \
|
|
iFlushCall(0); \
|
|
CALLFunc((uptr)name); \
|
|
if( sign ) MOVSX32R16toR(EAX, EAX); \
|
|
else MOVZX32R16toR(EAX, EAX); \
|
|
} \
|
|
|
|
void psxConstReadCounterMode16(int x86reg, int index, int sign)
|
|
{
|
|
if( IS_MMXREG(x86reg) ) {
|
|
X86_64ASSERT();
|
|
MMXONLY(MOV16MtoR(ECX, (uptr)&psxCounters[index].mode);
|
|
MOVDMtoMMX(x86reg&0xf, (uptr)&psxCounters[index].mode - 2);)
|
|
}
|
|
else {
|
|
if( sign ) MOVSX32M16toR(ECX, (uptr)&psxCounters[index].mode);
|
|
else MOVZX32M16toR(ECX, (uptr)&psxCounters[index].mode);
|
|
|
|
MOV32RtoR(x86reg, ECX);
|
|
}
|
|
|
|
//AND16ItoR(ECX, ~0x1800);
|
|
//OR16ItoR(ECX, 0x400);
|
|
MOV16RtoM(psxCounters[index].mode, ECX);
|
|
}
|
|
|
|
int psxHwConstRead16(u32 x86reg, u32 add, u32 sign) {
|
|
if (add >= 0x1f801600 && add < 0x1f801700) {
|
|
PUSH32I(add);
|
|
CONSTREAD16_CALL(USBread16);
|
|
return 1;
|
|
}
|
|
|
|
switch (add) {
|
|
|
|
case 0x1f801040:
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sioRead8);
|
|
PUSHR(EAX);
|
|
CALLFunc((uptr)sioRead8);
|
|
POPR(ECX);
|
|
AND32ItoR(ECX, 0xff);
|
|
SHL32ItoR(EAX, 8);
|
|
OR32RtoR(EAX, ECX);
|
|
if( sign ) MOVSX32R16toR(EAX, EAX);
|
|
else MOVZX32R16toR(EAX, EAX);
|
|
return 1;
|
|
|
|
case 0x1f801044:
|
|
_eeReadConstMem16(x86reg, (uptr)&sio.StatReg, sign);
|
|
return 0;
|
|
|
|
case 0x1f801048:
|
|
_eeReadConstMem16(x86reg, (uptr)&sio.ModeReg, sign);
|
|
return 0;
|
|
|
|
case 0x1f80104a:
|
|
_eeReadConstMem16(x86reg, (uptr)&sio.CtrlReg, sign);
|
|
return 0;
|
|
|
|
case 0x1f80104e:
|
|
_eeReadConstMem16(x86reg, (uptr)&sio.BaudReg, sign);
|
|
return 0;
|
|
|
|
// counters[0]
|
|
case 0x1f801100:
|
|
PUSH32I(0);
|
|
CONSTREAD16_CALL(psxRcntRcount16);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
case 0x1f801104:
|
|
psxConstReadCounterMode16(x86reg, 0, sign);
|
|
return 0;
|
|
|
|
case 0x1f801108:
|
|
_eeReadConstMem16(x86reg, (uptr)&psxCounters[0].target, sign);
|
|
return 0;
|
|
|
|
// counters[1]
|
|
case 0x1f801110:
|
|
PUSH32I(1);
|
|
CONSTREAD16_CALL(psxRcntRcount16);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
case 0x1f801114:
|
|
psxConstReadCounterMode16(x86reg, 1, sign);
|
|
return 0;
|
|
|
|
case 0x1f801118:
|
|
_eeReadConstMem16(x86reg, (uptr)&psxCounters[1].target, sign);
|
|
return 0;
|
|
|
|
// counters[2]
|
|
case 0x1f801120:
|
|
PUSH32I(2);
|
|
CONSTREAD16_CALL(psxRcntRcount16);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
case 0x1f801124:
|
|
psxConstReadCounterMode16(x86reg, 2, sign);
|
|
return 0;
|
|
|
|
case 0x1f801128:
|
|
_eeReadConstMem16(x86reg, (uptr)&psxCounters[2].target, sign);
|
|
return 0;
|
|
|
|
case 0x1f80146e: // DEV9_R_REV
|
|
PUSH32I(add);
|
|
CONSTREAD16_CALL(DEV9read16);
|
|
return 1;
|
|
|
|
// counters[3]
|
|
case 0x1f801480:
|
|
PUSH32I(3);
|
|
CONSTREAD16_CALL(psxRcntRcount32);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
|
|
case 0x1f801484:
|
|
psxConstReadCounterMode16(x86reg, 3, sign);
|
|
return 0;
|
|
|
|
case 0x1f801488:
|
|
_eeReadConstMem16(x86reg, (uptr)&psxCounters[3].target, sign);
|
|
return 0;
|
|
|
|
// counters[4]
|
|
case 0x1f801490:
|
|
PUSH32I(4);
|
|
CONSTREAD16_CALL(psxRcntRcount32);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
|
|
case 0x1f801494:
|
|
psxConstReadCounterMode16(x86reg, 4, sign);
|
|
return 0;
|
|
|
|
case 0x1f801498:
|
|
_eeReadConstMem16(x86reg, (uptr)&psxCounters[4].target, sign);
|
|
return 0;
|
|
|
|
// counters[5]
|
|
case 0x1f8014a0:
|
|
PUSH32I(5);
|
|
CONSTREAD16_CALL(psxRcntRcount32);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
|
|
case 0x1f8014a4:
|
|
psxConstReadCounterMode16(x86reg, 5, sign);
|
|
return 0;
|
|
|
|
case 0x1f8014a8:
|
|
_eeReadConstMem16(x86reg, (uptr)&psxCounters[5].target, sign);
|
|
return 0;
|
|
|
|
default:
|
|
if (add>=0x1f801c00 && add<0x1f801e00) {
|
|
|
|
PUSH32I(add);
|
|
CONSTREAD16_CALL(SPU2read);
|
|
return 1;
|
|
} else {
|
|
_eeReadConstMem16(x86reg, (uptr)&psxH[(add) & 0xffff], sign);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
void psxConstReadCounterMode32(int x86reg, int index)
|
|
{
|
|
if( IS_MMXREG(x86reg) ) {
|
|
X86_64ASSERT();
|
|
MMXONLY(MOV16MtoR(ECX, (uptr)&psxCounters[index].mode);
|
|
MOVDMtoMMX(x86reg&0xf, (uptr)&psxCounters[index].mode);)
|
|
}
|
|
else {
|
|
MOVZX32M16toR(ECX, (uptr)&psxCounters[index].mode);
|
|
MOV32RtoR(x86reg, ECX);
|
|
}
|
|
|
|
//AND16ItoR(ECX, ~0x1800);
|
|
//OR16ItoR(ECX, 0x400);
|
|
MOV16RtoM(psxCounters[index].mode, ECX);
|
|
}
|
|
|
|
static u32 s_tempsio;
|
|
int psxHwConstRead32(u32 x86reg, u32 add) {
|
|
if (add >= 0x1f801600 && add < 0x1f801700) {
|
|
iFlushCall(0);
|
|
PUSH32I(add);
|
|
CALLFunc((uptr)USBread32);
|
|
return 1;
|
|
}
|
|
if (add >= 0x1f808400 && add <= 0x1f808550) {//the size is a complete guess..
|
|
iFlushCall(0);
|
|
PUSH32I(add);
|
|
CALLFunc((uptr)FWread32);
|
|
return 1;
|
|
}
|
|
|
|
switch (add) {
|
|
case 0x1f801040:
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sioRead8);
|
|
AND32ItoR(EAX, 0xff);
|
|
MOV32RtoM((uptr)&s_tempsio, EAX);
|
|
CALLFunc((uptr)sioRead8);
|
|
AND32ItoR(EAX, 0xff);
|
|
SHL32ItoR(EAX, 8);
|
|
OR32RtoM((uptr)&s_tempsio, EAX);
|
|
|
|
// 3rd
|
|
CALLFunc((uptr)sioRead8);
|
|
AND32ItoR(EAX, 0xff);
|
|
SHL32ItoR(EAX, 16);
|
|
OR32RtoM((uptr)&s_tempsio, EAX);
|
|
|
|
// 4th
|
|
CALLFunc((uptr)sioRead8);
|
|
SHL32ItoR(EAX, 24);
|
|
OR32MtoR(EAX, (uptr)&s_tempsio);
|
|
return 1;
|
|
|
|
//case 0x1f801050: hard = serial_read32(); break;//serial port
|
|
case 0x1f801078:
|
|
#ifdef PSXHW_LOG
|
|
PSXHW_LOG("ICTRL 32bit read %x\n", psxHu32(0x1078));
|
|
#endif
|
|
_eeReadConstMem32(x86reg, (uptr)&psxH[add&0xffff]);
|
|
MOV32ItoM((uptr)&psxH[add&0xffff], 0);
|
|
return 0;
|
|
|
|
// counters[0]
|
|
case 0x1f801100:
|
|
iFlushCall(0);
|
|
PUSH32I(0);
|
|
CALLFunc((uptr)psxRcntRcount16);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
case 0x1f801104:
|
|
psxConstReadCounterMode32(x86reg, 0);
|
|
return 0;
|
|
|
|
case 0x1f801108:
|
|
_eeReadConstMem32(x86reg, (uptr)&psxCounters[0].target);
|
|
return 0;
|
|
|
|
// counters[1]
|
|
case 0x1f801110:
|
|
iFlushCall(0);
|
|
PUSH32I(1);
|
|
CALLFunc((uptr)psxRcntRcount16);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
case 0x1f801114:
|
|
psxConstReadCounterMode32(x86reg, 1);
|
|
return 0;
|
|
|
|
case 0x1f801118:
|
|
_eeReadConstMem32(x86reg, (uptr)&psxCounters[1].target);
|
|
return 0;
|
|
|
|
// counters[2]
|
|
case 0x1f801120:
|
|
iFlushCall(0);
|
|
PUSH32I(2);
|
|
CALLFunc((uptr)psxRcntRcount16);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
case 0x1f801124:
|
|
psxConstReadCounterMode32(x86reg, 2);
|
|
return 0;
|
|
|
|
case 0x1f801128:
|
|
_eeReadConstMem32(x86reg, (uptr)&psxCounters[2].target);
|
|
return 0;
|
|
|
|
// counters[3]
|
|
case 0x1f801480:
|
|
iFlushCall(0);
|
|
PUSH32I(3);
|
|
CALLFunc((uptr)psxRcntRcount32);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
|
|
case 0x1f801484:
|
|
psxConstReadCounterMode32(x86reg, 3);
|
|
return 0;
|
|
|
|
case 0x1f801488:
|
|
_eeReadConstMem32(x86reg, (uptr)&psxCounters[3].target);
|
|
return 0;
|
|
|
|
// counters[4]
|
|
case 0x1f801490:
|
|
iFlushCall(0);
|
|
PUSH32I(4);
|
|
CALLFunc((uptr)psxRcntRcount32);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
|
|
case 0x1f801494:
|
|
psxConstReadCounterMode32(x86reg, 4);
|
|
return 0;
|
|
|
|
case 0x1f801498:
|
|
_eeReadConstMem32(x86reg, (uptr)&psxCounters[4].target);
|
|
return 0;
|
|
|
|
// counters[5]
|
|
case 0x1f8014a0:
|
|
iFlushCall(0);
|
|
PUSH32I(5);
|
|
CALLFunc((uptr)psxRcntRcount32);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
|
|
case 0x1f8014a4:
|
|
psxConstReadCounterMode32(x86reg, 5);
|
|
return 0;
|
|
|
|
case 0x1f8014a8:
|
|
_eeReadConstMem32(x86reg, (uptr)&psxCounters[5].target);
|
|
return 0;
|
|
|
|
case 0x1F808200:
|
|
case 0x1F808204:
|
|
case 0x1F808208:
|
|
case 0x1F80820C:
|
|
case 0x1F808210:
|
|
case 0x1F808214:
|
|
case 0x1F808218:
|
|
case 0x1F80821C:
|
|
case 0x1F808220:
|
|
case 0x1F808224:
|
|
case 0x1F808228:
|
|
case 0x1F80822C:
|
|
case 0x1F808230:
|
|
case 0x1F808234:
|
|
case 0x1F808238:
|
|
case 0x1F80823C:
|
|
iFlushCall(0);
|
|
PUSH32I((add-0x1F808200)/4);
|
|
CALLFunc((uptr)sio2_getSend3);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
|
|
case 0x1F808240:
|
|
case 0x1F808248:
|
|
case 0x1F808250:
|
|
case 0x1F80825C:
|
|
iFlushCall(0);
|
|
PUSH32I((add-0x1F808240)/8);
|
|
CALLFunc((uptr)sio2_getSend1);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
|
|
case 0x1F808244:
|
|
case 0x1F80824C:
|
|
case 0x1F808254:
|
|
case 0x1F808258:
|
|
iFlushCall(0);
|
|
PUSH32I((add-0x1F808244)/8);
|
|
CALLFunc((uptr)sio2_getSend2);
|
|
ADD32ItoR(ESP, 4);
|
|
return 1;
|
|
|
|
case 0x1F808268:
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sio2_getCtrl);
|
|
return 1;
|
|
|
|
case 0x1F80826C:
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sio2_getRecv1);
|
|
return 1;
|
|
|
|
case 0x1F808270:
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sio2_getRecv2);
|
|
return 1;
|
|
|
|
case 0x1F808274:
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sio2_getRecv3);
|
|
return 1;
|
|
|
|
case 0x1F808278:
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sio2_get8278);
|
|
return 1;
|
|
|
|
case 0x1F80827C:
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sio2_get827C);
|
|
return 1;
|
|
|
|
case 0x1F808280:
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sio2_getIntr);
|
|
return 1;
|
|
|
|
case 0x1F801C00:
|
|
iFlushCall(0);
|
|
PUSH32I(0);
|
|
CALLFunc((uptr)SPU2ReadMemAddr);
|
|
return 1;
|
|
|
|
case 0x1F801500:
|
|
iFlushCall(0);
|
|
PUSH32I(1);
|
|
CALLFunc((uptr)SPU2ReadMemAddr);
|
|
return 1;
|
|
|
|
default:
|
|
_eeReadConstMem32(x86reg, (uptr)&psxH[(add) & 0xffff]);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
#define CONSTWRITE_CALL(name) { \
|
|
_recPushReg(mmreg); \
|
|
iFlushCall(0); \
|
|
CALLFunc((uptr)name); \
|
|
ADD32ItoR(ESP, 4); \
|
|
} \
|
|
|
|
void Write8PrintBuffer(u8 value)
|
|
{
|
|
if (value == '\r') return;
|
|
if (value == '\n' || g_pbufi >= 1023) {
|
|
g_pbuf[g_pbufi++] = 0; g_pbufi = 0;
|
|
SysPrintf("%s\n", g_pbuf); return;
|
|
}
|
|
g_pbuf[g_pbufi++] = value;
|
|
}
|
|
|
|
void psxHwConstWrite8(u32 add, int mmreg)
|
|
{
|
|
if (add >= 0x1f801600 && add < 0x1f801700) {
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(add);
|
|
CALLFunc((uptr)USBwrite8);
|
|
return;
|
|
}
|
|
|
|
switch (add) {
|
|
case 0x1f801040:
|
|
CONSTWRITE_CALL(sioWrite8); break;
|
|
//case 0x1f801050: serial_write8(value); break;//serial port
|
|
case 0x1f801100:
|
|
case 0x1f801104:
|
|
case 0x1f801108:
|
|
case 0x1f801110:
|
|
case 0x1f801114:
|
|
case 0x1f801118:
|
|
case 0x1f801120:
|
|
case 0x1f801124:
|
|
case 0x1f801128:
|
|
case 0x1f801480:
|
|
case 0x1f801484:
|
|
case 0x1f801488:
|
|
case 0x1f801490:
|
|
case 0x1f801494:
|
|
case 0x1f801498:
|
|
case 0x1f8014a0:
|
|
case 0x1f8014a4:
|
|
case 0x1f8014a8:
|
|
SysPrintf("8bit counter write %x\n", add);
|
|
_eeWriteConstMem8((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
return;
|
|
case 0x1f801800: CONSTWRITE_CALL(cdrWrite0); break;
|
|
case 0x1f801801: CONSTWRITE_CALL(cdrWrite1); break;
|
|
case 0x1f801802: CONSTWRITE_CALL(cdrWrite2); break;
|
|
case 0x1f801803: CONSTWRITE_CALL(cdrWrite3); break;
|
|
case 0x1f80380c: CONSTWRITE_CALL(Write8PrintBuffer); break;
|
|
case 0x1F808260: CONSTWRITE_CALL(sio2_serialIn); break;
|
|
|
|
default:
|
|
_eeWriteConstMem8((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
return;
|
|
}
|
|
}
|
|
|
|
void psxHwConstWrite16(u32 add, int mmreg) {
|
|
if (add >= 0x1f801600 && add < 0x1f801700) {
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(add);
|
|
CALLFunc((uptr)USBwrite16);
|
|
return;
|
|
}
|
|
|
|
switch (add) {
|
|
case 0x1f801040:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sioWrite8);
|
|
ADD32ItoR(ESP, 1);
|
|
CALLFunc((uptr)sioWrite8);
|
|
ADD32ItoR(ESP, 3);
|
|
return;
|
|
case 0x1f801044:
|
|
return;
|
|
case 0x1f801048:
|
|
_eeWriteConstMem16((uptr)&sio.ModeReg, mmreg);
|
|
return;
|
|
case 0x1f80104a: // control register
|
|
CONSTWRITE_CALL(sioWriteCtrl16);
|
|
return;
|
|
case 0x1f80104e: // baudrate register
|
|
_eeWriteConstMem16((uptr)&sio.BaudReg, mmreg);
|
|
return;
|
|
|
|
case 0x1f801070:
|
|
_eeWriteConstMem16OP((uptr)&psxH[(add) & 0xffff], mmreg, 0);
|
|
return;
|
|
|
|
// counters[0]
|
|
case 0x1f801100:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(0);
|
|
CALLFunc((uptr)psxRcntWcount16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
case 0x1f801104:
|
|
CONSTWRITE_CALL(psxRcnt0Wmode);
|
|
return;
|
|
case 0x1f801108:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(0);
|
|
CALLFunc((uptr)psxRcntWtarget16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[1]
|
|
case 0x1f801110:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(1);
|
|
CALLFunc((uptr)psxRcntWcount16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f801114:
|
|
CONSTWRITE_CALL(psxRcnt1Wmode);
|
|
return;
|
|
|
|
case 0x1f801118:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(1);
|
|
CALLFunc((uptr)psxRcntWtarget16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[2]
|
|
case 0x1f801120:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(2);
|
|
CALLFunc((uptr)psxRcntWcount16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f801124:
|
|
CONSTWRITE_CALL(psxRcnt2Wmode);
|
|
return;
|
|
|
|
case 0x1f801128:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(2);
|
|
CALLFunc((uptr)psxRcntWtarget16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[3]
|
|
case 0x1f801480:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(3);
|
|
CALLFunc((uptr)psxRcntWcount32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f801484:
|
|
CONSTWRITE_CALL(psxRcnt3Wmode);
|
|
return;
|
|
|
|
case 0x1f801488:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(3);
|
|
CALLFunc((uptr)psxRcntWtarget32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[4]
|
|
case 0x1f801490:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(4);
|
|
CALLFunc((uptr)psxRcntWcount32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f801494:
|
|
CONSTWRITE_CALL(psxRcnt4Wmode);
|
|
return;
|
|
|
|
case 0x1f801498:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(4);
|
|
CALLFunc((uptr)psxRcntWtarget32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[5]
|
|
case 0x1f8014a0:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(5);
|
|
CALLFunc((uptr)psxRcntWcount32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f8014a4:
|
|
CONSTWRITE_CALL(psxRcnt5Wmode);
|
|
return;
|
|
|
|
case 0x1f8014a8:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(5);
|
|
CALLFunc((uptr)psxRcntWtarget32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
default:
|
|
if (add>=0x1f801c00 && add<0x1f801e00) {
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(add);
|
|
CALLFunc((uptr)SPU2write);
|
|
// leave esp alone
|
|
return;
|
|
}
|
|
|
|
_eeWriteConstMem16((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
return;
|
|
}
|
|
}
|
|
|
|
#define recDmaExec(n) { \
|
|
iFlushCall(0); \
|
|
if( n > 6 ) \
|
|
TEST32ItoM((uptr)&HW_DMA_PCR2, 8 << ((n-7) * 4)); \
|
|
else \
|
|
TEST32ItoM((uptr)&HW_DMA_PCR, 8 << (n * 4)); \
|
|
j8Ptr[5] = JZ8(0); \
|
|
MOV32MtoR(EAX, (uptr)&HW_DMA##n##_CHCR); \
|
|
TEST32ItoR(EAX, 0x01000000); \
|
|
j8Ptr[6] = JZ8(0); \
|
|
\
|
|
_callFunctionArg3((uptr)psxDma##n, MEM_MEMORYTAG, MEM_MEMORYTAG, MEM_X86TAG, (uptr)&HW_DMA##n##_MADR, (uptr)&HW_DMA##n##_BCR, EAX); \
|
|
\
|
|
x86SetJ8( j8Ptr[5] ); \
|
|
x86SetJ8( j8Ptr[6] ); \
|
|
} \
|
|
|
|
#define CONSTWRITE_CALL32(name) { \
|
|
iFlushCall(0); \
|
|
_recPushReg(mmreg); \
|
|
CALLFunc((uptr)name); \
|
|
ADD32ItoR(ESP, 4); \
|
|
} \
|
|
|
|
void psxHwConstWrite32(u32 add, int mmreg)
|
|
{
|
|
if (add >= 0x1f801600 && add < 0x1f801700) {
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(add);
|
|
CALLFunc((uptr)USBwrite32);
|
|
return;
|
|
}
|
|
if (add >= 0x1f808400 && add <= 0x1f808550) {
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(add);
|
|
CALLFunc((uptr)FWwrite32);
|
|
return;
|
|
}
|
|
|
|
switch (add) {
|
|
case 0x1f801040:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
CALLFunc((uptr)sioWrite8);
|
|
ADD32ItoR(ESP, 1);
|
|
CALLFunc((uptr)sioWrite8);
|
|
ADD32ItoR(ESP, 1);
|
|
CALLFunc((uptr)sioWrite8);
|
|
ADD32ItoR(ESP, 1);
|
|
CALLFunc((uptr)sioWrite8);
|
|
ADD32ItoR(ESP, 1);
|
|
return;
|
|
|
|
case 0x1f801070:
|
|
_eeWriteConstMem32OP((uptr)&psxH[(add) & 0xffff], mmreg, 0); // and
|
|
return;
|
|
|
|
// case 0x1f801088:
|
|
// HW_DMA0_CHCR = value; // DMA0 chcr (MDEC in DMA)
|
|
//// DmaExec(0);
|
|
// return;
|
|
|
|
// case 0x1f801098:
|
|
// HW_DMA1_CHCR = value; // DMA1 chcr (MDEC out DMA)
|
|
//// DmaExec(1);
|
|
// return;
|
|
|
|
case 0x1f8010a8:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(2);
|
|
return;
|
|
|
|
case 0x1f8010b8:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(3);
|
|
return;
|
|
|
|
case 0x1f8010c8:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(4);
|
|
return;
|
|
|
|
case 0x1f8010e8:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(6);
|
|
return;
|
|
|
|
case 0x1f801508:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(7);
|
|
return;
|
|
|
|
case 0x1f801518:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(8);
|
|
return;
|
|
|
|
case 0x1f801528:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(9);
|
|
return;
|
|
|
|
case 0x1f801538:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(10);
|
|
return;
|
|
|
|
case 0x1f801548:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(11);
|
|
return;
|
|
|
|
case 0x1f801558:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
recDmaExec(12);
|
|
return;
|
|
|
|
case 0x1f8010f4:
|
|
case 0x1f801574:
|
|
{
|
|
// u32 tmp = (~value) & HW_DMA_ICR;
|
|
_eeMoveMMREGtoR(EAX, mmreg);
|
|
MOV32RtoR(ECX, EAX);
|
|
NOT32R(ECX);
|
|
AND32MtoR(ECX, (uptr)&psxH[(add) & 0xffff]);
|
|
|
|
// HW_DMA_ICR = ((tmp ^ value) & 0xffffff) ^ tmp;
|
|
XOR32RtoR(EAX, ECX);
|
|
AND32ItoR(EAX, 0xffffff);
|
|
XOR32RtoR(EAX, ECX);
|
|
MOV32RtoM((uptr)&psxH[(add) & 0xffff], EAX);
|
|
return;
|
|
}
|
|
|
|
// counters[0]
|
|
case 0x1f801100:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(0);
|
|
CALLFunc((uptr)psxRcntWcount16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
case 0x1f801104:
|
|
CONSTWRITE_CALL32(psxRcnt0Wmode);
|
|
return;
|
|
case 0x1f801108:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(0);
|
|
CALLFunc((uptr)psxRcntWtarget16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[1]
|
|
case 0x1f801110:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(1);
|
|
CALLFunc((uptr)psxRcntWcount16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f801114:
|
|
CONSTWRITE_CALL32(psxRcnt1Wmode);
|
|
return;
|
|
|
|
case 0x1f801118:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(1);
|
|
CALLFunc((uptr)psxRcntWtarget16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[2]
|
|
case 0x1f801120:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(2);
|
|
CALLFunc((uptr)psxRcntWcount16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f801124:
|
|
CONSTWRITE_CALL32(psxRcnt2Wmode);
|
|
return;
|
|
|
|
case 0x1f801128:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(2);
|
|
CALLFunc((uptr)psxRcntWtarget16);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[3]
|
|
case 0x1f801480:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(3);
|
|
CALLFunc((uptr)psxRcntWcount32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f801484:
|
|
CONSTWRITE_CALL32(psxRcnt3Wmode);
|
|
return;
|
|
|
|
case 0x1f801488:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(3);
|
|
CALLFunc((uptr)psxRcntWtarget32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[4]
|
|
case 0x1f801490:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(4);
|
|
CALLFunc((uptr)psxRcntWcount32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f801494:
|
|
CONSTWRITE_CALL32(psxRcnt4Wmode);
|
|
return;
|
|
|
|
case 0x1f801498:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(4);
|
|
CALLFunc((uptr)psxRcntWtarget32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
// counters[5]
|
|
case 0x1f8014a0:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(5);
|
|
CALLFunc((uptr)psxRcntWcount32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f8014a4:
|
|
CONSTWRITE_CALL32(psxRcnt5Wmode);
|
|
return;
|
|
|
|
case 0x1f8014a8:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(5);
|
|
CALLFunc((uptr)psxRcntWtarget32);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1f8014c0:
|
|
SysPrintf("RTC_HOLDMODE 32bit write\n");
|
|
break;
|
|
|
|
case 0x1F808200:
|
|
case 0x1F808204:
|
|
case 0x1F808208:
|
|
case 0x1F80820C:
|
|
case 0x1F808210:
|
|
case 0x1F808214:
|
|
case 0x1F808218:
|
|
case 0x1F80821C:
|
|
case 0x1F808220:
|
|
case 0x1F808224:
|
|
case 0x1F808228:
|
|
case 0x1F80822C:
|
|
case 0x1F808230:
|
|
case 0x1F808234:
|
|
case 0x1F808238:
|
|
case 0x1F80823C:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I((add-0x1F808200)/4);
|
|
CALLFunc((uptr)sio2_setSend3);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1F808240:
|
|
case 0x1F808248:
|
|
case 0x1F808250:
|
|
case 0x1F808258:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I((add-0x1F808240)/8);
|
|
CALLFunc((uptr)sio2_setSend1);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1F808244:
|
|
case 0x1F80824C:
|
|
case 0x1F808254:
|
|
case 0x1F80825C:
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I((add-0x1F808244)/8);
|
|
CALLFunc((uptr)sio2_setSend2);
|
|
ADD32ItoR(ESP, 8);
|
|
return;
|
|
|
|
case 0x1F808268: CONSTWRITE_CALL32(sio2_setCtrl); return;
|
|
case 0x1F808278: CONSTWRITE_CALL32(sio2_set8278); return;
|
|
case 0x1F80827C: CONSTWRITE_CALL32(sio2_set827C); return;
|
|
case 0x1F808280: CONSTWRITE_CALL32(sio2_setIntr); return;
|
|
|
|
case 0x1F8010C0:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(0);
|
|
CALLFunc((uptr)SPU2WriteMemAddr);
|
|
return;
|
|
|
|
case 0x1F801500:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
_recPushReg(mmreg);
|
|
iFlushCall(0);
|
|
PUSH32I(1);
|
|
CALLFunc((uptr)SPU2WriteMemAddr);
|
|
return;
|
|
default:
|
|
_eeWriteConstMem32((uptr)&psxH[(add) & 0xffff], mmreg);
|
|
return;
|
|
}
|
|
}
|
|
|
|
int psxHw4ConstRead8(u32 x86reg, u32 add, u32 sign) {
|
|
switch (add) {
|
|
case 0x1f402004: CONSTREAD8_CALL((u32)cdvdRead04); return 1;
|
|
case 0x1f402005: CONSTREAD8_CALL((u32)cdvdRead05); return 1;
|
|
case 0x1f402006: CONSTREAD8_CALL((u32)cdvdRead06); return 1;
|
|
case 0x1f402007: CONSTREAD8_CALL((u32)cdvdRead07); return 1;
|
|
case 0x1f402008: CONSTREAD8_CALL((u32)cdvdRead08); return 1;
|
|
case 0x1f40200A: CONSTREAD8_CALL((u32)cdvdRead0A); return 1;
|
|
case 0x1f40200B: CONSTREAD8_CALL((u32)cdvdRead0B); return 1;
|
|
case 0x1f40200C: CONSTREAD8_CALL((u32)cdvdRead0C); return 1;
|
|
case 0x1f40200D: CONSTREAD8_CALL((u32)cdvdRead0D); return 1;
|
|
case 0x1f40200E: CONSTREAD8_CALL((u32)cdvdRead0E); return 1;
|
|
case 0x1f40200F: CONSTREAD8_CALL((u32)cdvdRead0F); return 1;
|
|
case 0x1f402013: CONSTREAD8_CALL((u32)cdvdRead13); return 1;
|
|
case 0x1f402015: CONSTREAD8_CALL((u32)cdvdRead15); return 1;
|
|
case 0x1f402016: CONSTREAD8_CALL((u32)cdvdRead16); return 1;
|
|
case 0x1f402017: CONSTREAD8_CALL((u32)cdvdRead17); return 1;
|
|
case 0x1f402018: CONSTREAD8_CALL((u32)cdvdRead18); return 1;
|
|
case 0x1f402020: CONSTREAD8_CALL((u32)cdvdRead20); return 1;
|
|
case 0x1f402021: CONSTREAD8_CALL((u32)cdvdRead21); return 1;
|
|
case 0x1f402022: CONSTREAD8_CALL((u32)cdvdRead22); return 1;
|
|
case 0x1f402023: CONSTREAD8_CALL((u32)cdvdRead23); return 1;
|
|
case 0x1f402024: CONSTREAD8_CALL((u32)cdvdRead24); return 1;
|
|
case 0x1f402028: CONSTREAD8_CALL((u32)cdvdRead28); return 1;
|
|
case 0x1f402029: CONSTREAD8_CALL((u32)cdvdRead29); return 1;
|
|
case 0x1f40202A: CONSTREAD8_CALL((u32)cdvdRead2A); return 1;
|
|
case 0x1f40202B: CONSTREAD8_CALL((u32)cdvdRead2B); return 1;
|
|
case 0x1f40202C: CONSTREAD8_CALL((u32)cdvdRead2C); return 1;
|
|
case 0x1f402030: CONSTREAD8_CALL((u32)cdvdRead30); return 1;
|
|
case 0x1f402031: CONSTREAD8_CALL((u32)cdvdRead31); return 1;
|
|
case 0x1f402032: CONSTREAD8_CALL((u32)cdvdRead32); return 1;
|
|
case 0x1f402033: CONSTREAD8_CALL((u32)cdvdRead33); return 1;
|
|
case 0x1f402034: CONSTREAD8_CALL((u32)cdvdRead34); return 1;
|
|
case 0x1f402038: CONSTREAD8_CALL((u32)cdvdRead38); return 1;
|
|
case 0x1f402039: CONSTREAD8_CALL((u32)cdvdRead39); return 1;
|
|
case 0x1f40203A: CONSTREAD8_CALL((u32)cdvdRead3A); return 1;
|
|
default:
|
|
SysPrintf("*Unkwnown 8bit read at address %lx\n", add);
|
|
XOR32RtoR(x86reg, x86reg);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void psxHw4ConstWrite8(u32 add, int mmreg) {
|
|
switch (add) {
|
|
case 0x1f402004: CONSTWRITE_CALL(cdvdWrite04); return;
|
|
case 0x1f402005: CONSTWRITE_CALL(cdvdWrite05); return;
|
|
case 0x1f402006: CONSTWRITE_CALL(cdvdWrite06); return;
|
|
case 0x1f402007: CONSTWRITE_CALL(cdvdWrite07); return;
|
|
case 0x1f402008: CONSTWRITE_CALL(cdvdWrite08); return;
|
|
case 0x1f40200A: CONSTWRITE_CALL(cdvdWrite0A); return;
|
|
case 0x1f40200F: CONSTWRITE_CALL(cdvdWrite0F); return;
|
|
case 0x1f402014: CONSTWRITE_CALL(cdvdWrite14); return;
|
|
case 0x1f402016:
|
|
MMXONLY(_freeMMXregs();)
|
|
CONSTWRITE_CALL(cdvdWrite16);
|
|
return;
|
|
case 0x1f402017: CONSTWRITE_CALL(cdvdWrite17); return;
|
|
case 0x1f402018: CONSTWRITE_CALL(cdvdWrite18); return;
|
|
case 0x1f40203A: CONSTWRITE_CALL(cdvdWrite3A); return;
|
|
default:
|
|
SysPrintf("*Unknown 8bit write at address %lx\n", add);
|
|
return;
|
|
}
|
|
}
|
|
|
|
#endif // PCSX2_NORECBUILD
|
|
|