This commit is contained in:
copy 2014-01-10 23:10:35 +01:00
parent 7125269d55
commit 4133a07e72
6 changed files with 814 additions and 206 deletions

View file

@ -8,38 +8,148 @@
<textarea readonly id="log" style="display:none"></textarea>
<div>
<a href="/v86/">To fast version</a>
<div id="boot_options">
CD image: <input type="file" id="cd_image"><br>
<small>(Bootable El Torito)</small><br><br>
Floppy disk image: <input type="file" id="floppy_image"><br>
<small>(1.44 or 2.88)</small><br><br>
Hard drive disk image: <input type="file" id="hd_image"><br>
<small></small><br><br>
<hr>
or <input type="button" value="Start FreeDOS" id="start_freedos">
<div id="runtime_infos" style="display: none">
Running: <span id="running_time">0s</span> <br>
Speed: <span id="speed">0</span>kIPS<br>
Avg speed: <span id="avg_speed">0</span>kIPS<br>
<br>
<div id="info_hda">
<b>HDA</b><br>
Sectors read: <span id="info_hda_sectors_read"></span><br>
Bytes read: <span id="info_hda_bytes_read"></span><br>
Sectors written: <span id="info_hda_sectors_written"></span><br>
Bytes written: <span id="info_hda_bytes_written"></span><br>
<br>
<br>
<input type="button" value="Start Linux" id="start_linux">
<input type="button" value="Start KolibriOS" id="start_koli">
<input type="button" value="Start Windows" id="start_win101">
<input type="button" value="Start OpenBSD" id="start_bsd">
<input type="button" value="Start Test" id="start_test">
</div>
<div id="info_cdrom">
<b>CDROM</b><br>
Sectors read: <span id="info_cdrom_sectors_read"></span><br>
Bytes read: <span id="info_cdrom_bytes_read"></span><br>
<br>
</div>
<b>VGA</b><br>
Mode: <span id="info_vga_mode"></span><br>
Resolution: <span id="info_res">-</span><br>
BPP: <span id="info_bpp">-</span><br>
<br>
Mouse: <span id="info_mouse_enabled">-</span><br>
<!-- Keyboard: <span id="info_keyboard_enabled">-</span><br> -->
</div>
<div>
<div id="boot_options">
<h4>Debugger</h4>
<input type="button" value="KolibriOS (1.4 MB)" id="start_koli">
<input type="button" value="Linux 2.6 (4.9 MB)" id="start_linux">
<input type="button" value="Windows 1.01 (1.4 MB)" id="start_win101">
<input type="button" value="FreeDOS (0.7 MB)" id="start_freedos">
<input type="button" value="OpenBSD (1.4 MB)" id="start_bsd">
<input type="button" value="Test" id="start_test">
<br>
<hr>
<table>
<tr>
<td width="250">CD image</td>
<td>
<!--
<select>
<option>None</option>
<option>Local file</option>
<option>External Server</option>
</select>-->
<input type="file" id="cd_image">
</td>
</tr>
<tr>
<td>Floppy disk image</td>
<td> <input type="file" id="floppy_image"><br></td>
</tr>
<tr>
<td>Hard drive disk image</td>
<td><input type="file" id="hd_image"><br></td>
</tr>
<tr>
<td colspan="2"><hr></td>
</tr>
<tr>
<td>Memory size</td>
<td>
<input id="memory_size" type="number" value="64" min="16" max="2048" step="16"> MB<br>
</td>
</tr>
<tr>
<td>Video Memory size</td>
<td>
<input id="video_memory_size" type="number" value="8" min="1" max="16" step="1"> MB<br>
</td>
</tr>
<tr>
<td colspan="2"><hr></td>
</tr>
<!--
<tr>
<td>Execution Cap </td>
<td> <input type="number" value="100" min="5" max="100" step="5"> %<br> </td>
</tr>
-->
<tr>
<td>Boot order</td>
<td>
<select id="boot_order">
<option value="231">Floppy / CD / Hard Disk</option>
<option value="321">Floppy / Hard Disk / CD</option>
<option value="213">CD / Floppy / Hard Disk</option>
<option value="123">CD / Hard Disk / Floppy</option>
<option value="312">Hard Disk / Floppy / CD</option>
<option value="132">Hard Disk / CD / Floppy</option>
</select>
</td>
</tr>
</table>
<br>
<button id="start_emulation">Start Emulation</button>
<!--
<br>
<div id="setup_error">Error: Video size must be at least over 9000</div>
-->
<!--
<br>
<br>
Link to this configuration: <a href="" id="config_link">http://copy.sh/v24/?a=b&amp;c=d</a>
-->
</div>
<div id="runtime_options" style="display: none">
<input type="button" value="Step" id="step">
<input type="button" value="Run until" id="run_until">
<input type="button" value="Debugger" id="debugger">
<input type="button" value="Dump Instructions" id="dump_instructions">
<input type="button" value="Dump Registers" id="dump_regs">
<input type="button" value="Dump GDT/LDT" id="dump_gdt">
<input type="button" value="Dump IDT" id="dump_idt">
<input type="button" value="Dump page tables" id="dump_pt">
<input type="button" value="Memory Dump" id="memory_dump">
<br>
<div id="log_levels"></div>
<div id="log_levels"><b>Log:</b></div>
<input type="button" value="Pause" id="run">
<input type="button" value="Reset" id="reset">
<input type="button" value="Send Ctrl-Alt-Del" id="ctrlaltdel">
<input type="button" value="Get floppy image" id="get_floppy">
<input type="button" value="Get floppy image" id="get_fda_image">
<input type="button" value="Get floppy image" id="get_fdb_image">
<input type="button" value="Get HDA image" id="get_hda_image">
<input type="button" value="Get HDB image" id="get_hdb_image">
<input type="button" value="Lock mouse" id="lock_mouse">
<input type="button" value="Go fullscreen" id="fullscreen">
<input type="button" value="Take screenshot (only graphic modes)" id="take_screenshot">
@ -47,17 +157,11 @@
Scale:
<input type="number" min="0.25" step="0.25" value="1.0" id="scale" style="width: 50px">
<div id="info">
<div>running <span id="running_time"></span>s</div>
<div>speed <span id="speed"></span>kIPS</div>
</div>
</div>
<pre style="display: none" id="loading"></pre>
<br>
<br>
</div>
<div id="screen_container">
@ -65,7 +169,15 @@
<canvas id="vga"></canvas>
</div>
<br style="clear:both">
<textarea cols="80" rows="25" id="serial" style="display:none">
</textarea>
<input class="phone_keyboard">
<span style="clear:both"></span>
<input type="text" class="phone_keyboard" style="display: none">
<br>
<hr>
<a href="/v86/">To fast version</a>

View file

@ -6,46 +6,154 @@
<script src="v86_all.js"></script>
<link rel="stylesheet" href="v86.css">
<textarea readonly id="log" style="display:none"></textarea>
<textarea readonly id="log" style="display: none"></textarea>
<div id="runtime_infos" style="display: none">
Running: <span id="running_time">0s</span> <br>
Speed: <span id="speed">0</span>kIPS<br>
Avg speed: <span id="avg_speed">0</span>kIPS<br>
<br>
<div id="info_hda">
<b>HDA</b><br>
Sectors read: <span id="info_hda_sectors_read"></span><br>
Bytes read: <span id="info_hda_bytes_read"></span><br>
Sectors written: <span id="info_hda_sectors_written"></span><br>
Bytes written: <span id="info_hda_bytes_written"></span><br>
<br>
</div>
<div id="info_cdrom">
<b>CDROM</b><br>
Sectors read: <span id="info_cdrom_sectors_read"></span><br>
Bytes read: <span id="info_cdrom_bytes_read"></span><br>
<br>
</div>
<b>VGA</b><br>
Mode: <span id="info_vga_mode"></span><br>
Resolution: <span id="info_res">-</span><br>
BPP: <span id="info_bpp">-</span><br>
<br>
Mouse: <span id="info_mouse_enabled">-</span><br>
<!-- Keyboard: <span id="info_keyboard_enabled">-</span><br> -->
</div>
<div>
<div id="boot_options">
CD image: <input type="file" id="cd_image"><br>
<h4>Quickstart</h4>
<input type="button" value="KolibriOS (1.4 MB)" id="start_koli">
- Graphical OS, takes about 60 seconds to boot<br>
<input type="button" value="Linux 2.6 (4.9 MB)" id="start_linux">
- With busybox and lua interpreter, takes about 20 seconds to boot<br>
<input type="button" value="Windows 1.01 (1.4 MB)" id="start_win101">
- Takes 1 second to boot<br>
<input type="button" value="FreeDOS (0.7 MB)" id="start_freedos">
- With nasm, vim, debug.com, some games and demos, takes 1 second to boot<br>
<input type="button" value="OpenBSD (1.4 MB)" id="start_bsd">
- Random boot floppy, takes very long to boot<br>
<br>
Floppy disk image: <input type="file" id="floppy_image"><br>
<hr>
<h4>Setup</h4>
<table>
<tr>
<td width="250">CD image</td>
<td>
<!--
<select>
<option>None</option>
<option>Local file</option>
<option>External Server</option>
</select>-->
<input type="file" id="cd_image">
</td>
</tr>
<tr>
<td>Floppy disk image</td>
<td> <input type="file" id="floppy_image"><br></td>
</tr>
<tr>
<td>Hard drive disk image</td>
<td><input type="file" id="hd_image"><br></td>
</tr>
<tr>
<td colspan="2"><hr></td>
</tr>
<tr>
<td>Memory size</td>
<td>
<input id="memory_size" type="number" value="64" min="16" max="2048" step="16"> MB<br>
</td>
</tr>
<tr>
<td>Video Memory size</td>
<td>
<input id="video_memory_size" type="number" value="8" min="1" max="16" step="1"> MB<br>
</td>
</tr>
<tr>
<td colspan="2"><hr></td>
</tr>
<!--
<tr>
<td>Execution Cap </td>
<td> <input type="number" value="100" min="5" max="100" step="5"> %<br> </td>
</tr>
-->
<tr>
<td>Boot order</td>
<td>
<select id="boot_order">
<option value="231">Floppy / CD / Hard Disk</option>
<option value="321">Floppy / Hard Disk / CD</option>
<option value="213">CD / Floppy / Hard Disk</option>
<option value="123">CD / Hard Disk / Floppy</option>
<option value="312">Hard Disk / Floppy / CD</option>
<option value="132">Hard Disk / CD / Floppy</option>
</select>
</td>
</tr>
</table>
<br>
Hard drive disk image: <input type="file" id="hd_image"><br>
<button id="start_emulation">Start Emulation</button>
<!--
<br>
- OR -
<div id="setup_error">Error: Video size must be at least over 9000</div>
-->
<!--
<br>
<br>
<input type="button" value="KolibriOS (1.4 MB)" id="start_koli"> - Graphical OS, takes about 60 seconds to boot<br>
<input type="button" value="Linux 2.6 (4.9 MB)" id="start_linux"> - With busybox and lua interpreter, takes about 20 seconds to boot<br>
<input type="button" value="Windows 1.01 (1.4 MB)" id="start_win101"> - Takes 1 second to boot<br>
<input type="button" value="FreeDOS (0.7 MB)" id="start_freedos"> - With nasm, vim, debug.com, some games and demos, takes 1 second to boot<br>
<input type="button" value="OpenBSD (1.4 MB)" id="start_bsd"> - Random boot floppy, takes very long to boot<br>
Link to this configuration: <a href="" id="config_link">http://copy.sh/v24/?a=b&amp;c=d</a>
-->
</div>
<div id="runtime_options" style="display: none">
<input type="button" value="Pause" id="run">
<input type="button" value="Reset" id="reset">
<input type="button" value="Send Ctrl-Alt-Del" id="ctrlaltdel">
<input type="button" value="Get modified floppy image" id="get_floppy">
<input type="button" value="Get floppy image" id="get_fda_image">
<input type="button" value="Get floppy image" id="get_fdb_image">
<input type="button" value="Get HDA image" id="get_hda_image">
<input type="button" value="Get HDB image" id="get_hdb_image">
<input type="button" value="Lock mouse" id="lock_mouse">
<input type="button" value="Go fullscreen" id="fullscreen">
<input type="button" value="Take screenshot (only graphic modes)" id="take_screenshot">
Scale:
<input type="number" min="0.25" step="0.25" value="1.0" id="scale" style="width: 50px">
<div id="info">
<div>running <span id="running_time"></span>s</div>
<div>speed <span id="speed"></span>kIPS</div>
</div>
<br>
<br>
</div>
<pre style="display: none" id="loading"></pre>
<br>
<br>
</div>
@ -54,10 +162,40 @@
<canvas id="vga"></canvas>
</div>
<br style="clear: both">
<textarea cols="80" rows="25" id="serial" style="display: none">This is the serial console. Whatever you type or paste here will be send to COM1.
In Linux it can be accessed with `cat /dev/ttyS0`
</textarea>
<input type="text" class="phone_keyboard" style="display: none">
<span style="clear:both"></span>
<br>
<b>News:</b> Source Code now available: <a href="https://github.com/copy/v86">Github</a>, <a href="v86-latest.tar.gz">tarball</a>.
<div id="news">
<hr>
<h4>News</h4>
<ul>
<li>Jan 10, 2014 &mdash; Updated interface
<li>Nov 05, 2013 &mdash; Source Code now available: <a href="https://github.com/copy/v86">Github</a>, <a href="v86-latest.tar.gz">tarball</a>.
<li>Oct 17, 2013 &mdash; First public release
</ul>
</div>
<br>
<hr>
<a href="debug.html">Enable debug</a>
&mdash;
<a href="https://github.com/copy/v86/blob/master/Readme.md">Readme</a>
&mdash;
<a href="https://github.com/copy/v86">Project on Github</a>
&mdash;
<a href="https://github.com/copy/v86#compatibility">Compatibility</a>
&mdash;
<a href="https://github.com/copy/v86#license">License</a>
&mdash;
<a href="./screenshots/">Screenshots</a>

View file

@ -1,76 +1,144 @@
"use strict";
// setImmediate for the browser
var next_tick, set_tick;
(function()
{
var fn,
host = location.protocol + "//" + location.host;
set_tick = function(f)
function log(data)
{
fn = f;
var log_element = document.getElementById("log");
window.removeEventListener("message", tick_handler, false);
window.addEventListener("message", tick_handler, false);
};
next_tick = function()
{
window.postMessage(null, host);
};
function tick_handler(e)
{
if(e.origin === host)
{
fn();
}
log_element.style.display = "block";
log_element.textContent += data + "\n";
log_element.scrollTop = 1e9;
}
})();
function log(data)
{
var log_element = document.getElementById("log");
log_element.style.display = "block";
log_element.textContent += data + "\n";
log_element.scrollTop = 1e9;
}
// setImmediate shim for the browser
var next_tick, set_tick;
function dump_text(text)
{
var box = document.createElement("textarea");
(function()
{
var fn,
host = location.protocol + "//" + location.host;
box.appendChild(document.createTextNode(text));
document.body.appendChild(box);
}
set_tick = function(f)
{
fn = f;
function dump_file(ab, name)
{
var blob = new Blob([ab]),
a;
window.removeEventListener("message", tick_handler, false);
window.addEventListener("message", tick_handler, false);
};
a = document.createElement("a");
a["download"] = name;
a.href = window.URL.createObjectURL(blob),
a.textContent = "Download " + name;
a.onclick = function() { a.parentNode.removeChild(a); };
next_tick = function()
{
window.postMessage(null, host);
};
a.dataset["downloadurl"] = ["application/octet-stream", a["download"], a.href].join(":");
function tick_handler(e)
{
if(e.origin === host)
{
fn();
}
}
})();
document.body.appendChild(a);
}
(function()
{
function dump_text(text)
{
var box = document.createElement("textarea");
box.appendChild(document.createTextNode(text));
document.body.appendChild(box);
}
function dump_file(ab, name)
{
var blob = new Blob([ab]),
a;
a = document.createElement("a");
a["download"] = name;
a.href = window.URL.createObjectURL(blob),
a.textContent = "Download " + name;
a.onclick = function() { a.parentNode.removeChild(a); };
a.dataset["downloadurl"] = ["application/octet-stream", a["download"], a.href].join(":");
document.body.appendChild(a);
}
function set_title(text)
{
document.title = text + " - Virtual x86" + (DEBUG ? " - debug" : "");
}
function time2str(time)
{
if(time < 60)
{
return time + "s";
}
else if(time < 3600)
{
return (time / 60 | 0) + "m " + String.pad0(time % 60, 2) + "s";
}
else
{
return (time / 3600 | 0) + "h " +
String.pad0((time / 60 | 0) % 60, 2) + "m " +
String.pad0(time % 60, 2) + "s";
}
}
function make_dom(obj)
{
var result;
if(typeof obj === "string")
{
// create text node from string
result = document.createTextNode(obj);
}
else if(typeof obj.length === "number")
{
// create list of elements
result = document.createDocumentFragment();
for(var i = 0; i < obj.length; i++)
{
result.appendChild(make_dom(obj[i]));
}
}
else if(typeof obj === "object")
{
// create single element
if(obj.tag === undefined)
{
throw "`tag` property required";
}
result = document.createElement(obj.tag);
for(var property in obj)
{
switch(property)
{
case "children":
result.appendChild(make_dom(obj.children));
break;
default:
result[property] = obj[property];
}
}
}
else
{
throw "Invalid type: " + typeof obj;
}
return result;
}
/** @param {?=} progress */
function load_file(filename, done, progress)
{
@ -387,9 +455,14 @@ function dump_file(ab, name)
function $(id)
{
if(!document.getElementById(id))
console.log("Element with id `" + id + "` not found");
return document.getElementById(id);
}
window.onload = function()
{
if(!("responseType" in new XMLHttpRequest))
@ -402,6 +475,40 @@ function dump_file(ab, name)
load_devices: true
};
function load_local(file, type, cont)
{
set_title(file.name);
// SyncFileBuffer:
// - loads the whole disk image into memory, impossible for large files (more than 1GB)
// - can later serve get/set operations fast and synchronously
// - takes some time for first load, neglectable for small files (up to 100Mb)
//
// AsyncFileBuffer:
// - loads slices of the file asynchronously as requested
// - slower get/set
// - doesn't support writing yet
var loader = new SyncFileBuffer(file);
loader.onprogress = show_progress.bind(this, "Loading disk image into memory");
loader.onload = function()
{
switch(type)
{
case "floppy":
settings.fda = loader;
break;
case "hd":
settings.hda = loader;
break;
case "cdrom":
settings.cdrom = loader;
break;
}
cont();
}
}
$("lock_mouse").onclick = function()
{
@ -430,66 +537,11 @@ function dump_file(ab, name)
settings.vga_bios = img;
});
function load_local(me, type)
{
if(me.files.length)
{
set_title(me.files[0].name);
// SyncFileBuffer:
// - loads the whole disk image into memory, impossible for large files (more than 1GB)
// - can later serve get/set operations fast and synchronously
// - takes some time for first load, neglectable for small files (up to 100Mb)
//
// AsyncFileBuffer:
// - loads slices of the file asynchronously as requested
// - slower get/set
// - doesn't support writing yet
var file = new SyncFileBuffer(me.files[0]);
file.onprogress = show_progress.bind(this, "Loading disk image into memory");
file.onload = function()
{
switch(type)
{
case "floppy":
settings.floppy_disk = file;
break;
case "hd":
settings.hda_disk = file;
break;
case "cdrom":
settings.cdrom_disk = file;
break;
}
init(settings);
}
$("boot_options").style.display = "none";
}
};
$("floppy_image").onchange = function()
{
load_local(this, "floppy");
};
$("cd_image").onchange = function()
{
load_local(this, "cdrom");
};
$("hd_image").onchange = function()
{
load_local(this, "hd");
};
$("start_freedos").onclick = function()
{
load_file("images/freedos722.img", function(buffer)
{
settings.floppy_disk = new SyncBuffer(buffer);
settings.fda = new SyncBuffer(buffer);
set_title("FreeDOS");
init(settings);
}, show_progress.bind(this, "Downloading image"));
@ -502,7 +554,7 @@ function dump_file(ab, name)
{
load_file("images/windows101.img", function(buffer)
{
settings.floppy_disk = new SyncBuffer(buffer);
settings.fda = new SyncBuffer(buffer);
set_title("Windows");
init(settings);
}, show_progress.bind(this, "Downloading image"));
@ -516,7 +568,7 @@ function dump_file(ab, name)
{
load_file("images/linux.iso", function(buffer)
{
settings.cdrom_disk = new SyncBuffer(buffer);
settings.cdrom = new SyncBuffer(buffer);
set_title("Linux");
init(settings);
}, show_progress.bind(this, "Downloading image"));
@ -529,7 +581,7 @@ function dump_file(ab, name)
{
load_file("images/kolibri.img", function(buffer)
{
settings.floppy_disk = new SyncBuffer(buffer);
settings.fda = new SyncBuffer(buffer);
set_title("KolibriOS");
init(settings);
}, show_progress.bind(this, "Downloading image"));
@ -542,7 +594,7 @@ function dump_file(ab, name)
{
load_file("images/openbsd.img", function(buffer)
{
settings.floppy_disk = new SyncBuffer(buffer);
settings.fda = new SyncBuffer(buffer);
set_title("OpenBSD");
init(settings);
}, show_progress.bind(this, "Downloading image"));
@ -551,11 +603,58 @@ function dump_file(ab, name)
$("boot_options").style.display = "none";
};
$("start_emulation").onclick = function()
{
$("boot_options").style.display = "none";
var images = [];
if($("floppy_image").files.length)
{
images.push({
file: $("floppy_image").files[0],
type: "floppy",
});
}
if($("cd_image").files.length)
{
images.push({
file: $("cd_image").files[0],
type: "cdrom",
});
}
if($("hd_image").files.length)
{
images.push({
file: $("hd_image").files[0],
type: "hd",
});
}
function cont()
{
if(images.length === 0)
{
init(settings);
}
else
{
var obj = images.pop();
load_local(obj.file, obj.type, cont);
}
}
cont();
};
if(DEBUG)
{
$("start_test").onclick = function()
{
settings.floppy_disk = new AsyncXHRBuffer("images/fd/freedos.part%d.img", 512, 720 * 1024);
settings.fda = new AsyncXHRBuffer("images/fd/freedos.part%d.img", 512, 720 * 1024);
init(settings);
//settings.bios = settings.vga_bios = undefined;
@ -577,6 +676,51 @@ function dump_file(ab, name)
// });
//});
}
var log_levels = document.getElementById("log_levels"),
count = 0,
mask;
for(var i in dbg_names)
{
mask = +i;
if(mask == 1)
continue;
var name = dbg_names[mask].toLowerCase(),
input = document.createElement("input"),
label = document.createElement("label")
input.type = "checkbox";
label.htmlFor = input.id = "log_" + name;
if(LOG_LEVEL & mask)
{
input.checked = true;
}
input.mask = mask;
label.appendChild(input);
label.appendChild(document.createTextNode(name + " "));
log_levels.appendChild(label);
}
log_levels.onchange = function(e)
{
var target = e.target,
mask = target.mask;
if(target.checked)
{
LOG_LEVEL |= mask;
}
else
{
LOG_LEVEL &= ~mask;
}
};
}
};
@ -614,14 +758,44 @@ function dump_file(ab, name)
function init(settings)
{
var cpu = new v86(),
var envapi = {
set_tick: set_tick,
next_tick: next_tick,
log: log,
};
if(typeof performance === "object" && performance.now)
{
var offset = Date.now() - performance.now();
envapi.microtime = function()
{
return offset + performance.now()
};
envapi.detailed_microtime = false;
}
else
{
envapi.microtime = Date.now;
envapi.detailed_microtime = false;
}
var have_serial = true;
var cpu = new v86(envapi),
screen_adapter = new ScreenAdapter();
$("boot_options").style.display = "none";
$("loading").style.display = "none";
$("runtime_options").style.display = "block";
$("runtime_infos").style.display = "block";
document.getElementsByClassName("phone_keyboard")[0].style.display = "block";
if($("news"))
{
$("news").style.display = "none";
}
if(DEBUG)
{
$("step").onclick = function()
@ -638,6 +812,36 @@ function dump_file(ab, name)
{
debug.debugger();
};
$("dump_gdt").onclick = function()
{
debug.dump_gdt_ldt();
};
$("dump_idt").onclick = function()
{
debug.dump_idt();
};
$("dump_regs").onclick = function()
{
debug.dump_regs();
};
$("dump_pt").onclick = function()
{
debug.dump_page_directory();
};
$("dump_instructions").onclick = function()
{
debug.dump_instructions();
};
$("memory_dump").onclick = function()
{
dump_file(debug.get_memory_dump(), "memory.bin");
};
}
var running = true;
@ -661,29 +865,93 @@ function dump_file(ab, name)
$("run").blur();
};
var time = document.getElementById("running_time"),
ips = document.getElementById("speed"),
var time = $("running_time"),
ips = $("speed"),
avg_ips = $("avg_speed"),
last_tick = Date.now(),
running_time = 0,
summed_ips = 0,
last_instr_counter = 0;
function update_info()
{
if(running)
if(!running)
{
var now = Date.now();
return;
}
running_time += now - last_tick;
last_tick = now;
var now = Date.now(),
last_ips = (cpu.instr_counter - last_instr_counter) / 1000 | 0;
ips.textContent = (cpu.instr_counter - last_instr_counter) / 1000 | 0;
time.textContent = (running_time / 1000 | 0);
summed_ips += last_ips
running_time += now - last_tick;
last_tick = now;
last_instr_counter = cpu.instr_counter;
ips.textContent = last_ips;
avg_ips.textContent = summed_ips / running_time * 1000 | 0;
time.textContent = time2str(running_time / 1000 | 0);
last_instr_counter = cpu.instr_counter;
}
function update_other_info()
{
if(!running)
{
return;
}
var vga_stats = cpu.dev.vga.stats;
if(vga_stats.is_graphical)
{
$("info_vga_mode").textContent = "graphical";
$("info_res").textContent = vga_stats.res_x + "x" + vga_stats.res_y;
$("info_bpp").textContent = vga_stats.bpp;
}
else
{
$("info_vga_mode").textContent = "text";
$("info_res").textContent = "-";
$("info_bpp").textContent = "-";
}
if(settings.mouse_adapter)
{
$("info_mouse_enabled").textContent =
settings.mouse_adapter.enabled ? "Yes" : "No";
}
if(cpu.dev.hda)
{
var hda_stats = cpu.dev.hda.stats;
$("info_hda_sectors_read").textContent = hda_stats.sectors_read;
$("info_hda_bytes_read").textContent = hda_stats.bytes_read;
$("info_hda_sectors_written").textContent = hda_stats.sectors_written;
$("info_hda_bytes_written").textContent = hda_stats.bytes_written;
}
else
{
$("info_hda").style.display = "none";
}
if(cpu.dev.cdrom)
{
var cdrom_stats = cpu.dev.cdrom.stats;
$("info_cdrom_sectors_read").textContent = cdrom_stats.sectors_read;
$("info_cdrom_bytes_read").textContent = cdrom_stats.bytes_read;
}
else
{
$("info_cdrom").style.display = "none";
}
}
setInterval(update_info, 1000);
setInterval(update_other_info, 2500);
$("reset").onclick = function()
{
@ -691,22 +959,33 @@ function dump_file(ab, name)
$("reset").blur();
};
$("get_floppy").onclick = function()
// writable image types
var image_types = ["hda", "hdb", "fda", "fdb"];
for(var i = 0; i < image_types.length; i++)
{
var buffer = cpu.dev.fdc.buffer;
var elem = $("get_" + image_types[i] + "_image");
if(!buffer)
if(settings[image_types[i]])
{
return;
elem.onclick = (function(type)
{
var buffer = settings[type];
buffer.get_buffer(function(b)
{
dump_file(b, type + ".img");
});
this.blur();
}).bind(elem, image_types[i]);
}
buffer.get_buffer(function(b)
else
{
dump_file(b, "floppy.img");
});
$("get_floppy").blur();
};
elem.style.display = "none";
}
}
$("ctrlaltdel").onclick = function()
{
@ -771,6 +1050,36 @@ function dump_file(ab, name)
settings.keyboard_adapter = new KeyboardAdapter();
settings.mouse_adapter = new MouseAdapter();
settings.boot_order = parseInt($("boot_order").value, 16);
var memory_size = parseInt($("memory_size").value, 10) * 1024 * 1024;
if(memory_size >= 16 * 1024 * 1024 && memory_size < 2048 * 1024 * 1024)
{
settings.memory_size = memory_size;
}
else
{
log("Invalid memory size - ignored.");
settings.memory_size = 32 * 1024 * 1024;
}
var video_memory_size = parseInt($("video_memory_size").value, 10) * 1024 * 1024;
if(video_memory_size > 64 * 1024 && video_memory_size < 2048 * 1024 * 1024)
{
settings.vga_memory_size = video_memory_size;
}
else
{
log("Invalid video memory size - ignored.");
settings.vga_memory_size = 8 * 1024 * 1024;
}
if(have_serial)
{
settings.serial_adapter = new SerialAdapter($("serial"));
$("serial").style.display = "block";
}
cpu.init(settings);
cpu.run();
}

View file

@ -155,8 +155,10 @@ function ScreenAdapter()
this.put_pixel_linear = function(index, color)
{
// (addr ^ 3) - 1: Change BGR (svga) order to RGB (canvas)
graphic_buffer[(index ^ 3) - 1] = color;
dbg_assert((index & 3) !== 3);
// (addr + 1) ^ 3: Change BGR (svga) order to RGB (canvas)
graphic_buffer[(index + 1) ^ 3] = color;
did_change = true;
};

View file

@ -1,6 +1,7 @@
"use strict";
debug.dump_regs = dump_regs;
debug.dump_instructions = dump_instructions;
debug.dump_regs_short = dump_regs_short;
debug.dump_stack = dump_stack;
@ -44,8 +45,6 @@ function unimpl(msg)
function step()
{
step_mode = true;
if(!running)
{
cycle();
@ -183,22 +182,9 @@ function dump_regs()
s = { "cs": reg_cs, "ds": reg_ds, "es": reg_es,
"fs": reg_fs, "gs": reg_gs, "ss": reg_ss },
out = "";
out;
var opcodes = ops.toArray();
for(var i = 0; i < opcodes.length; i += 3)
{
if(opcodes[i])
{
out += h(opcodes[i], 8) + ": " +
String.pads(opcodes[i + 1], 20) + h(opcodes[i + 2], 2) + "\n";
}
}
envapi.log(out.substr(0, out.length - 1));
ops.clear();
dbg_log("----- DUMP (ip = 0x" + h(instruction_pointer >>> 0) + ") ----------")
dbg_log("protected mode: " + protected_mode);
@ -238,6 +224,26 @@ function dump_regs()
}
function dump_instructions()
{
var opcodes = ops.toArray(),
out = "";
for(var i = 0; i < opcodes.length; i += 3)
{
if(opcodes[i])
{
out += h(opcodes[i], 8) + ": " +
String.pads(opcodes[i + 1], 20) + h(opcodes[i + 2], 2) + "\n";
}
}
envapi.log(out.substr(0, out.length - 1));
ops.clear();
step_mode = true;
}
function dump_gdt_ldt()
{
dbg_log("gdt: (len = " + h(gdtr_size) + ")");

53
v86.css
View file

@ -1,11 +1,23 @@
#log {
#log, #runtime_infos {
font-family: DejaVu Sans Mono;
font-size: 13px;
height: 350px;
float: right;
width: 400px;
border: 0 none;
background-color: #111;
background-color: #000;
color: #fff;
width: 360px;
margin: 3px;
padding: 3px;
}
#log {
height: 350px;
}
#serial {
font-family: DejaVu Sans Mono;
font-size: 13px;
border: 0 none;
background-color: #000;
color: #fff;
}
#screen {
@ -45,9 +57,7 @@ body {
background-color: #111;
color: #fff;
line-height: 1.5;
}
#info {
font-size: 80%;
padding: 10px;
}
a {
color: wheat;
@ -58,3 +68,34 @@ a {
width: 100px;
height: 100px;
}
h4 {
margin: 0px 0px 20px 0px;
}
#start_emulation {
padding: 6px 18px;
font-size: 16px;
font-weight: bold;
}
#setup_error {
color: red;
font-weight: bold;
background-color: #222;
padding: 8px 18px;
}
#config_link {
font-weight: bold;
background-color: #222;
padding: 8px 18px;
}
#screen_container {
float: left;
}
a img {
margin: 10px;
}
.screenshots a {
text-decoration: none;
}
textarea:focus, .phone_keyboard:focus {
outline: 1px solid rgb(229, 151, 0);
}