Beispiel #1
0
void dma_pi_write()
{
   unsigned long longueur;
   int i;

   if (pi_register.pi_cart_addr_reg < 0x10000000)
     {
	if (pi_register.pi_cart_addr_reg >= 0x08000000 &&
	    pi_register.pi_cart_addr_reg < 0x08010000)
	  {
	     if (use_flashram != 1)
	       {

		  for (i=0; i<(pi_register.pi_wr_len_reg & 0xFFFFFF)+1; i++)
		    ((unsigned char*)rdram)[(pi_register.pi_dram_addr_reg+i)^S8]=
		    sram[(((pi_register.pi_cart_addr_reg-0x08000000)&0xFFFF)+i)^S8];
		  use_flashram = -1;
	       }
	     else
	       dma_read_flashram();
	  }
	else if (pi_register.pi_cart_addr_reg >= 0x06000000 &&
		 pi_register.pi_cart_addr_reg < 0x08000000)
	  {
	  }
//	else
//	  printf("unknown dma write:%x\n", (int)pi_register.pi_cart_addr_reg);

	pi_register.read_pi_status_reg |= 1;
	update_count();
	add_interupt_event(PI_INT, /*pi_register.pi_wr_len_reg*/0x1000);

	return;
     }

   if (pi_register.pi_cart_addr_reg >= 0x1fc00000) // for paper mario
     {
	pi_register.read_pi_status_reg |= 1;
	update_count();
	add_interupt_event(PI_INT, 0x1000);
	return;
     }

   longueur = (pi_register.pi_wr_len_reg & 0xFFFFFF)+1;
   i = (pi_register.pi_cart_addr_reg-0x10000000)&0x3FFFFFF;
   longueur = (i + longueur) > rom_length ?
     (rom_length - i) : longueur;
   longueur = (pi_register.pi_dram_addr_reg + longueur) > MEMMASK ?
     (MEMMASK - pi_register.pi_dram_addr_reg) : longueur;

   if(i>rom_length || pi_register.pi_dram_addr_reg > MEMMASK)
     {
	pi_register.read_pi_status_reg |= 3;
	update_count();
	add_interupt_event(PI_INT, longueur/8);
	return;
     }

   ROMCache_read(rdramb + pi_register.pi_dram_addr_reg, (pi_register.pi_cart_addr_reg-0x10000000)&0x3FFFFFF, longueur);

   if(!interpcore)
     {
	for (i=0; i<longueur; i++)
	  {
	     unsigned long rdram_address1 = pi_register.pi_dram_addr_reg+i+0x80000000;
	     unsigned long rdram_address2 = pi_register.pi_dram_addr_reg+i+0xa0000000;

	     invalidate_func(rdram_address1);
	     invalidate_func(rdram_address2);
	  }
     }

   // Set the RDRAM memory size when copying main ROM code
   // (This is just a convenient way to run this code once at the beginning)
   if (pi_register.pi_cart_addr_reg == 0x10001000)
     {
	switch(CIC_Chip)
	  {
	   case 1:
	   case 2:
	   case 3:
	   case 6:
#ifdef USE_EXPANSION
	     rdram[0x318/4] = 0x800000;
#else
	     rdram[0x318/4] = 0x400000;
#endif
	     break;
	   case 5:
#ifdef USE_EXPANSION
	     rdram[0x3F0/4] = 0x800000;
#else
	     rdram[0x3F0/4] = 0x400000;
#endif
	     break;
	  }
	  /* DK64 Fix */
	/*if(strncmp(ROM_HEADER->nom, "DONKEY KONG 64", 14) == 0)
		rdram[0x2FE1C0/4] = 0xAD170014;*/
     }

   pi_register.read_pi_status_reg |= 3;
   update_count();
   add_interupt_event(PI_INT, longueur/8);
   return;
}
Beispiel #2
0
void dma_pi_write()
{
   unsigned long longueur;
   int i;
   
   if (pi_register.pi_cart_addr_reg < 0x10000000)
     {
	if (pi_register.pi_cart_addr_reg >= 0x08000000 &&
	    pi_register.pi_cart_addr_reg < 0x08010000)
	  {
	     if (use_flashram != 1)
	       {
		  char *filename;
		  FILE *f;
		  int i;
		  filename = (char*)malloc(strlen(get_savespath())+
				    strlen(ROM_SETTINGS.goodname)+4+1);
		  strcpy(filename, get_savespath());
		  strcat(filename, ROM_SETTINGS.goodname);
		  strcat(filename, ".sra");
		  f = fopen(filename, "rb");
		  if (f)
		    {
		       fread(sram, 1, 0x8000, f);
		       fclose(f);
		    }
		  else for (i=0; i<0x8000; i++) sram[i] = 0x0;
		  free(filename);
		  for (i=0; i<(pi_register.pi_wr_len_reg & 0xFFFFFF)+1; i++)
		    ((unsigned char*)rdram)[(pi_register.pi_dram_addr_reg+i)^S8]=
		    sram[(((pi_register.pi_cart_addr_reg-0x08000000)&0xFFFF)+i)^S8];
		  use_flashram = -1;
	       }
	     else
	       dma_read_flashram();
	  }
	else if (pi_register.pi_cart_addr_reg >= 0x06000000 &&
		 pi_register.pi_cart_addr_reg < 0x08000000)
	  {
	  }
	else
	  printf("unknown dma write:%x\n", (int)pi_register.pi_cart_addr_reg);
	
	pi_register.read_pi_status_reg |= 1;
	update_count();
	add_interupt_event(PI_INT, /*pi_register.pi_wr_len_reg*/0x1000);
     
	return;
     }
   
   if (pi_register.pi_cart_addr_reg >= 0x1fc00000) // for paper mario
     {
	pi_register.read_pi_status_reg |= 1;
	update_count();
	add_interupt_event(PI_INT, 0x1000);
	return;
     }
   
   longueur = (pi_register.pi_wr_len_reg & 0xFFFFFF)+1;
   i = (pi_register.pi_cart_addr_reg-0x10000000)&0x3FFFFFF;
   longueur = (i + longueur) > taille_rom ?
     (taille_rom - i) : longueur;
   longueur = (pi_register.pi_dram_addr_reg + longueur) > 0x7FFFFF ?
     (0x7FFFFF - pi_register.pi_dram_addr_reg) : longueur;
   
   if(i>taille_rom || pi_register.pi_dram_addr_reg > 0x7FFFFF)
     {
	pi_register.read_pi_status_reg |= 3;
	update_count();
	add_interupt_event(PI_INT, longueur/8);
	return;
     }
   
   if(!interpcore)
     {
	for (i=0; i<longueur; i++)
	  {
	     unsigned long rdram_address1 = pi_register.pi_dram_addr_reg+i+0x80000000;
	     unsigned long rdram_address2 = pi_register.pi_dram_addr_reg+i+0xa0000000;
	     
	     ((unsigned char*)rdram)[(pi_register.pi_dram_addr_reg+i)^S8]=
	       rom[(((pi_register.pi_cart_addr_reg-0x10000000)&0x3FFFFFF)+i)^S8];
	     
	     if(!invalid_code[rdram_address1>>12])
	       if(blocks[rdram_address1>>12]->block[(rdram_address1&0xFFF)/4].ops != NOTCOMPILED)
		 invalid_code[rdram_address1>>12] = 1;
	     
	     if(!invalid_code[rdram_address2>>12])
	       if(blocks[rdram_address2>>12]->block[(rdram_address2&0xFFF)/4].ops != NOTCOMPILED)
		 invalid_code[rdram_address2>>12] = 1;
	  }
     }
   else
     {
	for (i=0; i<longueur; i++)