New UI
This commit is contained in:
parent
7125269d55
commit
4133a07e72
170
debug.html
170
debug.html
|
@ -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&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>
|
||||
|
||||
|
|
178
index.html
178
index.html
|
@ -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&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 — Updated interface
|
||||
<li>Nov 05, 2013 — 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 — First public release
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<br>
|
||||
<hr>
|
||||
<a href="debug.html">Enable debug</a>
|
||||
—
|
||||
<a href="https://github.com/copy/v86/blob/master/Readme.md">Readme</a>
|
||||
—
|
||||
<a href="https://github.com/copy/v86">Project on Github</a>
|
||||
—
|
||||
<a href="https://github.com/copy/v86#compatibility">Compatibility</a>
|
||||
—
|
||||
<a href="https://github.com/copy/v86#license">License</a>
|
||||
—
|
||||
<a href="./screenshots/">Screenshots</a>
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
|
@ -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
53
v86.css
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue