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