CPlay/gba_header.c
2025-05-12 12:04:24 +02:00

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;
}