summaryrefslogtreecommitdiff
path: root/PcsxSrc/ix86/iR3000A.c
diff options
context:
space:
mode:
Diffstat (limited to 'PcsxSrc/ix86/iR3000A.c')
-rw-r--r--PcsxSrc/ix86/iR3000A.c1236
1 files changed, 0 insertions, 1236 deletions
diff --git a/PcsxSrc/ix86/iR3000A.c b/PcsxSrc/ix86/iR3000A.c
deleted file mode 100644
index 2586ca0..0000000
--- a/PcsxSrc/ix86/iR3000A.c
+++ /dev/null
@@ -1,1236 +0,0 @@
-/* Pcsx - Pc Psx Emulator
- * Copyright (C) 1999-2002 Pcsx 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
- */
-
-#ifdef __WIN32__
-#pragma warning(disable:4244)
-#pragma warning(disable:4761)
-#endif
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#include "PsxCommon.h"
-#include "ix86.h"
-
-static u32 *recLUT;
-
-#define PC_REC(x) (recLUT[x >> 16] + (x & 0xffff))
-#define PC_REC8(x) (*(u8 *)PC_REC(x))
-#define PC_REC16(x) (*(u16*)PC_REC(x))
-#define PC_REC32(x) (*(u32*)PC_REC(x))
-
-#define RECMEM_SIZE (8*1024*1024)
-
-static char *recMem; /* the recompiled blocks will be here */
-static char *recRAM; /* and the ptr to the blocks here */
-static char *recROM; /* and here */
-
-static u32 pc; /* recompiler pc */
-static int count; /* recompiler intruction count */
-static int branch; /* set for branch */
-static u32 target; /* branch target */
-
-static void (*recBSC[64])();
-static void (*recSPC[64])();
-static void (*recREG[32])();
-static void (*recCP0[32])();
-static void (*recCP2[64])();
-static void (*recCP2BSC[32])();
-
-/* set a pending branch */
-#define SetBranch() { \
- branch = 1; \
- psxRegs.code = PSXMu32(pc); \
- pc+=4; count++; \
- recBSC[psxRegs.code>>26](); \
- \
- MOV32MtoR(EAX, (u32)&target); \
- MOV32RtoM((u32)&psxRegs.pc, EAX); \
- CALLFunc((u32)psxBranchTest); \
-}
-
-#define REC_FUNC(f) \
-void psx##f(); \
-static void rec##f() { \
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code); \
- MOV32ItoM((u32)&psxRegs.pc, (u32)pc); \
- CALLFunc((u32)psx##f); \
-/* branch = 2; */\
-}
-
-#define REC_SYS(f) \
-void psx##f(); \
-static void rec##f() { \
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code); \
- MOV32ItoM((u32)&psxRegs.pc, (u32)pc); \
- CALLFunc((u32)psx##f); \
- branch = 2; \
-}
-
-#define REC_BRANCH(f) \
-void psx##f(); \
-static void rec##f() { \
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code); \
- MOV32ItoM((u32)&psxRegs.pc, (u32)pc); \
- CALLFunc((u32)psx##f); \
- branch = 2; \
- count++; \
-}
-
-static void recRecompile();
-
-static int recInit() {
- int i;
-
- recLUT = (u32*) malloc(0x010000 * 4);
-
- recMem = (char*) malloc(RECMEM_SIZE);
- recRAM = (char*) malloc(0x200000);
- recROM = (char*) malloc(0x080000);
- if (recRAM == NULL || recROM == NULL || recMem == NULL || recLUT == NULL) {
- SysMessage("Error allocating memory"); return -1;
- }
-
- for (i=0; i<0x80; i++) recLUT[i + 0x0000] = (u32)&recRAM[(i & 0x1f) << 16];
- memcpy(recLUT + 0x8000, recLUT, 0x80 * 4);
- memcpy(recLUT + 0xa000, recLUT, 0x80 * 4);
-
- for (i=0; i<0x08; i++) recLUT[i + 0xbfc0] = (u32)&recROM[i << 16];
-
- return 0;
-}
-
-static void recReset() {
- memset(recRAM, 0, 0x200000);
- memset(recROM, 0, 0x080000);
-
- x86Init(recMem);
- branch = 0;
-}
-
-static void recShutdown() {
- if (recMem == NULL) return;
- free(recLUT);
- free(recMem);
- free(recRAM);
- free(recROM);
-}
-
-static void recError() {
- SysReset();
- ClosePlugins();
- SysMessage("Unrecoverable error while running recompiler\n");
- SysRunGui();
-}
-
-#define execute() { \
- void (**recFunc)(); \
- char *p; \
- \
- p = (char*)PC_REC(psxRegs.pc); \
- if (p != NULL) recFunc = (void (**)()) (u32)p; \
- else { recError(); return; } \
- \
- if (*recFunc == 0) { \
- recRecompile(); \
- } \
- (*recFunc)(); \
-}
-
-static void DumpRegs() {
- int i, j;
-
- printf("%lx %lx\n", psxRegs.pc, psxRegs.cycle);
- for (i=0; i<4; i++) {
- for (j=0; j<8; j++)
- printf("%lx ", psxRegs.GPR.r[j*i]);
- printf("\n");
- }
-}
-
-static void recExecuteBios() {
- while (psxRegs.pc != 0x80030000) {
- execute();
- }
-}
-
-static void recExecute() {
- for (;;) execute();
-}
-
-static void recExecuteBlock() {
- execute();
-}
-
-static void recClear(u32 Addr, u32 Size) {
- memset((void*)PC_REC(Addr), 0, Size * 4);
-}
-
-static void recNULL() {
-// SysMessage("recUNK: %8.8x\n", psxRegs.code);
-}
-
-/*********************************************************
-* goes to opcodes tables... *
-* Format: table[something....] *
-*********************************************************/
-
-//REC_SYS(SPECIAL);
-static void recSPECIAL() {
- recSPC[_Funct_]();
-}
-
-static void recREGIMM() {
- recREG[_Rt_]();
-}
-
-static void recCOP0() {
- recCP0[_Rs_]();
-}
-
-//REC_SYS(COP2);
-static void recCOP2() {
- recCP2[_Funct_]();
-}
-
-static void recBASIC() {
- recCP2BSC[_Rs_]();
-}
-
-//end of Tables opcodes...
-
-/*********************************************************
-* Arithmetic with immediate operand *
-* Format: OP rt, rs, immediate *
-*********************************************************/
-/*
-REC_FUNC(ADDI);
-REC_FUNC(ADDIU);
-REC_FUNC(ANDI);
-REC_FUNC(ORI);
-REC_FUNC(XORI);
-REC_FUNC(SLTI);
-REC_FUNC(SLTIU);
-#if 0*/
-static void recADDIU() {
-// Rt = Rs + Im
- if (!_Rt_) return;
-
- if (_Rs_) {
- if (_Rs_ == _Rt_) {
- ADD32ItoM((u32)&psxRegs.GPR.r[_Rt_], _Imm_);
- } else {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_Imm_) ADD32ItoR(EAX, _Imm_);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
- } else {
- MOV32ItoM((u32)&psxRegs.GPR.r[_Rt_], _Imm_);
- }
-}
-
-static void recADDI() {
-// Rt = Rs + Im
- recADDIU();
-}
-
-static void recSLTI() {
-// Rt = Rs < Im (signed)
- if (!_Rt_) return;
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- CMP32ItoR(EAX, _Imm_);
- SETL8R (EAX);
- AND32ItoR(EAX, 0xff);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
-}
-
-static void recSLTIU() {
-// Rt = Rs < Im (unsigned)
- if (!_Rt_) return;
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- CMP32ItoR(EAX, _Imm_);
- SETB8R (EAX);
- AND32ItoR(EAX, 0xff);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
-}
-
-static void recANDI() {
-// Rt = Rs And Im
- if (!_Rt_) return;
-
- if (_Rs_ && _ImmU_) {
- if (_Rs_ == _Rt_) {
- AND32ItoM((u32)&psxRegs.GPR.r[_Rt_], _ImmU_);
- } else {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- AND32ItoR(EAX, _ImmU_);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
- } else {
- XOR32RtoR(EAX, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
-}
-
-static void recORI() {
-// Rt = Rs Or Im
- if (!_Rt_) return;
-
- if (_Rs_) {
- if (_Rs_ == _Rt_) {
- OR32ItoM((u32)&psxRegs.GPR.r[_Rt_], _ImmU_);
- } else {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_ImmU_) OR32ItoR (EAX, _ImmU_);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
- } else {
- MOV32ItoM((u32)&psxRegs.GPR.r[_Rt_], _ImmU_);
- }
-}
-
-static void recXORI() {
-// Rt = Rs Xor Im
- if (!_Rt_) return;
-
- if (_Rs_) {
- if (_Rs_ == _Rt_) {
- XOR32ItoM((u32)&psxRegs.GPR.r[_Rt_], _ImmU_);
- } else {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- XOR32ItoR(EAX, _ImmU_);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
- } else {
- MOV32ItoR(EAX, _ImmU_ ^ 0);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
-}
-//#endif
-//end of * Arithmetic with immediate operand
-
-/*********************************************************
-* Load higher 16 bits of the first word in GPR with imm *
-* Format: OP rt, immediate *
-*********************************************************/
-/*REC_FUNC(LUI);
-#if 0*/
-static void recLUI() {
-// Rt = Imm << 16
- if (!_Rt_) return;
-
- MOV32ItoM((u32)&psxRegs.GPR.r[_Rt_], psxRegs.code << 16);
-}
-//#endif
-//End of Load Higher .....
-
-
-/*********************************************************
-* Register arithmetic *
-* Format: OP rd, rs, rt *
-*********************************************************/
-/*
-REC_FUNC(ADD);
-REC_FUNC(ADDU);
-REC_FUNC(SUB);
-REC_FUNC(SUBU);
-REC_FUNC(AND);
-REC_FUNC(OR);
-REC_FUNC(XOR);
-REC_FUNC(NOR);
-REC_FUNC(SLT);
-REC_FUNC(SLTU);
-
-#if 0*/
-static void recADDU() {
-// Rd = Rs + Rt
- if (!_Rd_) return;
-
- if (_Rs_ && _Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- ADD32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- } else if (_Rs_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- } else if (_Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- } else {
- XOR32RtoR(EAX, EAX);
- }
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recADD() {
-// Rd = Rs + Rt
- recADDU();
-}
-
-static void recSUBU() {
-// Rd = Rs - Rt
- if (!_Rd_) return;
-
- if (_Rs_ || _Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- SUB32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- } else {
- XOR32RtoR(EAX, EAX);
- }
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recSUB() {
-// Rd = Rs - Rt
- recSUBU();
-}
-
-static void recAND() {
-// Rd = Rs And Rt
- if (!_Rd_) return;
-
- if (_Rs_ && _Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- AND32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- } else {
- XOR32RtoR(EAX, EAX);
- }
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recOR() {
-// Rd = Rs Or Rt
- if (!_Rd_) return;
-
- if (_Rs_ && _Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- OR32MtoR (EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- } else if (_Rs_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- } else if (_Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- } else {
- XOR32RtoR(EAX, EAX);
- }
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recXOR() {
-// Rd = Rs Xor Rt
- if (!_Rd_) return;
-
- if (_Rs_ && _Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- XOR32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- } else if (_Rs_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- XOR32ItoR(EAX, 0);
- } else if (_Rt_) {
- XOR32RtoR(EAX, EAX);
- XOR32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- } else {
- XOR32RtoR(EAX, EAX);
- }
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recNOR() {
-// Rd = Rs Nor Rt
- if (!_Rd_) return;
-
- if (_Rs_ && _Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- OR32MtoR (EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- NOT32R (EAX);
- } else if (_Rs_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- NOT32R (EAX);
- } else if (_Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- NOT32R (EAX);
- } else {
- MOV32ItoR(EAX, ~0);
- }
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recSLT() {
-// Rd = Rs < Rt (signed)
- if (!_Rd_) return;
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- SETL8R (EAX);
- AND32ItoR(EAX, 0xff);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recSLTU() {
-// Rd = Rs < Rt (unsigned)
- if (!_Rd_) return;
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- SBB32RtoR(EAX, EAX);
- NEG32R (EAX);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-//#endif
-//End of * Register arithmetic
-
-/*********************************************************
-* Register mult/div & Register trap logic *
-* Format: OP rs, rt *
-*********************************************************/
-
-/*REC_FUNC(MULT);
-REC_FUNC(MULTU);
-REC_FUNC(DIV);
-REC_FUNC(DIVU);
-#if 0*/
-static void recMULT() {
-// Lo/Hi = Rs * Rt (signed)
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- IMUL32M ((u32)&psxRegs.GPR.r[_Rt_]);
- MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.n.hi, EDX);
-}
-
-static void recMULTU() {
-// Lo/Hi = Rs * Rt (unsigned)
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- MUL32M ((u32)&psxRegs.GPR.r[_Rt_]);
- MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.n.hi, EDX);
-}
-
-static void recDIV() {
-// Lo/Hi = Rs / Rt (signed)
-
- MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]);
- CMP32ItoR(ECX, 0);
- j8Ptr[0] = JE8(0);
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- CDQ();
- IDIV32R (ECX);
- MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.n.hi, EDX);
- x86SetJ8(j8Ptr[0]);
-}
-
-static void recDIVU() {
-// Lo/Hi = Rs / Rt (unsigned)
-
- MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rt_]);
- CMP32ItoR(ECX, 0);
- j8Ptr[0] = JE8(0);
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- XOR32RtoR(EDX, EDX);
- DIV32R (ECX);
- MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.n.hi, EDX);
- x86SetJ8(j8Ptr[0]);
-}
-//#endif
-//End of * Register mult/div & Register trap logic
-
-/*REC_FUNC(LB);
-REC_FUNC(LBU);
-REC_FUNC(LH);
-REC_FUNC(LHU);
-REC_FUNC(LW);
-
-REC_FUNC(SB);
-REC_FUNC(SH);
-REC_FUNC(SW);*/
-
-REC_FUNC(LWL);
-REC_FUNC(LWR);
-REC_FUNC(SWL);
-REC_FUNC(SWR);
-//#if 0
-static void recLB() {
-// Rt = mem[Rs + Im] (signed)
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_Imm_) ADD32ItoR(EAX, _Imm_);
- PUSH32R (EAX);
- CALLFunc((u32)psxMemRead8);
- if (_Rt_) {
- MOVSX32R8toR(EAX, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
- ADD32ItoR(ESP, 4);
-}
-
-static void recLBU() {
-// Rt = mem[Rs + Im] (unsigned)
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_Imm_) ADD32ItoR(EAX, _Imm_);
- PUSH32R (EAX);
- CALLFunc((u32)psxMemRead8);
- if (_Rt_) {
- MOVZX32R8toR(EAX, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
- ADD32ItoR(ESP, 4);
-}
-
-static void recLH() {
-// Rt = mem[Rs + Im] (signed)
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_Imm_) ADD32ItoR(EAX, _Imm_);
- PUSH32R (EAX);
- CALLFunc((u32)psxMemRead16);
- if (_Rt_) {
- MOVSX32R16toR(EAX, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
- ADD32ItoR(ESP, 4);
-}
-
-static void recLHU() {
-// Rt = mem[Rs + Im] (unsigned)
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_Imm_) ADD32ItoR(EAX, _Imm_);
- PUSH32R (EAX);
- CALLFunc((u32)psxMemRead16);
- if (_Rt_) {
- MOVZX32R16toR(EAX, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
- ADD32ItoR(ESP, 4);
-}
-
-static void recLW() {
-// Rt = mem[Rs + Im] (unsigned)
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_Imm_) ADD32ItoR(EAX, _Imm_);
- PUSH32R (EAX);
- CALLFunc((u32)psxMemRead32);
- if (_Rt_) {
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
- }
- ADD32ItoR(ESP, 4);
-}
-/*
-void recLWL() {
-}
-
-void recLWR() {
-}
-*/
-static void recSB() {
-// mem[Rs + Im] = Rt
-
- PUSH32M ((u32)&psxRegs.GPR.r[_Rt_]);
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_Imm_) ADD32ItoR(EAX, _Imm_);
- PUSH32R (EAX);
- CALLFunc((u32)psxMemWrite8);
- ADD32ItoR(ESP, 8);
-}
-
-static void recSH() {
-// mem[Rs + Im] = Rt
-
- PUSH32M ((u32)&psxRegs.GPR.r[_Rt_]);
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_Imm_) ADD32ItoR(EAX, _Imm_);
- PUSH32R (EAX);
- CALLFunc((u32)psxMemWrite16);
- ADD32ItoR(ESP, 8);
-}
-
-static void recSW() {
-// mem[Rs + Im] = Rt
-
- PUSH32M ((u32)&psxRegs.GPR.r[_Rt_]);
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- if (_Imm_) ADD32ItoR(EAX, _Imm_);
- PUSH32R (EAX);
- CALLFunc((u32)psxMemWrite32);
- ADD32ItoR(ESP, 8);
-}
-//#endif
-/*
-void recSWL() {
-}
-
-void recSWR() {
-}
-*/
-/*REC_FUNC(SLL);
-REC_FUNC(SRL);
-REC_FUNC(SRA);
-#if 0*/
-static void recSLL() {
-// Rd = Rt << Sa
- if (!_Rd_) return;
-
- if (_Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- if (_Sa_) SHL32ItoR(EAX, _Sa_);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
- } else {
- XOR32RtoR(EAX, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
- }
-}
-
-static void recSRL() {
-// Rd = Rt >> Sa
- if (!_Rd_) return;
-
- if (_Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- if (_Sa_) SHR32ItoR(EAX, _Sa_);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
- } else {
- XOR32RtoR(EAX, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
- }
-}
-
-static void recSRA() {
-// Rd = Rt >> Sa
- if (!_Rd_) return;
-
- if (_Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- if (_Sa_) SAR32ItoR(EAX, _Sa_);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
- } else {
- XOR32RtoR(EAX, EAX);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
- }
-}
-//#endif
-
-/*REC_FUNC(SLLV);
-REC_FUNC(SRLV);
-REC_FUNC(SRAV);
-#if 0*/
-static void recSLLV() {
-// Rd = Rt << Rs
- if (!_Rd_) return;
-
- if (_Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- if (_Rs_) {
- MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rs_]);
- SHL32CLtoR(EAX);
- }
- }
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recSRLV() {
-// Rd = Rt >> Rs
- if (!_Rd_) return;
-
- if (_Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- if (_Rs_) {
- MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rs_]);
- SHR32CLtoR(EAX);
- }
- }
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recSRAV() {
-// Rd = Rt >> Rs
- if (!_Rd_) return;
-
- if (_Rt_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- if (_Rs_) {
- MOV32MtoR(ECX, (u32)&psxRegs.GPR.r[_Rs_]);
- SAR32CLtoR(EAX);
- }
- }
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-//#endif
-
-/*REC_SYS(SYSCALL);
-REC_SYS(BREAK);
-
-#if 0*/
-static void recSYSCALL() {
- MOV32ItoR(EAX, pc - 4);
- MOV32RtoM((u32)&psxRegs.pc, EAX);
- PUSH32I (branch == 1 ? 1 : 0);
- PUSH32I (0x20);
- CALLFunc ((u32)psxException);
- ADD32ItoR(ESP, 8);
-
- if (!branch) branch = 2;
-}
-
-static void recBREAK() {
-}
-//#endif
-/*
-REC_FUNC(MFHI);
-REC_FUNC(MTHI);
-REC_FUNC(MFLO);
-REC_FUNC(MTLO);
-#if 0*/
-static void recMFHI() {
-// Rd = Hi
- if (!_Rd_) return;
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.n.hi);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recMTHI() {
-// Hi = Rs
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- MOV32RtoM((u32)&psxRegs.GPR.n.hi, EAX);
-}
-
-static void recMFLO() {
-// Rd = Lo
- if (!_Rd_) return;
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.n.lo);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rd_], EAX);
-}
-
-static void recMTLO() {
-// Lo = Rs
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- MOV32RtoM((u32)&psxRegs.GPR.n.lo, EAX);
-}
-//#endif
-
-/*REC_BRANCH(J);
-REC_BRANCH(JR);
-REC_BRANCH(JAL);
-REC_BRANCH(JALR);
-REC_BRANCH(BLTZ);
-REC_BRANCH(BGTZ);
-REC_BRANCH(BLTZAL);
-REC_BRANCH(BGEZAL);
-REC_BRANCH(BNE);
-REC_BRANCH(BEQ);
-REC_BRANCH(BLEZ);
-REC_BRANCH(BGEZ);
-
-#if 0*/
-static void recBLTZ() {
-// Branch if Rs < 0
-
- CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0);
- j8Ptr[0] = JL8(0);
-
- MOV32ItoM((u32)&target, pc+4);
- j8Ptr[1] = JMP8(0);
-
- x86SetJ8(j8Ptr[0]);
-
- MOV32ItoM((u32)&target, _Imm_ * 4 + pc);
-
- x86SetJ8(j8Ptr[1]);
-
- SetBranch();
-}
-
-static void recBGEZ() {
-// Branch if Rs >= 0
-
- CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0);
- j8Ptr[0] = JGE8(0);
-
- MOV32ItoM((u32)&target, pc+4);
- j8Ptr[1] = JMP8(0);
-
- x86SetJ8(j8Ptr[0]);
-
- MOV32ItoM((u32)&target, _Imm_ * 4 + pc);
-
- x86SetJ8(j8Ptr[1]);
-
- SetBranch();
-}
-
-static void recBLTZAL() {
-// Branch if Rs < 0
-
- CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0);
- j8Ptr[0] = JL8(0);
-
- MOV32ItoM((u32)&target, pc+4);
- j8Ptr[1] = JMP8(0);
-
- x86SetJ8(j8Ptr[0]);
-
- MOV32ItoM((u32)&target, _Imm_ * 4 + pc);
- MOV32ItoM((u32)&psxRegs.GPR.r[31], pc + 4);
-
- x86SetJ8(j8Ptr[1]);
-
- SetBranch();
-}
-
-static void recBGEZAL() {
-// Branch if Rs >= 0
-
- CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0);
- j8Ptr[0] = JGE8(0);
-
- MOV32ItoM((u32)&target, pc+4);
- j8Ptr[1] = JMP8(0);
-
- x86SetJ8(j8Ptr[0]);
-
- MOV32ItoM((u32)&target, _Imm_ * 4 + pc);
- MOV32ItoM((u32)&psxRegs.GPR.r[31], pc + 4);
-
- x86SetJ8(j8Ptr[1]);
-
- SetBranch();
-}
-
-static void recJ() {
-// j target
- MOV32ItoM((u32)&target, _Target_ * 4 + (pc & 0xf0000000));
-
- SetBranch();
-}
-
-static void recJAL() {
-// jal target
-
- MOV32ItoM((u32)&target, _Target_ * 4 + (pc & 0xf0000000));
- MOV32ItoM((u32)&psxRegs.GPR.r[31], pc + 4);
-
- SetBranch();
-}
-
-static void recJR() {
-// jr Rs
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- MOV32RtoM((u32)&target, EAX);
-
- SetBranch();
-}
-
-static void recJALR() {
-// jalr Rs
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- MOV32RtoM((u32)&target, EAX);
-
- if (_Rd_) {
- MOV32ItoM((u32)&psxRegs.GPR.r[_Rd_], pc + 4);
- }
-
- SetBranch();
-}
-
-static void recBEQ() {
-// Branch if Rs == Rt
-
- if (_Rs_ == _Rt_) {
- MOV32ItoM((u32)&target, _Imm_ * 4 + pc);
- } else {
- if (_Rs_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- } else {
- XOR32RtoR(EAX, EAX);
- }
- CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- j8Ptr[0] = JE8(0);
-
- MOV32ItoM((u32)&target, pc+4);
- j8Ptr[1] = JMP8(0);
-
- x86SetJ8(j8Ptr[0]);
-
- MOV32ItoM((u32)&target, _Imm_ * 4 + pc);
-
- x86SetJ8(j8Ptr[1]);
- }
-
- SetBranch();
-}
-
-static void recBNE() {
-// Branch if Rs != Rt
-
- if (_Rs_) {
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rs_]);
- } else {
- XOR32RtoR(EAX, EAX);
- }
- CMP32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- j8Ptr[0] = JNE8(0);
-
- MOV32ItoM((u32)&target, pc+4);
- j8Ptr[1] = JMP8(0);
-
- x86SetJ8(j8Ptr[0]);
-
- MOV32ItoM((u32)&target, _Imm_ * 4 + pc);
-
- x86SetJ8(j8Ptr[1]);
-
- SetBranch();
-}
-
-static void recBLEZ() {
-// Branch if Rs <= 0
-
- CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0);
- j8Ptr[0] = JLE8(0);
-
- MOV32ItoM((u32)&target, pc+4);
- j8Ptr[1] = JMP8(0);
-
- x86SetJ8(j8Ptr[0]);
-
- MOV32ItoM((u32)&target, _Imm_ * 4 + pc);
-
- x86SetJ8(j8Ptr[1]);
-
- SetBranch();
-}
-
-static void recBGTZ() {
-// Branch if Rs > 0
-
- CMP32ItoM((u32)&psxRegs.GPR.r[_Rs_], 0);
- j8Ptr[0] = JG8(0);
-
- MOV32ItoM((u32)&target, pc+4);
- j8Ptr[1] = JMP8(0);
-
- x86SetJ8(j8Ptr[0]);
-
- MOV32ItoM((u32)&target, _Imm_ * 4 + pc);
-
- x86SetJ8(j8Ptr[1]);
-
- SetBranch();
-}
-//#endif
-
-/*REC_FUNC(MFC0);
-REC_FUNC(MTC0);
-REC_FUNC(CFC0);
-REC_FUNC(CTC0);
-REC_FUNC(RFE);
-#if 0*/
-static void recMFC0() {
-// Rt = Cop0->Rd
- if (!_Rt_) return;
-
- MOV32MtoR(EAX, (u32)&psxRegs.CP0.r[_Rd_]);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
-}
-
-static void recCFC0() {
-// Rt = Cop0->Rd
- if (!_Rt_) return;
-
- MOV32MtoR(EAX, (u32)&psxRegs.CP0.r[_Rd_]);
- MOV32RtoM((u32)&psxRegs.GPR.r[_Rt_], EAX);
-}
-
-static void recMTC0() {
-// Cop0->Rd = Rt
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- MOV32RtoM((u32)&psxRegs.CP0.r[_Rd_], EAX);
-}
-
-static void recCTC0() {
-// Cop0->Rd = Rt
-
- MOV32MtoR(EAX, (u32)&psxRegs.GPR.r[_Rt_]);
- MOV32RtoM((u32)&psxRegs.CP0.r[_Rd_], EAX);
-}
-
-static void recRFE() {
- MOV32MtoR(EAX, (u32)&psxRegs.CP0.n.Status);
- MOV32RtoR(ECX, EAX);
- AND32ItoR(EAX, 0xfffffff0);
- AND32ItoR(ECX, 0x3c);
- SHR32ItoR(ECX, 2);
- OR32RtoR (EAX, ECX);
- MOV32RtoM((u32)&psxRegs.CP0.n.Status, EAX);
-}
-//#endif
-
-#define CP2_FUNC(f) \
-void gte##f(); \
-static void rec##f() { \
- MOV32ItoM((u32)&psxRegs.code, (u32)psxRegs.code); \
- MOV32ItoM((u32)&psxRegs.pc, (u32)pc); \
- CALLFunc ((u32)gte##f); \
-/* branch = 2; */\
-}
-
-CP2_FUNC(MFC2);
-CP2_FUNC(MTC2);
-CP2_FUNC(CFC2);
-CP2_FUNC(CTC2);
-CP2_FUNC(LWC2);
-CP2_FUNC(SWC2);
-
-CP2_FUNC(RTPS);
-CP2_FUNC(OP);
-CP2_FUNC(NCLIP);
-CP2_FUNC(DPCS);
-CP2_FUNC(INTPL);
-CP2_FUNC(MVMVA);
-CP2_FUNC(NCDS);
-CP2_FUNC(NCDT);
-CP2_FUNC(CDP);
-CP2_FUNC(NCCS);
-CP2_FUNC(CC);
-CP2_FUNC(NCS);
-CP2_FUNC(NCT);
-CP2_FUNC(SQR);
-CP2_FUNC(DCPL);
-CP2_FUNC(DPCT);
-CP2_FUNC(AVSZ3);
-CP2_FUNC(AVSZ4);
-CP2_FUNC(RTPT);
-CP2_FUNC(GPF);
-CP2_FUNC(GPL);
-CP2_FUNC(NCCT);
-
-static void recHLE() {
- MOV32ItoR(EAX, (u32)psxHLEt[psxRegs.code & 0xff]);
- CALL32R(EAX);
- branch = 2;
-}
-
-//
-
-static void (*recBSC[64])() = {
- recSPECIAL, recREGIMM, recJ , recJAL , recBEQ , recBNE , recBLEZ, recBGTZ,
- recADDI , recADDIU , recSLTI, recSLTIU, recANDI, recORI , recXORI, recLUI ,
- recCOP0 , recNULL , recCOP2, recNULL , recNULL, recNULL, recNULL, recNULL,
- recNULL , recNULL , recNULL, recNULL , recNULL, recNULL, recNULL, recNULL,
- recLB , recLH , recLWL , recLW , recLBU , recLHU , recLWR , recNULL,
- recSB , recSH , recSWL , recSW , recNULL, recNULL, recSWR , recNULL,
- recNULL , recNULL , recLWC2, recNULL , recNULL, recNULL, recNULL, recNULL,
- recNULL , recNULL , recSWC2, recHLE , recNULL, recNULL, recNULL, recNULL
-};
-
-static void (*recSPC[64])() = {
- recSLL , recNULL, recSRL , recSRA , recSLLV , recNULL , recSRLV, recSRAV,
- recJR , recJALR, recNULL, recNULL, recSYSCALL, recBREAK, recNULL, recNULL,
- recMFHI, recMTHI, recMFLO, recMTLO, recNULL , recNULL , recNULL, recNULL,
- recMULT, recMULTU, recDIV, recDIVU, recNULL , recNULL , recNULL, recNULL,
- recADD , recADDU, recSUB , recSUBU, recAND , recOR , recXOR , recNOR ,
- recNULL, recNULL, recSLT , recSLTU, recNULL , recNULL , recNULL, recNULL,
- recNULL, recNULL, recNULL, recNULL, recNULL , recNULL , recNULL, recNULL,
- recNULL, recNULL, recNULL, recNULL, recNULL , recNULL , recNULL, recNULL
-};
-
-static void (*recREG[32])() = {
- recBLTZ , recBGEZ , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL,
- recNULL , recNULL , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL,
- recBLTZAL, recBGEZAL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL,
- recNULL , recNULL , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL
-};
-
-static void (*recCP0[32])() = {
- recMFC0, recNULL, recCFC0, recNULL, recMTC0, recNULL, recCTC0, recNULL,
- recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL,
- recRFE , recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL,
- recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL
-};
-
-static void (*recCP2[64])() = {
- recBASIC, recRTPS , recNULL , recNULL, recNULL, recNULL , recNCLIP, recNULL, // 00
- recNULL , recNULL , recNULL , recNULL, recOP , recNULL , recNULL , recNULL, // 08
- recDPCS , recINTPL, recMVMVA, recNCDS, recCDP , recNULL , recNCDT , recNULL, // 10
- recNULL , recNULL , recNULL , recNCCS, recCC , recNULL , recNCS , recNULL, // 18
- recNCT , recNULL , recNULL , recNULL, recNULL, recNULL , recNULL , recNULL, // 20
- recSQR , recDCPL , recDPCT , recNULL, recNULL, recAVSZ3, recAVSZ4, recNULL, // 28
- recRTPT , recNULL , recNULL , recNULL, recNULL, recNULL , recNULL , recNULL, // 30
- recNULL , recNULL , recNULL , recNULL, recNULL, recGPF , recGPL , recNCCT // 38
-};
-
-static void (*recCP2BSC[32])() = {
- recMFC2, recNULL, recCFC2, recNULL, recMTC2, recNULL, recCTC2, recNULL,
- recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL,
- recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL,
- recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL, recNULL
-};
-
-static void recRecompile() {
- /* if x86Ptr reached the mem limit reset whole mem */
- if (((u32)x86Ptr - (u32)recMem) >= (RECMEM_SIZE - 0x10000))
- recReset();
-
- PC_REC32(psxRegs.pc) = (u32)x86Ptr;
- pc = psxRegs.pc;
-
- for (count=0; count<500;) {
- char *p;
-
- p = (char *)PSXM(pc);
- if (p == NULL) recError();
- psxRegs.code = *(u32 *)p;
-
- pc+=4; count++;
- recBSC[psxRegs.code>>26]();
-
- if (branch) {
- break;
- }
- }
-
- if (!branch) {
- MOV32ItoM((u32)&psxRegs.pc, pc);
- }
-
- /* store cycle */
- ADD32ItoM((u32)&psxRegs.cycle, count);
-
- branch = 0;
-
- RET();
-}
-
-
-R3000Acpu psxRec = {
- recInit,
- recReset,
- recExecute,
- recExecuteBlock,
- recClear,
- recShutdown
-};