58 lines
1.9 KiB
C
58 lines
1.9 KiB
C
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
#define HEADER_SIZE 192 // GBA header is 192 bytes
|
|
|
|
// Structure to hold GBA ROM header data
|
|
typedef struct {
|
|
uint32_t entry_point; // 0x08000000 - Entry Point
|
|
uint8_t nintendo_logo[156]; // 0x08000004 - Nintendo Logo
|
|
char game_title[12]; // 0x080000A0 - Game Title
|
|
char game_code[4]; // 0x080000AC - Game Code (e.g., "AGB-XXXX")
|
|
char maker_code[2]; // 0x080000B0 - Maker Code
|
|
uint8_t fixed_value; // 0x080000B2 - Always 0x96
|
|
uint8_t main_unit_code; // 0x080000B3 - Usually 0x00
|
|
uint8_t device_type; // 0x080000B4 - Usually 0x00
|
|
uint8_t reserved1[7]; // 0x080000B5 - Reserved
|
|
uint8_t software_version; // 0x080000BC - Software Version
|
|
uint8_t complement_check; // 0x080000BD - Header Checksum
|
|
uint8_t reserved2[2]; // 0x080000BE - Reserved
|
|
} GBAHeader;
|
|
|
|
// Function to read and display the ROM header
|
|
void read_gba_header(const char *filename) {
|
|
FILE *file = fopen(filename, "rb");
|
|
if (!file) {
|
|
perror("Error opening file");
|
|
return;
|
|
}
|
|
|
|
GBAHeader header;
|
|
|
|
// Read 192-byte header
|
|
if (fread(&header, 1, HEADER_SIZE, file) != HEADER_SIZE) {
|
|
perror("Error reading header");
|
|
fclose(file);
|
|
return;
|
|
}
|
|
|
|
fclose(file);
|
|
|
|
// Display ROM header information
|
|
printf("Game Title: %.12s\n", header.game_title);
|
|
printf("Game Code: %.4s\n", header.game_code);
|
|
printf("Maker Code: %.2s\n", header.maker_code);
|
|
printf("Software Version: %d\n", header.software_version);
|
|
printf("Complement Checksum: 0x%02X\n", header.complement_check);
|
|
printf("Entry Point: 0x%08X\n", header.entry_point);
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
if (argc < 2) {
|
|
printf("Usage: %s <gba_rom_file>\n", argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
read_gba_header(argv[1]);
|
|
return 0;
|
|
}
|