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