+static int extract_text(char *dest, unsigned char *src, int len, int swab)\r
+{\r
+ char *p = dest;\r
+ int i;\r
+\r
+ if (swab) swab = 1;\r
+\r
+ for (i = len - 1; i >= 0; i--)\r
+ {\r
+ if (src[i^swab] != ' ') break;\r
+ }\r
+ len = i + 1;\r
+\r
+ for (i = 0; i < len; i++)\r
+ {\r
+ unsigned char s = src[i^swab];\r
+ if (s >= 0x20 && s < 0x7f && s != '#' && s != '|' &&\r
+ s != '[' && s != ']' && s != '\\')\r
+ {\r
+ *p++ = s;\r
+ }\r
+ else\r
+ {\r
+ sprintf(p, "\\%02x", s);\r
+ p += 3;\r
+ }\r
+ }\r
+\r
+ return p - dest;\r
+}\r
+\r
+char *emu_makeRomId(void)\r
+{\r
+ static char id_string[3+0x11+0x11+0x30+16];\r
+ unsigned char *id_header;\r
+ int pos;\r
+\r
+ if (Pico.rom == NULL) {\r
+ id_string[0] = 0;\r
+ return id_string;\r
+ }\r
+\r
+ if (PicoMCD & 1) {\r
+ id_header = scd_id_header;\r
+ strcpy(id_string, "CD|");\r
+ } else {\r
+ id_header = Pico.rom + 0x100;\r
+ strcpy(id_string, "MD|");\r
+ }\r
+ pos = 3;\r
+\r
+ pos += extract_text(id_string + pos, id_header + 0x80, 0x10, 1); // seral\r
+ id_string[pos] = '|'; pos++;\r
+ pos += extract_text(id_string + pos, id_header + 0xf0, 0x10, 1); // region\r
+ id_string[pos] = '|'; pos++;\r
+ pos += extract_text(id_string + pos, id_header + 0x50, 0x30, 1); // overseas name\r
+ id_string[pos] = 0;\r
+\r
+ printf("id_string: %s\n", id_string);\r
+ return id_string;\r
+}\r
+\r