int cbm2rom_load_kernal(const char *rom_name) { if (!rom_loaded) return 0; /* init not far enough */ /* De-initialize kbd-buf, autostart and tape stuff here before reloading the ROM the traps are installed in. */ kbdbuf_init(0, 0, 0, 0); autostart_init(0, 0, 0, 0, 0, 0); tape_init(&tapeinit); /* Load Kernal ROM. */ if (!util_check_null_string(rom_name)) { if (sysfile_load(rom_name, mem_rom + 0xe000, 0x2000, 0x2000) < 0) { log_error(cbm2rom_log, "Couldn't load ROM `%s'.", rom_name); return -1; } } return cbm2rom_checksum(); }
static int mem_read_rom_snapshot_module(snapshot_t *p) { BYTE vmajor, vminor; snapshot_module_t *m; BYTE config; int i, trapfl; m = snapshot_module_open(p, module_rom_name, &vmajor, &vminor); if (m == NULL) return 0; /* optional */ if (vmajor != CBM2ROM_DUMP_VER_MAJOR) { snapshot_module_close(m); return -1; } /* disable traps before loading the ROM */ resources_get_int("VirtualDevices", &trapfl); resources_set_int("VirtualDevices", 0); SMR_B(m, &config); /* kernal */ SMR_BA(m, mem_rom + 0xe000, 0x2000); /* basic */ SMR_BA(m, mem_rom + 0x8000, 0x4000); /* chargen */ if (config & 32) { SMR_BA(m, mem_chargen_rom, 0x1000); } else { SMR_BA(m, mem_chargen_rom, 0x0800); SMR_BA(m, mem_chargen_rom + 0x1000, 0x0800); /* Inverted chargen into second half. This is a hardware feature. */ for (i = 0; i < 2048; i++) { mem_chargen_rom[i + 2048] = mem_chargen_rom[i] ^ 0xff; mem_chargen_rom[i + 6144] = mem_chargen_rom[i + 4096] ^ 0xff; } } if (config & 2) { SMR_BA(m, mem_rom + 0x1000, 0x1000); } if (config & 4) { SMR_BA(m, mem_rom + 0x2000, 0x2000); } if (config & 8) { SMR_BA(m, mem_rom + 0x4000, 0x2000); } if (config & 16) { SMR_BA(m, mem_rom + 0x6000, 0x2000); } log_warning(cbm2_snapshot_log, "Dumped Romset files and saved settings will " "represent\nthe state before loading the snapshot!"); cbm2rom_checksum(); /* enable traps again when necessary */ resources_set_int("VirtualDevices", trapfl); snapshot_module_close(m); return 0; }