mirror of
https://github.com/sigmasternchen/Wish
synced 2025-03-15 15:38:54 +00:00
107 lines
3.2 KiB
JavaScript
107 lines
3.2 KiB
JavaScript
var MBR = function() {
|
|
}
|
|
MBR.main = function(device) {
|
|
console.log("MBR: main");
|
|
console.log("MBR: start Boot Loader");
|
|
Loader.main(device);
|
|
}
|
|
|
|
var Loader = function() {
|
|
}
|
|
Loader.logo = "\033[32m" +
|
|
" .__ .__ \n" +
|
|
"__ _ _|__| _____| |__ \n" +
|
|
"\\ \\/ \\/ / |/ ___/ | \\ \n" +
|
|
" \\ /| |\\___ \\| Y \\\n" +
|
|
" \\/\\_/ |__/____ >___| /\n" +
|
|
" \\/ \\/ \033[31mLoader\033[0m\n";
|
|
Loader.tickid;
|
|
Loader.state;
|
|
Loader.device;
|
|
Loader.config;
|
|
Loader.main = function(device) {
|
|
console.log("Loader: main");
|
|
console.log("Loader: register 100ms-timer");
|
|
Loader.tickid = Emulator.registerTimer(100, Loader.tick);
|
|
console.log("Loader: register key interrupt");
|
|
Emulator.interrupts['key'] = Loader.key;
|
|
Loader.device = device;
|
|
var text = "\033[2J\033[0;0H\033[?25l" + Loader.logo + "\033[s";
|
|
Emulator.output(text);
|
|
Loader.state = 0;
|
|
}
|
|
Loader.key = function(keycode) {
|
|
if (KeyCodes.isEnter(keycode)) {
|
|
Loader.boot();
|
|
return;
|
|
}
|
|
var char = KeyCodes.normalKey(keycode);
|
|
if (char == 'w') Loader.selected--;
|
|
if (char == 's') Loader.selected++;
|
|
Loader.selected %= Loader.config.systems.length;
|
|
if (Loader.selected < 0)
|
|
Loader.selected += Loader.config.systems.length;
|
|
Loader.outputSystems();
|
|
}
|
|
Loader.tick = function() {
|
|
switch(Loader.state) {
|
|
case 0:
|
|
console.log("Loader: load config");
|
|
Loader.config = JSON.parse(Emulator.Request.get(Loader.device.name + "/" + Loader.device.mbr + "/config.json", "", false, ret))
|
|
Loader.selected = Loader.config.default;
|
|
Loader.state++;
|
|
break;
|
|
case 1:
|
|
Loader.outputSystems();
|
|
Loader.state++;
|
|
break;
|
|
case 2:
|
|
break;
|
|
case 3:
|
|
Emulator.output(".");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
Loader.outputSystems = function() {
|
|
console.log("Loader: display menu");
|
|
var systems = Loader.config.systems;
|
|
var text = "\033[u\n\n\n\n";
|
|
for(var i = 0; i < systems.length; i++) {
|
|
var string = "-> " + systems[i].label + " " + systems[i].kernel;
|
|
var length = Emulator.Output.xsize - string.length - 10
|
|
text += "\033[5C\033[46m\033[31m" + ((i == Loader.selected) ? "->" : " ") + " \033[30m" + systems[i].label + " \033[34m" + systems[i].kernel;
|
|
for (var j = 0; j < length; j++)
|
|
text += " ";
|
|
text += "\033[0m\n";
|
|
}
|
|
text += "\n\nSelect OS to boot... [w, s]";
|
|
Emulator.output(text);
|
|
}
|
|
Loader.boot = function() {
|
|
var device = Emulator.Devices.getHarddisks();
|
|
var system = Loader.config.systems[Loader.selected];
|
|
device = device[system.hdd];
|
|
var partition = device.partitions[system.partition];
|
|
var loadstring = device.name + "/" + partition.name + "/" + system.kernel
|
|
Emulator.output("\n\nTrying to boot " + loadstring + "..");
|
|
Loader.state = 3;
|
|
Emulator.Request.include(loadstring, Loader.finished);
|
|
}
|
|
Loader.finished = function() {
|
|
console.log("Loader: stop BIOS");
|
|
console.log("loader: remove all event handlers");
|
|
Emulator.interrupts = new Array();
|
|
Emulator.unregisterTimer(Loader.tickid);
|
|
console.log("Loader: start OS");
|
|
var system = Loader.config.systems[Loader.selected];
|
|
try {
|
|
OS.main(system);
|
|
Emulator.output("\nKernel loaded successfully.");
|
|
} catch (exception) {
|
|
console.dir(exception);
|
|
Emulator.output("\nFailed to load kernel...\n\n");
|
|
Emulator.output("\033[31msystem halt\033[0m");
|
|
}
|
|
}
|