nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include nkeynes@1: #include "ipbin.h" nkeynes@1: #include "gui.h" nkeynes@1: nkeynes@1: static char *dc_peripherals[] = { "Uses WinCE", "Unknown (0x0000002)", nkeynes@1: "Unknown (0x0000004)", "Unknown (0x0000008)", nkeynes@1: "VGA Box", "Unknown (0x0000020)", nkeynes@1: "Unknown (0x0000040)", "Unknown (0x0000080)", nkeynes@1: "Other Expansions", "Puru Puru pack", nkeynes@1: "Mike", "Memory card", nkeynes@1: "Basic controller", "C button", nkeynes@1: "D button", "X button", nkeynes@1: "Y button", "Z button", nkeynes@1: "Expanded direction buttons", nkeynes@1: "Analog R trigger", "Analog L trigger", nkeynes@1: "Analog horizontal", "Analog vertical", nkeynes@1: "Expanded analog horizontal", nkeynes@1: "Expanded analog vertical", nkeynes@1: "Gun", "Keyboard", "Mouse" }; nkeynes@1: nkeynes@1: static uint32_t compute_crc16( dc_bootstrap_head_t h ) nkeynes@1: { nkeynes@1: /* Note: Algorithm taken from http://mc.pp.se/dc/ip0000.bin.html */ nkeynes@1: uint32_t i, c, n = 0xffff; nkeynes@1: char *data = h->product_id; nkeynes@1: for (i = 0; i < 16; i++) nkeynes@1: { nkeynes@1: n ^= (data[i]<<8); nkeynes@1: for (c = 0; c < 8; c++) nkeynes@1: if (n & 0x8000) nkeynes@1: n = (n << 1) ^ 4129; nkeynes@1: else nkeynes@1: n = (n << 1); nkeynes@1: } nkeynes@1: return n & 0xffff; nkeynes@1: } nkeynes@1: nkeynes@1: void parse_ipbin( char *data ) nkeynes@1: { nkeynes@1: struct dc_bootstrap_head *head; nkeynes@1: int i, got, periph, crc, hcrc; nkeynes@1: char *prot_symbols; nkeynes@1: char buf[512]; nkeynes@1: nkeynes@1: /* Dump out the bootstrap metadata table */ nkeynes@1: head = (struct dc_bootstrap_head *)data; nkeynes@1: prot_symbols = ((char *)data) + 0x3700; nkeynes@1: memcpy( buf, head->product_name, 128 ); nkeynes@1: for( i=127; i>0 && buf[i] == ' '; i-- ); nkeynes@1: buf[i] = '\0'; nkeynes@1: periph = strtol( head->peripherals, NULL, 16 ); nkeynes@1: INFO( "Bootstrap loaded, Name: %s Author: %-16.16s", nkeynes@1: buf, head->vendor_id ); nkeynes@1: sprintf( buf, "%4.4s", head->crc ); nkeynes@1: crc = compute_crc16(head); nkeynes@1: hcrc = strtol( buf, NULL, 16 ); nkeynes@10: emit( NULL, crc == hcrc ? EMIT_INFO : EMIT_WARN, MODULE_ID, nkeynes@1: " Header CRC: %04X (Computed %04X)", hcrc, crc ); nkeynes@1: INFO( " Boot File: %-16.16s", head->boot_file ); nkeynes@1: INFO( " Product ID: %-10.10s Product Ver: %-6.6s Date: %-8.8s", nkeynes@1: head->product_id, head->product_ver, head->product_date ); nkeynes@1: INFO( " Disc ID: %-11.11s Regions: %-8.8s Peripherals: %07X", nkeynes@1: head->gdrom_id, head->regions, periph ); nkeynes@1: strcpy( buf, " Supports: " ); nkeynes@1: got = 0; nkeynes@1: for( i=0; i<28; i++ ) { nkeynes@1: if( periph & (1<