#include #include #include // std::cout #include // ifstream, ofstream #include // basename() #include using namespace std; string filePath = ""; vector buffer; int desp = 0x2000; int numBytes = 0x2000; int firstByte = desp + 0x200; int lastByte = desp + numBytes - 1; int checksum1 = desp + 0x270; int checksum2 = desp + 0x271; void checkParameters(int argc, char *argv[]) { if (argc != 2) { cout << "Uso: " << basename(argv[0]) << " FILE" << endl; exit(EXIT_FAILURE); } else filePath = argv[1]; } void loadFile(string s) { ifstream inputFile(s, ios::binary); if (inputFile.good()) buffer.assign(istreambuf_iterator(inputFile), {}); else { cout << "No se puede abrir el archivo: " << s << endl; exit(EXIT_FAILURE); } inputFile.close(); } void saveFile(string s) { ofstream outputFile(s, ios::binary); if (outputFile.good()) { for (auto i : buffer) { outputFile << i; } cout << "Fichero guardado: " << s << endl; } else { cout << "No se puede abrir el archivo: " << s << endl; exit(EXIT_FAILURE); } outputFile.close(); } void printBuffer() { int count = 0; for (auto i : buffer) { cout << static_cast(i) << " "; count++; if (count % 16 == 0) cout << static_cast(i) << endl; } } int calcChecksum() { int sum = 0; for (int i = firstByte; i <= lastByte; i++) { if (i != checksum1 and i != checksum2) sum += static_cast(buffer.at(i)); } sum += 3328; // Corrige el checksum buffer.at(checksum1) = sum % 256; buffer.at(checksum2) = (sum >> 8) % 256; return sum; } int main(int argc, char *argv[]) { checkParameters(argc, argv); loadFile(filePath); int sum = calcChecksum(); saveFile(filePath); cout << hex; cout << "0x" << checksum1 << ": 0x" << static_cast(buffer.at(checksum1)) << endl; cout << "0x" << checksum2 << ": 0x" << static_cast(buffer.at(checksum2)) << endl; cout << "checksum (0x" << firstByte << " .. 0x" << lastByte << "): 0x" << sum << endl; return 0; }