From 968a715cab33c1ee519900f7de2b0ecee58735ea Mon Sep 17 00:00:00 2001 From: Romain Dolbeau Date: Sat, 28 Jun 2025 14:54:41 +0200 Subject: [PATCH] add sun3 checksumming helper --- RomPatcher/patcher/Makefile | 5 ++- RomPatcher/patcher/sun3_checksum.c | 49 ++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 RomPatcher/patcher/sun3_checksum.c diff --git a/RomPatcher/patcher/Makefile b/RomPatcher/patcher/Makefile index 49dd775..fcfc50e 100644 --- a/RomPatcher/patcher/Makefile +++ b/RomPatcher/patcher/Makefile @@ -10,7 +10,7 @@ YACC=bison -d #--report-file=bison.log --report=all CC=gcc CFLAGS=-O2 -all: patcher genlink +all: patcher genlink sun3_checksum %.o: %.c $(CC) $(CFLAGS) $< -c -o $@ @@ -21,6 +21,9 @@ patcher: $(PATCHEROBJ) $(OOBJ) genlink: $(GENLINKOBJ) $(OOBJ) $(CC) $(CFLAGS) $^ -o $@ +sun3_checksum: sun3_checksum.c + $(CC) $(CFLAGS) $< -o $@ + parser_par.h: parser_par.o parser_par.o: parser_par.y diff --git a/RomPatcher/patcher/sun3_checksum.c b/RomPatcher/patcher/sun3_checksum.c new file mode 100644 index 0000000..8081159 --- /dev/null +++ b/RomPatcher/patcher/sun3_checksum.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +#include + + +int +main ( int argc, char **argv ) +{ + int fd, r; + unsigned char* adr = NULL; + struct stat st; + size_t size, i; + unsigned short int sum; + + if (argc < 2) { + fprintf(stderr, "One argument needed: path to file to checksum\n"); + exit(-1); + } + + fd = open(argv[1], O_RDONLY ); + if (fd <= 0) { + fprintf(stderr, "Can't open file\n"); + exit(-2); + } + r = fstat(fd, &st); + if (r < 0) { + fprintf(stderr, "Can't stat file\n"); + exit(-3); + } + size = st.st_size; + + adr = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0); + if (adr == MAP_FAILED) { + fprintf(stderr, "Can't mmap file\n"); + exit(-3); + } + + sum = 0; + for (i = 0 ; i < size-2 ; i++) { + sum += adr[i]; + } + + printf("Checksum is 0x%04x\n", sum); + + return 0; +}