void Cartridge::load() { interface->loadRequest(ID::Manifest, "manifest.bml"); Board::load(information.markup); //this call will set Cartridge::board if successful if(board == nullptr) return; sha256_ctx sha; uint8 hash[32]; sha256_init(&sha); sha256_chunk(&sha, board->prgrom.data, board->prgrom.size); sha256_chunk(&sha, board->chrrom.data, board->chrrom.size); sha256_final(&sha); sha256_hash(&sha, hash); string result; for(auto& byte : hash) result.append(hex<2>(byte)); sha256 = result; system.load(); loaded = true; }
string sha256(const uint8_t *data, unsigned size) { sha256_ctx sha; uint8_t hash[32]; sha256_init(&sha); sha256_chunk(&sha, data, size); sha256_final(&sha); sha256_hash(&sha, hash); string result; for(auto &byte : hash) result.append(hex<2>(byte)); return result; }
void Cartridge::load(const string &markup, const stream &memory) { information.markup = markup; board = Board::load(markup, memory); if(board == nullptr) return; interface->memory.append({ID::RAM, "save.ram"}); sha256_ctx sha; uint8_t hash[32]; sha256_init(&sha); sha256_chunk(&sha, board->prgrom.data, board->prgrom.size); sha256_chunk(&sha, board->chrrom.data, board->chrrom.size); sha256_final(&sha); sha256_hash(&sha, hash); string result; for(auto &byte : hash) result.append(hex<2>(byte)); sha256 = result; system.load(); loaded = true; }
/** * sha256_hash: * @s : Output. * @in : Input. * @size : Size of @s. * * Hashes SHA256 and outputs a human readable string. **/ void sha256_hash(char *s, const uint8_t *in, size_t size) { unsigned i; struct sha256_ctx sha; union { uint32_t u32[8]; uint8_t u8[32]; } shahash; sha256_init(&sha); sha256_chunk(&sha, in, size); sha256_final(&sha); sha256_subhash(&sha, shahash.u32); for (i = 0; i < 32; i++) snprintf(s + 2 * i, 3, "%02x", (unsigned)shahash.u8[i]); }
void Cartridge::load(Mode cartridge_mode, const lstring &xml_list) { mode = cartridge_mode; region = Region::NTSC; ram_size = 0; spc7110_data_rom_offset = 0x100000; st_A_ram_size = 0; st_B_ram_size = 0; supergameboy_version = SuperGameBoyVersion::Version1; supergameboy_ram_size = 0; supergameboy_rtc_size = 0; has_bsx_slot = false; has_superfx = false; has_sa1 = false; has_necdsp = false; has_srtc = false; has_sdd1 = false; has_spc7110 = false; has_spc7110rtc = false; has_cx4 = false; has_obc1 = false; has_st0018 = false; has_msu1 = false; has_serial = false; parse_xml(xml_list); //print(xml_list[0], "\n\n"); if(ram_size > 0) { memory::cartram.map(allocate<uint8_t>(ram_size, 0xff), ram_size); } if(has_srtc || has_spc7110rtc) { memory::cartrtc.map(allocate<uint8_t>(20, 0xff), 20); } if(mode == Mode::Bsx) { memory::bsxram.map (allocate<uint8_t>( 32 * 1024, 0xff), 32 * 1024); memory::bsxpram.map(allocate<uint8_t>(512 * 1024, 0xff), 512 * 1024); } if(mode == Mode::SufamiTurbo) { if(st_A_ram_size) memory::stAram.map(allocate<uint8_t>(st_A_ram_size, 0xff), st_A_ram_size); if(st_B_ram_size) memory::stBram.map(allocate<uint8_t>(st_B_ram_size, 0xff), st_B_ram_size); } if(mode == Mode::SuperGameBoy) { if(memory::gbrom.data()) { if(supergameboy_ram_size) memory::gbram.map(allocate<uint8_t>(supergameboy_ram_size, 0xff), supergameboy_ram_size); if(supergameboy_rtc_size) memory::gbrtc.map(allocate<uint8_t>(supergameboy_rtc_size, 0x00), supergameboy_rtc_size); } } memory::cartrom.write_protect(true); memory::cartram.write_protect(false); memory::cartrtc.write_protect(false); memory::bsxflash.write_protect(true); memory::bsxram.write_protect(false); memory::bsxpram.write_protect(false); memory::stArom.write_protect(true); memory::stAram.write_protect(false); memory::stBrom.write_protect(true); memory::stBram.write_protect(false); memory::gbrom.write_protect(true); memory::gbram.write_protect(false); memory::gbrtc.write_protect(false); unsigned checksum = ~0; foreach(n, memory::cartrom ) checksum = crc32_adjust(checksum, n); if(memory::bsxflash.size() != 0 && memory::bsxflash.size() != ~0) foreach(n, memory::bsxflash) checksum = crc32_adjust(checksum, n); if(memory::stArom.size() != 0 && memory::stArom.size() != ~0) foreach(n, memory::stArom ) checksum = crc32_adjust(checksum, n); if(memory::stBrom.size() != 0 && memory::stBrom.size() != ~0) foreach(n, memory::stBrom ) checksum = crc32_adjust(checksum, n); if(memory::gbrom.size() != 0 && memory::gbrom.size() != ~0) foreach(n, memory::gbrom ) checksum = crc32_adjust(checksum, n); crc32 = ~checksum; sha256_ctx sha; uint8_t shahash[32]; sha256_init(&sha); sha256_chunk(&sha, memory::cartrom.data(), memory::cartrom.size()); sha256_final(&sha); sha256_hash(&sha, shahash); string hash; foreach(n, shahash) hash << hex<2>(n); sha256 = hash; bus.load_cart(); system.serialize_init(); loaded = true; }
void Cartridge::load(Mode cartridge_mode) { mode = cartridge_mode; read_header(memory::cartrom.data(), memory::cartrom.size()); if(ram_size > 0) { memory::cartram.map(allocate<uint8_t>(ram_size, 0xff), ram_size); } if(has_srtc || has_spc7110rtc) { memory::cartrtc.map(allocate<uint8_t>(20, 0xff), 20); } if(mode == ModeBsx) { memory::bsxram.map (allocate<uint8_t>( 32 * 1024, 0xff), 32 * 1024); memory::bsxpram.map(allocate<uint8_t>(512 * 1024, 0xff), 512 * 1024); } if(mode == ModeSufamiTurbo) { if(memory::stArom.data()) memory::stAram.map(allocate<uint8_t>(128 * 1024, 0xff), 128 * 1024); if(memory::stBrom.data()) memory::stBram.map(allocate<uint8_t>(128 * 1024, 0xff), 128 * 1024); } if(mode == ModeSuperGameBoy) { if(memory::gbrom.data()) { unsigned ram_size = gameboy_ram_size(); unsigned rtc_size = gameboy_rtc_size(); if(ram_size) memory::gbram.map(allocate<uint8_t>(ram_size, 0xff), ram_size); if(rtc_size) memory::gbrtc.map(allocate<uint8_t>(rtc_size, 0x00), rtc_size); } } memory::cartrom.write_protect(true); memory::cartram.write_protect(false); memory::cartrtc.write_protect(false); memory::bsxflash.write_protect(true); memory::bsxram.write_protect(false); memory::bsxpram.write_protect(false); memory::stArom.write_protect(true); memory::stAram.write_protect(false); memory::stBrom.write_protect(true); memory::stBram.write_protect(false); memory::gbrom.write_protect(true); memory::gbram.write_protect(false); memory::gbrtc.write_protect(false); unsigned checksum = ~0; for(unsigned n = 0; n < memory::cartrom.size(); n++) checksum = crc32_adjust(checksum, memory::cartrom[n]); if(memory::bsxflash.size() != 0 && memory::bsxflash.size() != ~0) for(unsigned n = 0; n < memory::bsxflash.size(); n++) checksum = crc32_adjust(checksum, memory::bsxflash[n]); if(memory::stArom.size() != 0 && memory::stArom.size() != ~0) for(unsigned n = 0; n < memory::stArom.size(); n++) checksum = crc32_adjust(checksum, memory::stArom[n]); if(memory::stBrom.size() != 0 && memory::stBrom.size() != ~0) for(unsigned n = 0; n < memory::stBrom.size(); n++) checksum = crc32_adjust(checksum, memory::stBrom[n]); if(memory::gbrom.size() != 0 && memory::gbrom.size() != ~0) for(unsigned n = 0; n < memory::gbrom.size(); n++) checksum = crc32_adjust(checksum, memory::gbrom[n]); crc32 = ~checksum; #if 0 fprintf(stdout, "crc32 = %.8x\n", (unsigned)crc32); sha256_ctx sha; uint8_t shahash[32]; sha256_init(&sha); sha256_chunk(&sha, memory::cartrom.data(), memory::cartrom.size()); sha256_final(&sha); sha256_hash(&sha, shahash); fprintf(stdout, "sha256 = "); for(unsigned i = 0; i < 32; i++) fprintf(stdout, "%.2x", shahash[i]); fprintf(stdout, "\n"); #endif bus.load_cart(); system.serialize_init(); loaded = true; }