Mon 9 Dec 23:50:44 CET 2024
This commit is contained in:
parent
135f5d6e42
commit
5c19bc262b
153
webv86/web/app.js
Normal file
153
webv86/web/app.js
Normal file
|
@ -0,0 +1,153 @@
|
|||
var emulator, zoom = 1, cdrom={url: "basekernel.iso"}, serialLine="",
|
||||
debugMode = false
|
||||
|
||||
function loadCDROM(url) {
|
||||
if (typeof process == 'object' && process.__nwjs) {
|
||||
try {
|
||||
var fs = require('fs')
|
||||
cdrom = { _url:url,
|
||||
buffer: Uint8Array.from(fs.readFileSync((process.env.PWD||process.env.HOME||process.env.CWD)+'/'+url)).buffer }
|
||||
} catch (e) {
|
||||
alert(e.toString())
|
||||
}
|
||||
}
|
||||
}
|
||||
loadCDROM(cdrom.url)
|
||||
|
||||
function createEmulator() {
|
||||
emulator = new V86({
|
||||
wasm_path : "v86.wasm",
|
||||
memory_size : 64 * 1024 * 1024, // 64 MB memory ought to be enough for anyone
|
||||
vga_memory_size : 2 * 1024 * 1024,
|
||||
screen_container : screen_container,
|
||||
bios : {url: "seabios.bin"},
|
||||
vga_bios : {url: "vgabios.bin"},
|
||||
cdrom : cdrom,
|
||||
hda : {
|
||||
buffer: new Uint8Array(16*1024*1024).buffer
|
||||
},
|
||||
boot_order : 0x123,
|
||||
autostart : true
|
||||
})
|
||||
}
|
||||
createEmulator()
|
||||
|
||||
emulator.add_listener("serial0-output-byte", function(byte) {
|
||||
var char = String.fromCharCode(byte);
|
||||
// console.log('serial0-output-byte',char,byte,serialLine);
|
||||
if(char === "\n")
|
||||
{
|
||||
console.log(serialLine)
|
||||
terminal0Queue.push(serialLine);
|
||||
serialLine=""
|
||||
return;
|
||||
} else
|
||||
serialLine += char
|
||||
})
|
||||
$('#debugger').terminal(function(command) {
|
||||
var tokens = command.split(' ')
|
||||
switch (tokens[0]) {
|
||||
case 'help':
|
||||
this.echo([
|
||||
'debug #on',
|
||||
'dumpidt',
|
||||
'dumpregs',
|
||||
'dumpstate',
|
||||
'reboot',
|
||||
'restart',
|
||||
'run',
|
||||
'stop',
|
||||
'zoom #scale'
|
||||
].join('\n'))
|
||||
break;
|
||||
case 'debug':
|
||||
debugMode=tokens[1]=='0'?false:true
|
||||
break;
|
||||
case 'dumpregs':
|
||||
this.echo(emulator.v86.cpu.debug.get_regs_short()[0].split(' ').filter(x => x).join('\n'))
|
||||
break;
|
||||
case 'dumpidt':
|
||||
var _debug = debugMode
|
||||
debugMode=1
|
||||
this.echo(emulator.v86.cpu.debug.dump_idt())
|
||||
debugMode=_debug
|
||||
break;
|
||||
case 'dumpstate':
|
||||
this.echo(emulator.v86.cpu.debug.get_state().split(' ').filter(x => (x&&x.length>2)).join('\n'))
|
||||
break;
|
||||
case 'reboot':
|
||||
loadCDROM(cdrom.url||cdrom._url);
|
||||
emulator.destroy();
|
||||
createEmulator();
|
||||
break;
|
||||
case 'restart':
|
||||
emulator.restart()
|
||||
break;
|
||||
case 'run':
|
||||
this.echo("Resumed VM. Use stop to suspend VM.")
|
||||
emulator.run()
|
||||
break;
|
||||
case 'stop':
|
||||
emulator.stop()
|
||||
this.echo("Stopped VM. Use run to resume")
|
||||
break;
|
||||
case 'zoom':
|
||||
zoom=Number(tokens[1]||1)
|
||||
resizeAll()
|
||||
break;
|
||||
}
|
||||
}, {
|
||||
greetings: '### VM86 Debugger ###',
|
||||
height:280
|
||||
});
|
||||
$('#terminal').terminal(function(command) {
|
||||
emulator.serial0_send(command+'\n');
|
||||
}, {
|
||||
greetings: '### Serial Console ###',
|
||||
height:280
|
||||
});
|
||||
var terminal0 = $('#terminal').terminal(),
|
||||
terminal0Queue = []
|
||||
$('#terminal').terminal().echo("Ready.")
|
||||
// get the debug output the hard way
|
||||
consoleCallback=function (message) {
|
||||
// terminal0.echo(message)
|
||||
if (debugMode && message!=undefined) terminal0Queue.push(message)
|
||||
}
|
||||
setInterval(function () {
|
||||
if (terminal0Queue.length) {
|
||||
terminal0.echo(terminal0Queue.join('\n'))
|
||||
terminal0Queue=[]
|
||||
}
|
||||
},200);
|
||||
|
||||
function resizeAll() {
|
||||
var vmcell = $('#vmcell'),
|
||||
vmcanv = $('canvas'),
|
||||
win = $(window)
|
||||
// console.log(vmcell.width(),vmcanv.width(),vmcanv.height())
|
||||
if (vmcanv.height()>100) {
|
||||
vmcell.css('max-width',(vmcanv.width()*zoom+30)+'px')
|
||||
vmcell.css('width',(vmcanv.width()*zoom+30)+'px')
|
||||
vmcell.css('height',(Math.floor(vmcanv.height()*zoom*1.1+30)+'px'))
|
||||
}
|
||||
vmcanv[0].style='display:block;transform:scale('+zoom+','+(zoom*1.1)+');'
|
||||
}
|
||||
|
||||
setInterval(resizeAll,1000)
|
||||
$("#terminal").on('click', function() {
|
||||
$("#terminal").css("border","2px solid white");
|
||||
$("#debugger").css("border","1px solid white");
|
||||
$("#vmcell").css("border","1px solid white");
|
||||
});
|
||||
$("#debugger").on('click', function() {
|
||||
$("#debugger").css("border","2px solid white");
|
||||
$("#terminal").css("border","1px solid white");
|
||||
$("#vmcell").css("border","1px solid white");
|
||||
});
|
||||
$("canvas").on('click', function() {
|
||||
$("#debugger").css("border","1px solid white");
|
||||
$("#terminal").css("border","1px solid white");
|
||||
$("#vmcell").css("border","2px solid white");
|
||||
});
|
||||
$("#vmcell").css("border","2px solid white");
|
Loading…
Reference in New Issue
Block a user