// Ta program prebere vsebino Winchester diska, kot jo je poslal HDDump3.asm, // in naredi sliko, ki jo je mogocxe uporabljati v emulatorju, analizirati s // hex editorjem, itd. #include #include #include FILE* Vhod; FILE* Izhod; uint8_t Buffer[3 * (256 + 1)]; // Buffer za 1 sektor; se dekodira na mestu void Napaka (char* Kaj) { fclose(Vhod); fclose(Izhod); if(Kaj) fputs(Kaj, stderr); exit(2); } uint8_t Glasuj (uint8_t* Ptr) { uint8_t A; uint8_t B; uint8_t C; A = Ptr[0]; B = Ptr[1]; if(A != B) { // A in B se ne ujemata; C odlocxa. C = Ptr[2]; fprintf(stderr, "nestrinjanje, A %d, B %d, C %d\n", A, B, C); if(A == C) return A; else if(B == C) return B; else // Vsi so razlicxni. // TODO - s tem se bomo ukvarjali, cxe se bo dejansko zgodilo. Napaka("Motnja v prenosu - naredi sxe en dump\n"); } // Cxe A == B, potem je vrednost C itak napacxna in torej nepomembna. return A; } int main (int argc, char** argv) { size_t Koliko; unsigned int iIzvor; unsigned int iCilj; uint8_t Checksum; uint8_t Rezultat; if(argc != 3) { puts("Uporaba: ParseDmp vhod izhod"); return 0; } Vhod = fopen(argv[1], "rb"); if(!Vhod) { fputs("Vhodne datoteke ni mogocxe odpreti\n", stderr); return 1; } Izhod = fopen(argv[2], "wb"); if(!Izhod) { fputs("Izhodne datoteke ni mogocxe odpreti\n", stderr); fclose(Vhod); return 1; } for(;;) { Koliko = fread(Buffer, 1, sizeof(Buffer), Vhod); if(!Koliko) break; if(Koliko < sizeof(Buffer)) { fprintf( stderr, "%d odvecxnih bajtov; nepopoln dump?\n", sizeof(Buffer) - Koliko ); break; } Checksum = 0; iIzvor = 0; iCilj = 0; while(iIzvor < sizeof(Buffer) - 3 /* brez checksuma */) { //fprintf(stderr, "iIzvor je %d, iCilj je %d\n", iIzvor, iCilj); Rezultat = Glasuj(&Buffer[iIzvor]); Checksum += Rezultat; Buffer[iCilj] = Rezultat; iIzvor += 3; iCilj++; } //fprintf(stderr, "iIzvor je %d, iCilj je %d\n", iIzvor, iCilj); Rezultat = Glasuj(&Buffer[iIzvor]); if(Checksum != Rezultat) { // Izracxunani checksum se ne ujema s Partnerjevim. // TODO - s tem se bomo ukvarjali, cxe se bo dejansko zgodilo. fprintf( stderr, "Napacxen checksum na %d; nasx je %d, prebran je %d\n", ftell(Vhod) - 3, Checksum, Rezultat ); //Napaka(NULL); } if(fwrite(Buffer, 256, 1, Izhod) != 1) Napaka("Napaka pri zapisovanju izhoda; disk poln?"); } fclose(Vhod); fclose(Izhod); return 0; }