DOOM64-RE

Doom 64 Reverse Engineering
Log | Files | Refs | README | LICENSE

commit 350fe5f40140bc367c0b24e7af123363a96587ce
parent 33814501c0d0619efeb42caed5ec8bb7b38e3b42
Author: thekovic <72971433+thekovic@users.noreply.github.com>
Date:   Sat,  9 Jul 2022 21:19:21 +0200

Added support for USA Revision 1 ROM to extractor

Extractor now compiles as pure C

Diffstat:
Adoom64/Tools/dm64ex.c | 220+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ddoom64/Tools/dm64ex.cpp | 222-------------------------------------------------------------------------------
2 files changed, 220 insertions(+), 222 deletions(-)

diff --git a/doom64/Tools/dm64ex.c b/doom64/Tools/dm64ex.c @@ -0,0 +1,220 @@ +// ===================================================================== +// DOOM 64 EXTRACTOR +// ===================================================================== + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <stdarg.h> + +typedef unsigned char byte; + +void show_info(void) +{ + printf("\n"); + printf(" ################(ERICK194)################\n"); + printf(" # DOOM 64 EXTRACTOR #\n"); + printf(" # CREATED BY ERICK VASQUEZ GARCIA #\n"); + printf(" # Doom 64.z64 #\n"); + printf(" # (USA/EUR/JAP) VERSION #\n"); + printf(" # #\n"); + printf(" # USE: #\n"); + printf(" # Doom64Extractor.exe -i \"RomImage.z64\" #\n"); + printf(" ##########################################\n"); + printf("\n"); +} + +void do_error(const char *s, ...) +{ + va_list args; + va_start(args, s); + vfprintf(stderr, s, args); + fprintf(stderr, "\n"); + va_end(args); + exit(0); +} + +byte header[65]; +int region = -1; + +int read_header(FILE *f, int offset) +{ + byte a; + + fseek(f, offset, SEEK_SET); + + for (int i = 0; i < 64; i++) + { + fread(&a, sizeof(byte), 1, f); + header[i] = a; + } + + if (header[0x3E] == 0x45) // Region USA + { + if (header[0x10] == 0xA8) // Original release + { + region = 0; + printf("Region USA\n"); + } + else if (header[0x10] == 0x42) // Revision 1 release + { + region = 3; + printf("Region USA, Revision 1\n"); + } + else + { + do_error("Error Region %d\n", region); + exit(0); + } + } + else if (header[0x3E] == 0x50) // Region EUR + { + region = 1; + printf("Region EUR\n"); + } + else if (header[0x3E] == 0x4A) // Region JAP + { + region = 2; + printf("Region JAP\n"); + } + else + { + do_error("Error Region %d\n", region); + exit(0); + } + + return 0; +} + +byte name1[6] = {'D', 'o', 'o', 'm', '6', '4'}; // Usa, Eur +byte name2[6] = {'D', 'O', 'O', 'M', '6', '4'}; // Jap + +int check_name(void) +{ + for (int i = 0; i < 6; i++) + { + if (region == 2) // Jap + { + if (header[0x20 + i] != name2[i]) + { + return 0; + } + } + else + { + if (header[0x20 + i] != name1[i]) + { + return 0; + } + } + } + + return 1; +} + +int WAD_offset[4] = {0x63D10 , 0x63F60 , 0x64580 , 0x63DC0}; +int WAD_size[4] = {0x5D18B0, 0x5D6CDC, 0x5D8478, 0x5D301C}; + +int WMD_offset[4] = {0x6355C0, 0x63AC40, 0x63CA00, 0x636DE0}; +int WMD_size[4] = {0xB9E0 , 0xB9E0 , 0xB9E0 , 0xB9E0}; + +int WSD_offset[4] = {0x640FA0, 0x646620, 0x6483E0, 0x6427C0}; +int WSD_size[4] = {0x142F8 , 0x142F8 , 0x142F8 , 0x142F8}; + +int WDD_offset[4] = {0x6552A0, 0x65A920, 0x65C6E0, 0x656AC0}; +int WDD_size[4] = {0x1716C4, 0x1716C4, 0x1716C4, 0x1716C4}; + +int main(int argc, char *argv[]) +{ + byte a; + + // Parse arguments + char *romname; + for (int i = 1; i < argc; i++) + { + if (argv[i][0] == '-') + { + if (!strcmp(argv[i], "-i")) + { + i++; + romname = argv[i]; + } + } + } + + show_info(); + if (argc == 1) + { + exit(0); + } + + FILE *in, *out; + in = fopen(romname, "rb"); + + if (!in) + { + do_error("Cannot open %s\n", romname); + exit(0); + } + + read_header(in, 0); + + if (!check_name()) + { + do_error("Not a Doom 64 Rom\n"); + exit(0); + } + + // Extract the file DOOM64.WAD + printf("Extracting DOOM64.WAD "); + fseek(in, WAD_offset[region], SEEK_SET); + out = fopen("DOOM64.WAD", "wb"); + for (int i = 0; i < WAD_size[region]; i++) + { + fread(&a, sizeof(byte), 1, in); + fwrite(&a, sizeof(byte), 1, out); + } + fclose(out); + printf("Ok\n"); + + // Extract the file DOOM64.WMD + printf("Extracting DOOM64.WMD "); + fseek(in, WMD_offset[region], SEEK_SET); + out = fopen("DOOM64.WMD", "wb"); + for (int i = 0; i < WMD_size[region]; i++) + { + fread(&a, sizeof(byte), 1, in); + fwrite(&a, sizeof(byte), 1, out); + } + fclose(out); + printf("Ok\n"); + + // Extract the file DOOM64.WSD + printf("Extracting DOOM64.WSD "); + fseek(in, WSD_offset[region], SEEK_SET); + out = fopen("DOOM64.WSD", "wb"); + for (int i = 0; i < WSD_size[region]; i++) + { + fread(&a, sizeof(byte), 1, in); + fwrite(&a, sizeof(byte), 1, out); + } + fclose(out); + printf("Ok\n"); + + // Extract the file DOOM64.WDD + printf("Extracting DOOM64.WDD "); + fseek(in, WDD_offset[region], SEEK_SET); + out = fopen("DOOM64.WDD", "wb"); + for (int i = 0; i < WDD_size[region]; i++) + { + fread(&a, sizeof(byte), 1, in); + fwrite(&a, sizeof(byte), 1, out); + } + fclose(out); + printf("Ok\n"); + + fclose(in); + + printf("\nCompleted\n"); + return 0; +} diff --git a/doom64/Tools/dm64ex.cpp b/doom64/Tools/dm64ex.cpp @@ -1,222 +0,0 @@ -// =================================================================================================================== -// DOOM 64 EXTRACTOR -// =================================================================================================================== -// how to compile: g++ -o dm64ex dm64ex.cpp -static -// =================================================================================================================== - -#include <cstring> -#include <stdio.h> -#include <vector> -#include <cstdarg> -#include <string> - -typedef unsigned char byte; - -void ShowInfo(void) -{ - printf("\n ################"); - printf("(ERICK194)"); - printf("################\n"); - printf(" # DOOM 64 EXTRACTOR #\n"); - printf(" # CREATED BY ERICK VASQUEZ GARCIA #\n"); - printf(" # Doom 64.z64 #\n"); - printf(" # (USA/EUP/JAP) VERSION #\n"); - printf(" # #\n"); - printf(" # USE: #\n"); - printf(" # Doom64Extractor.exe -i \"RomImage.z64\" #\n"); - printf(" ##########################################\n"); - printf("\n"); -} - -void Error(const char *s,...) -{ - va_list args; - va_start(args,s); - vfprintf(stderr,s,args); - fprintf(stderr,"\n"); - va_end(args); - exit(0); -} - -byte header[65]; -int region = -1; - -int ReadHeader(FILE *f, int offset) -{ - byte a; - - fseek(f, offset, SEEK_SET); - - for(int i = 0; i < 64; i++) - { - fread (&a, sizeof(byte), 1, f); - header[i] = a; - } - - if(header[0x3E] == 0x45) // Region USA - { - region = 0; - printf("Region USA\n"); - } - else if(header[0x3E] == 0x50) // Region EUP - { - region = 1; - printf("Region EUP\n"); - } - else if(header[0x3E] == 0x4A) // Region JAP - { - region = 2; - printf("Region JAP\n"); - } - else - { - Error("Error Region %d\n", region); - exit(0); - } - - return 0; -} - -byte name1[6] = {'D','o','o','m','6','4'};// Usa, Eup -byte name2[6] = {'D','O','O','M','6','4'};// Jap - -int CheckName(void) -{ - int i; - int rtn; - - rtn = 1; - for(i = 0; i < 6; i++) - { - if(region == 2) // Jap - { - if(header[0x20 + i] != name2[i]) - { - rtn = 0; - break; - } - } - else - { - if(header[0x20 + i] != name1[i]) - { - rtn = 0; - break; - } - } - } - - return rtn; -} - -int WAD_offset[3] = {0x63D10 , 0x63F60 , 0x64580}; -int WAD_size[3] = {0x5D18B0, 0x5D6CDC, 0x5D8478}; - -int WMD_offset[3] = {0x6355C0, 0x63AC40, 0x63CA00}; -int WMD_size[3] = {0xB9E0 , 0xB9E0 , 0xB9E0}; - -int WSD_offset[3] = {0x640FA0, 0x646620, 0x6483E0}; -int WSD_size[3] = {0x142F8 , 0x142F8 , 0x142F8}; - -int WDD_offset[3] = {0x6552A0, 0x65A920, 0x65C6E0}; -int WDD_size[3] = {0x1716C4, 0x1716C4, 0x1716C4}; - -int main(int argc, char *argv[]) -{ - int i; - byte a; - - // Parse arguments - char *romname; - for ( int i=1; i<argc; i++) - { - if ( argv[i][0] == '-' ) - { - if(!strcmp(argv[i],"-i")) - { - i++; - romname = argv[i]; - } - } - } - - ShowInfo(); - if ( argc == 1 ) - { - exit(0); - } - - FILE *in, *out; - in = fopen(romname,"rb"); - //in = fopen("Doom 64 (Europe).z64","rb"); - //in = fopen("Doom 64 (Japan).z64","rb"); - - if(!in) - { - Error("Cannot open %s\n", romname); - exit(0); - } - - ReadHeader(in, 0); - - //printf("CheckName :: %d\n", CheckName()); - if(CheckName() == 0) - { - Error("Not a Doom 64 Rom\n"); - exit(0); - } - - // Extract the file DOOM64.WAD - printf("Extracting DOOM64.WAD "); - fseek(in, WAD_offset[region], SEEK_SET); - out = fopen("DOOM64.WAD","wb"); - for(i = 0; i < WAD_size[region]; i++) - { - fread (&a, sizeof(byte), 1, in); - fwrite (&a, sizeof(byte), 1, out); - } - fclose(out); - printf("Ok\n"); - - - // Extract the file DOOM64.WMD - printf("Extracting DOOM64.WMD "); - fseek(in, WMD_offset[region], SEEK_SET); - out = fopen("DOOM64.WMD","wb"); - for(i = 0; i < WMD_size[region]; i++) - { - fread (&a, sizeof(byte), 1, in); - fwrite (&a, sizeof(byte), 1, out); - } - fclose(out); - printf("Ok\n"); - - // Extract the file DOOM64.WSD - printf("Extracting DOOM64.WSD "); - fseek(in, WSD_offset[region], SEEK_SET); - out = fopen("DOOM64.WSD","wb"); - for(i = 0; i < WSD_size[region]; i++) - { - fread (&a, sizeof(byte), 1, in); - fwrite (&a, sizeof(byte), 1, out); - } - fclose(out); - printf("Ok\n"); - - // Extract the file DOOM64.WDD - printf("Extracting DOOM64.WDD "); - fseek(in, WDD_offset[region], SEEK_SET); - out = fopen("DOOM64.WDD","wb"); - for(i = 0; i < WDD_size[region]; i++) - { - fread (&a, sizeof(byte), 1, in); - fwrite (&a, sizeof(byte), 1, out); - } - fclose(out); - printf("Ok\n"); - - fclose(in); - - printf("\nCompleted\n"); - return 0; -}