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; }
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++)