Initial import
This commit is contained in:
11
README.md
Normal file
11
README.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
VaxCheck
|
||||||
|
========
|
||||||
|
|
||||||
|
Calculate (and optionally write) VAX ROM checksums
|
||||||
|
|
||||||
|
The method used is a simple rotate-left-and-add over the
|
||||||
|
bytes of a ROM image, excluding the final checksum byte.
|
||||||
|
|
||||||
|
This is done on a per physical ROM basis, not for the
|
||||||
|
whole ROM memory space as a whole, so there are four
|
||||||
|
checksum bytes, one per physical ROM.
|
||||||
77
vaxcheck.c
Normal file
77
vaxcheck.c
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
if (argc < 2) {
|
||||||
|
printf("Usage: vaxcheck <filename.rom> [<output.rom>]\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argc > 3) {
|
||||||
|
printf("Usage: vaxcheck <filename.rom> [<output.rom>]\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int f = open(argv[1], O_RDONLY);
|
||||||
|
|
||||||
|
if (!f) {
|
||||||
|
printf("Unable to open %s for reading\n", argv[1]);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
lseek(f, 3, SEEK_SET);
|
||||||
|
|
||||||
|
uint8_t v[5];
|
||||||
|
read(f, v, 5);
|
||||||
|
if ((v[1] != 0x55) ||
|
||||||
|
(v[2] != 0xAA) ||
|
||||||
|
(v[3] != 0x33)) {
|
||||||
|
printf("File is not a VAX ROM image\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t romsize = v[4] << 10;
|
||||||
|
|
||||||
|
printf("ROM is a %d byte VAX ROM image, with rom ID of %d\n", romsize, v[0]);
|
||||||
|
|
||||||
|
lseek(f, 0, SEEK_SET);
|
||||||
|
|
||||||
|
int out = -1;
|
||||||
|
if (argc == 3) {
|
||||||
|
out = open(argv[2], O_RDWR | O_TRUNC | O_CREAT, 0644);
|
||||||
|
if (!out) {
|
||||||
|
printf("Unable to open %s for writing\n", argv[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t r2 = 0;
|
||||||
|
uint8_t r3 = 0; // Accumulator
|
||||||
|
uint8_t r4 = 0; // Test byte
|
||||||
|
for (r2 = 0; r2 < (romsize-1); r2++) {
|
||||||
|
read(f, &r4, 1);
|
||||||
|
if (out) {
|
||||||
|
write(out, &r4, 1);
|
||||||
|
}
|
||||||
|
uint8_t tmp = r3 >> 7;
|
||||||
|
r3 = (r3 << 1) | tmp;
|
||||||
|
r3 = r3 + r4;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t cs;
|
||||||
|
read(f, &cs, 1);
|
||||||
|
|
||||||
|
printf("Current checksum: 0x%02x\n", cs);
|
||||||
|
printf("Calculated checksum: 0x%02x\n", r3);
|
||||||
|
|
||||||
|
if (out) {
|
||||||
|
write(out, &r3, 1);
|
||||||
|
close(out);
|
||||||
|
}
|
||||||
|
close(f);
|
||||||
|
|
||||||
|
return !(r3 == cs);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user