void load_rom(const char *fname, const char *sname, int zoom) { uint8_t *start_of_rom; int cart_type; init_memory(); fp = os_open_file_r(fname); if (fp == INVALID_FILE_HANDLE) { os_perr("Couldn't read ROM file"); exit_err(); } save = os_open_file_rw(sname); if (save == INVALID_FILE_HANDLE) { save = os_create_file_rw(sname); if (save == INVALID_FILE_HANDLE) { os_close_file(fp); os_perr("Couldn't create save file"); exit_err(); } } start_of_rom = alloc_mem(0x150); if (start_of_rom == NULL) { os_perr("Couldn't allocate memory"); exit_err(); } os_file_read(fp, 0x150, start_of_rom); if (memcmp(id, start_of_rom + 0x104, sizeof(id))) { os_eprint("Bad ROM!\n"); exit_err(); } os_print("Loading \""); for (int i = 0x134; i < 0x143; i++) { if (!start_of_rom[i]) break; os_print("%c", start_of_rom[i]); } if (start_of_rom[0x143] & 0x80) gbc_mode = 1; else gbc_mode = 0; os_print("\", %s...\n", gbc_mode ? "GBC" : "GB"); cart_type = start_of_rom[0x147]; rom_size = start_of_rom[0x148]; ram_size = start_of_rom[0x149]; switch (rom_size) { case 0x52: rom_size = 72; break; case 0x53: rom_size = 80; break; case 0x54: rom_size = 96; break; default: if (rom_size > 6) { os_eprint("Invalid ROM size 0x%02X.\n", rom_size); exit_err(); } rom_size = 2 << rom_size; } switch (ram_size) { case 0: ram_size = 0; break; case 1: case 2: ram_size = 1; break; case 3: ram_size = 4; break; case 4: ram_size = 16; break; default: os_eprint("Invalid RAM size 0x%02X.\n", ram_size); exit_err(); } os_print("%i ROM banks, %i RAM banks.\n", rom_size, ram_size); #ifdef MAP_BATTERY os_resize_file(save, ram_size * 8192); #endif switch (cart_type) { CART_TYPE(0x00, 0, 0, 0, 0, 0); CART_TYPE(0x01, 1, 0, 0, 0, 0); CART_TYPE(0x02, 1, 1, 0, 0, 0); CART_TYPE(0x03, 1, 1, 1, 0, 0); CART_TYPE(0x05, 2, 0, 0, 0, 0); CART_TYPE(0x06, 2, 0, 1, 0, 0); CART_TYPE(0x08, 0, 1, 0, 0, 0); CART_TYPE(0x09, 0, 1, 1, 0, 0); CART_TYPE(0x0F, 3, 0, 1, 1, 0); CART_TYPE(0x10, 3, 1, 1, 1, 0); CART_TYPE(0x11, 3, 0, 0, 0, 0); CART_TYPE(0x12, 3, 1, 0, 0, 0); CART_TYPE(0x13, 3, 1, 1, 0, 0); CART_TYPE(0x19, 5, 0, 0, 0, 0); CART_TYPE(0x1A, 5, 1, 0, 0, 0); CART_TYPE(0x1B, 5, 1, 1, 0, 0); CART_TYPE(0x1C, 5, 0, 0, 0, 1); CART_TYPE(0x1D, 5, 1, 0, 0, 1); CART_TYPE(0x1E, 5, 1, 1, 0, 1); default: os_eprint("Unknown cartridge type 0x%02X.\n", cart_type); exit_err(); } os_print("Cartridge type: ROM"); if (mbc) os_print("+MBC%i", mbc); if (ext_ram) os_print("+RAM"); if (batt) os_print("+BATT"); if (rtc) os_print("+TIMER"); if (rmbl) os_print("+RUMBLE"); os_print("\n"); load_memory(); run(zoom); }
void os_printz(const char *str) { os_print(str, strlen(str)); }