>main --> savestates.c
- New line 38, inserted after original line 37
#include "../r4300/new_dynarec/new_dynarec.h"
- New lines 184-188, replaces original line 183
#ifdef NEW_DYNAREC
gzwrite(f, &pcaddr, 4);
#else
gzwrite(f, &PC->addr, 4);
#endif
- New lines 304-313, replaces original lines 299-303
#ifdef NEW_DYNAREC
gzread(f, &pcaddr, 4);
pending_exception = 1;
invalidate_all_pages();
#else
int i;
gzread(f, &queuelength, 4);
for (i = 0; i < 0x100000; i++)
invalid_code[i] = 1;
jump_to(queuelength);
#endif
>memory --> dma.c
- New line 34, inserted after original line 33
#include "../r4300/new_dynarec/new/dynarec.h"
- New lines 207-211, inserted after original line 205
if(!blocks[rdram_address1>>12])
{
invalid_code[rdram_address1>>12] = 1;
}
else
- New lines 216-218, inserted after original line 209
#ifdef NEW_DYNAREC
invalidate_block(rdram_address1>>12);
#endif
- New lines 222-226, inserted after original line 212
if(!blocks[rdram_address2>>12])
{
invalid_code[rdram_address2>>12] = 1;
}
else
>memory --> memory.c
- New line 29, inserted after original line 28
#include <sys/mman.h>
- New lines 61-63, replaces original line 60
#if defined(__x86_64__) || defined(NO_ASM) || (!defined(__i386__)&&!defined(__arm__))
unsigned int rdram[0x800000/4] __attribute__((aligned(16)));
#endif
- New lines 73-75, replaces original line 70
#if defined(NO_ASM) || !defined(__arm__)
unsigned int address = 0;
#endif
- New lines 84-89, replaces original lines 79-82
#if defined(NO_ASM) || !defined(__arm__)
unsigned int word;
unsigned char byte;
unsigned short hword;
unsigned long long int dword;
#endif
- New lines 153-162, replaces original line 146
if((int)rdram!=0x80000000) {
for (i=0; i<(0x800000/4); i++) rdram[i]=0;
}
else {
munmap ((void*)0x80000000, 0x800000);
if(mmap ((void*)0x80000000, 0x800000,
PROT_READ | PROT_WRITE,
MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS,
-1, 0) <= 0) {printf("mmap(0x80000000) failed\n");}
}
>r430 >x86 --> gr4300.c
- New lines 671-674, replaces original lines 671-673
cmp_reg32_imm8(reg, 5);
jbe_rj(18);
sub_reg32_imm32(reg, 2); // 6
- New line 999, replaces original line 998
genupdate_count(dst->addr+4);
- New line 1040, replaces original line 1039
genupdate_count(dst->addr+4);
>r4300 --> bc.c
- New lines 140-143, replaces original lines 140-141
else {
PC+=2;
update_count();
}
- New lines 165-168, replaces original lines 163-164
else {
PC+=2;
update_count();
}
- New lines 202-205, replaces original lines 202-203
else {
PC+=2;
update_count();
}
- New lines 227-230, replaces original lines 221-222
else {
PC+=2;
update_count();
}
>r4300 --> cop0.c
- New lines 34-35, inserted after original line 33
case 9: // Count
update_count();
- New line 77, from original line 75, commented out
- New line 121, moved from original line 121 to after original line 118
update_count();
>r4300 --> interupt.c
- New line 44, inserted after original line 43
- New lines 610-618, replaces original line 609
#ifdef NEW_DYNAREC
EPC = pcaddr;
pcaddr = 0x80000180;
Status |= 2;
Cause &= 0x7FFFFFFF;
pending_exception=1;
#else
exception_general();
#endif
>r4300 --> r4300.c
- New line 31, inserted after original line 30
#include "new_dynarec/new_dynarec.h"
- New lines 41-64, replaces orginal lines 40-54
int llbit, rompause;
#if defined(NO_ASM) || !defined(__arm__)
int stop;
long long int reg[32], hi, lo;
unsigned int reg_cop0[32];
#endif
long long int local_rs, local_rt;
int local_rs32, local_rt32;
unsigned int jump_target;
#if defined(NO_ASM) || !defined(__arm__)
float *reg_cop1_simple[32];
double *reg_cop1_double[32];
int FCR0, FCR31;
#endif
int reg_cop1_fgr_32[32];
long long int reg_cop1_fgr_64[32];
tlb tlb_e[32];
unsigned int delay_slot, skip_jump = 0, dyna_interp = 0, last_addr;
unsigned long long int debug_count = 0;
unsigned int CIC_Chip;
#if defined(NO_ASM) || !defined(__arm__)
unsigned int next_interupt;
precomp_instr *PC;
#endif
- New lines 1528-1535, replaces original lines 1519-1524
#if !defined(NEW_DYNAREC)
if (PC->addr < last_addr)
{
printf("PC->addr < last_addr\n");
}
Count = Count + (PC->addr - last_addr)/2;
last_addr = PC->addr;
#endif
- New lines 1840-1854, replaces original lines 1829-1837
#if !defined(NO_ASM) && (defined(__i386__) || defined(__x86_64__) || defined(__arm__))
else if (dynacore == 1)
{
dynacore = 1;
printf ("R4300 Core mode: Dynamic Recompiler\n");
init_blocks();
code = (void *)(actual->code+(actual->block[0x40/4].local_addr));
#ifdef NEW_DYNAREC
new_dynarec_init();
new_dyna_start();
new_dynarec_cleanup();
#else
dyna_start(code);
PC++;
#endif
>r4300 --> regimm.c
- New lines 141-144, replaces original lines 141-142
else {
PC+=2;
update_count();
}
- New lines 165-168, replaces original lines 163-164
else {
PC+=2;
update_count();
}
- New lines 201-204, replaces original lines 197-198
else {
PC+=2;
update_count();
}
- New lines 225-228, replaces original lines 219-220
else {
PC+=2;
update_count();
}
>r4300 --> tlb.c
- New lines 253-312, inserted after original line 234
//#ifdef NEW_DYNAREC
extern unsigned int memory_map[1048576];
extern unsigned int using_tlb;
#include <assert.h>
void TLBWI_new(void)
{
unsigned int i;
/* Remove old entries */
unsigned int old_start_even=tlb_e[Index&0x3F].start_even;
unsigned int old_end_even=tlb_e[Index&0x3F].end_even;
unsigned int old_start_odd=tlb_e[Index&0x3F].start_odd;
unsigned int old_end_odd=tlb_e[Index&0x3F].end_odd;
for (i=old_start_even>>12; i<=old_end_even>>12; i++)
{
if(i<0x80000||i>0xBFFFF)
{
invalidate_block(i);
memory_map[i]=-1;
}
}
for (i=old_start_odd>>12; i<=old_end_odd>>12; i++)
{
if(i<0x80000||i>0xBFFFF)
{
invalidate_block(i);
memory_map[i]=-1;
}
}
TLBWI();
//printf("TLBWI: index=%d\n",Index);
//printf("TLBWI: start_even=%x end_even=%x phys_even=%x v=%d d=%d\n",tlb_e[Index&0x3F].start_even,tlb_e[Index&0x3F].end_even,tlb_e[Index&0x3F].phys_even,tlb_e[Index&0x3F].v_even,tlb_e[Index&0x3F].d_even);
//printf("TLBWI: start_odd=%x end_odd=%x phys_odd=%x v=%d d=%d\n",tlb_e[Index&0x3F].start_odd,tlb_e[Index&0x3F].end_odd,tlb_e[Index&0x3F].phys_odd,tlb_e[Index&0x3F].v_odd,tlb_e[Index&0x3F].d_odd);
/* Combine tlb_LUT_r, tlb_LUT_w, and invalid_code into a single table
for fast look up. */
for (i=tlb_e[Index&0x3F].start_even>>12; i<=tlb_e[Index&0x3F].end_even>>12; i++)
{
//printf("%x: r:%8x w:%8x\n",i,tlb_LUT_r[i],tlb_LUT_w[i]);
if(i<0x80000||i>0xBFFFF)
{
if(tlb_LUT_r[i]) {
memory_map[i]=((tlb_LUT_r[i]&0xFFFFF000)-(i<<12)+(unsigned int)rdram-0x80000000)>>2;
// FIXME: should make sure the physical page is invalid too
if(!tlb_LUT_w[i]||!invalid_code[i]) {
memory_map[i]|=0x40000000; // Write protect
}else{
assert(tlb_LUT_r[i]==tlb_LUT_w[i]);
}
if(!using_tlb) printf("Enabled TLB\n");
// Tell the dynamic recompiler to generate tlb lookup code
using_tlb=1;
}
else memory_map[i]=-1;
}
//printf("memory_map[%x]: %8x (+%8x)\n",i,memory_map[i],memory_map[i]<<2);
}
for (i=tlb_e[Index&0x3F].start_odd>>12; i<=tlb_e[Index&0x3F].end_odd>>12; i++)
{
//printf("%x: r:%8x w:%8x\n",i,tlb_LUT_r[i],tlb_LUT_w[i]);
if(i<0x80000||i>0xBFFFF)
{
if(tlb_LUT_r[i]) {
memory_map[i]=((tlb_LUT_r[i]&0xFFFFF000)-(i<<12)+(unsigned int)rdram-0x80000000)>>2;
// FIXME: should make sure the physical page is invalid too
if(!tlb_LUT_w[i]||!invalid_code[i]) {
memory_map[i]|=0x40000000; // Write protect
}else{
assert(tlb_LUT_r[i]==tlb_LUT_w[i]);
}
if(!using_tlb) printf("Enabled TLB\n");
// Tell the dynamic recompiler to generate tlb lookup code
using_tlb=1;
}
else memory_map[i]=-1;
}
//printf("memory_map[%x]: %8x (+%8x)\n",i,memory_map[i],memory_map[i]<<2);
}
}
- New lines 500-572, inserted after original line 421
//#ifdef NEW_DYNAREC
void TLBWR_new(void)
{
unsigned int i;
Random = (Count/2 % (32 - Wired)) + Wired;
/* Remove old entries */
unsigned int old_start_even=tlb_e[Random&0x3F].start_even;
unsigned int old_end_even=tlb_e[Random&0x3F].end_even;
unsigned int old_start_odd=tlb_e[Random&0x3F].start_odd;
unsigned int old_end_odd=tlb_e[Random&0x3F].end_odd;
for (i=old_start_even>>12; i<=old_end_even>>12; i++)
{
if(i<0x80000||i>0xBFFFF)
{
invalidate_block(i);
memory_map[i]=-1;
}
}
for (i=old_start_odd>>12; i<=old_end_odd>>12; i++)
{
if(i<0x80000||i>0xBFFFF)
{
invalidate_block(i);
memory_map[i]=-1;
}
}
TLBWR();
/* Combine tlb_LUT_r, tlb_LUT_w, and invalid_code into a single table
for fast look up. */
for (i=tlb_e[Random&0x3F].start_even>>12; i<=tlb_e[Random&0x3F].end_even>>12; i++)
{
//printf("%x: r:%8x w:%8x\n",i,tlb_LUT_r[i],tlb_LUT_w[i]);
if(i<0x80000||i>0xBFFFF)
{
if(tlb_LUT_r[i]) {
memory_map[i]=((tlb_LUT_r[i]&0xFFFFF000)-(i<<12)+(unsigned int)rdram-0x80000000)>>2;
// FIXME: should make sure the physical page is invalid too
if(!tlb_LUT_w[i]||!invalid_code[i]) {
memory_map[i]|=0x40000000; // Write protect
}else{
assert(tlb_LUT_r[i]==tlb_LUT_w[i]);
}
if(!using_tlb) printf("Enabled TLB\n");
// Tell the dynamic recompiler to generate tlb lookup code
using_tlb=1;
}
else memory_map[i]=-1;
}
//printf("memory_map[%x]: %8x (+%8x)\n",i,memory_map[i],memory_map[i]<<2);
}
for (i=tlb_e[Random&0x3F].start_odd>>12; i<=tlb_e[Random&0x3F].end_odd>>12; i++)
{
//printf("%x: r:%8x w:%8x\n",i,tlb_LUT_r[i],tlb_LUT_w[i]);
if(i<0x80000||i>0xBFFFF)
{
if(tlb_LUT_r[i]) {
memory_map[i]=((tlb_LUT_r[i]&0xFFFFF000)-(i<<12)+(unsigned int)rdram-0x80000000)>>2;
// FIXME: should make sure the physical page is invalid too
if(!tlb_LUT_w[i]||!invalid_code[i]) {
memory_map[i]|=0x40000000; // Write protect
}else{
assert(tlb_LUT_r[i]==tlb_LUT_w[i]);
}
if(!using_tlb) printf("Enabled TLB\n");
// Tell the dynamic recompiler to generate tlb lookup code
using_tlb=1;
}
else memory_map[i]=-1;
}
//printf("memory_map[%x]: %8x (+%8x)\n",i,memory_map[i],memory_map[i]<<2);
}
}