/// <summary>Crea un tipo especifico de cartucho</summary> /// <param name="nombreFichero">Ruta al fichero del cartucho</param> /// <returns>Cartucho listo para leer y escribir</returns> public static Cartucho cargarCartucho(string nombreFichero) { Cartucho cartucho; // Carga los primeros 16 kb del cartucho (tamanyo minimo) para conocer el tipo de cartucho FileStream fs = File.OpenRead(nombreFichero); byte[] rom = new byte[0x4000]; fs.Read(rom, 0, 0x4000); fs.Close(); switch(rom[0x0147]){ case 0x00: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM Only case 0x01: cartucho = new CartuchoMBC1(nombreFichero); break; // ROM + MBC1 case 0x02: cartucho = new CartuchoMBC1(nombreFichero); break; // ROM + MBC1 + RAM case 0x03: cartucho = new CartuchoMBC1(nombreFichero); break; // ROM + MBC1 + RAM + BATTERY // case 0x04: case 0x05: cartucho = new CartuchoMBC2(nombreFichero); break; // ROM + MBC2 case 0x06: cartucho = new CartuchoMBC2(nombreFichero); break; // ROM + MBC2 + BATTERY // case 0x07: case 0x08: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + RAM case 0x09: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + RAM + BATTERY // case 0x0A: // case 0x0B: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + MMM01 // case 0x0C: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + MMM01 + SRAM // case 0x0D: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + MMM01 + SRAM + BATTERY // case 0x0E: // case 0x0F: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 + TIMER + BATTERY // case 0x10: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 + TIMER + RAM + BATTERY case 0x11: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 case 0x12: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 + RAM case 0x13: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 + RAM + BATTERY // case 0x14: // case 0x15: cartucho = new CartuchoMBC4(nombreFichero); break; // ROM + MBC4 // case 0x16: cartucho = new CartuchoMBC4(nombreFichero); break; // ROM + MBC4 + RAM // case 0x17: cartucho = new CartuchoMBC4(nombreFichero); break; // ROM + MBC4 + RAM + BATTERY // case 0x18: case 0x19: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 case 0x1A: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RAM case 0x1B: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RAM + BATTERY // case 0x1C: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RUMBLE // case 0x1D: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RUMBLE + SRAM // case 0x1E: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RUMBLE + SRAM + BATTERY // case 0x1F: cartucho = new CartuchoMBC0(nombreFichero); break; // POCKET CAMERA // case 0xFD: cartucho = new CartuchoMBC0(nombreFichero); break; // BANDAI TAMA5 // case 0xFE: cartucho = new CartuchoMBC3(nombreFichero); break; // HUDSON HuC-3 // case 0xFF: cartucho = new CartuchoMBC1(nombreFichero); break; // HUDSON HuC-1 default: throw new System.Exception("[ERROR] Tipo de cartucho " + rom[0x0147] + " desconocido"); } if (rom[0x143] == 0x80) throw new System.Exception("[ERROR] GameBoy Color no soportada"); // if (rom[0x146] != 0x00) throw new System.Exception("[ERROR] SuperGameBoy no soportada"); return cartucho; }
/// <summary>Crea un tipo especifico de cartucho</summary> /// <param name="nombreFichero">Ruta al fichero del cartucho</param> /// <returns>Cartucho listo para leer y escribir</returns> public static Cartucho cargarCartucho(string nombreFichero) { Cartucho cartucho; // Carga los primeros 16 kb del cartucho (tamanyo minimo) para conocer el tipo de cartucho FileStream fs = File.OpenRead(nombreFichero); byte[] rom = new byte[0x4000]; fs.Read(rom, 0, 0x4000); fs.Close(); switch (rom[0x0147]) { case 0x00: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM Only case 0x01: cartucho = new CartuchoMBC1(nombreFichero); break; // ROM + MBC1 case 0x02: cartucho = new CartuchoMBC1(nombreFichero); break; // ROM + MBC1 + RAM case 0x03: cartucho = new CartuchoMBC1(nombreFichero); break; // ROM + MBC1 + RAM + BATTERY // case 0x04: case 0x05: cartucho = new CartuchoMBC2(nombreFichero); break; // ROM + MBC2 case 0x06: cartucho = new CartuchoMBC2(nombreFichero); break; // ROM + MBC2 + BATTERY // case 0x07: case 0x08: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + RAM case 0x09: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + RAM + BATTERY // case 0x0A: // case 0x0B: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + MMM01 // case 0x0C: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + MMM01 + SRAM // case 0x0D: cartucho = new CartuchoMBC0(nombreFichero); break; // ROM + MMM01 + SRAM + BATTERY // case 0x0E: // case 0x0F: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 + TIMER + BATTERY // case 0x10: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 + TIMER + RAM + BATTERY case 0x11: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 case 0x12: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 + RAM case 0x13: cartucho = new CartuchoMBC3(nombreFichero); break; // ROM + MBC3 + RAM + BATTERY // case 0x14: // case 0x15: cartucho = new CartuchoMBC4(nombreFichero); break; // ROM + MBC4 // case 0x16: cartucho = new CartuchoMBC4(nombreFichero); break; // ROM + MBC4 + RAM // case 0x17: cartucho = new CartuchoMBC4(nombreFichero); break; // ROM + MBC4 + RAM + BATTERY // case 0x18: case 0x19: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 case 0x1A: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RAM case 0x1B: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RAM + BATTERY // case 0x1C: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RUMBLE // case 0x1D: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RUMBLE + SRAM // case 0x1E: cartucho = new CartuchoMBC5(nombreFichero); break; // ROM + MBC5 + RUMBLE + SRAM + BATTERY // case 0x1F: cartucho = new CartuchoMBC0(nombreFichero); break; // POCKET CAMERA // case 0xFD: cartucho = new CartuchoMBC0(nombreFichero); break; // BANDAI TAMA5 // case 0xFE: cartucho = new CartuchoMBC3(nombreFichero); break; // HUDSON HuC-3 // case 0xFF: cartucho = new CartuchoMBC1(nombreFichero); break; // HUDSON HuC-1 default: throw new System.Exception("[ERROR] Tipo de cartucho " + rom[0x0147] + " desconocido"); } if (rom[0x143] == 0x80) { throw new System.Exception("[ERROR] GameBoy Color no soportada"); } // if (rom[0x146] != 0x00) throw new System.Exception("[ERROR] SuperGameBoy no soportada"); return(cartucho); }