UI support for loading hex string data

This commit is contained in:
wixette 2020-03-07 00:40:54 +08:00
parent 99e0ffff4a
commit 3b2b82cd69
2 changed files with 53 additions and 21 deletions

View File

@ -9,6 +9,11 @@
font-family: monospace;
font-size: 14px;
}
hr {
border-top: #ccc solid 1px;
height: 0;
margin: 10px 0 10px 0;
}
div {
border: 0;
padding: 0;
@ -23,6 +28,11 @@
margin: 0 13px 0 0;
padding: 0;
}
.comments {
font-size: 11px;
color: #666;
line-height: 14px;
}
</style>
</head>
<body>
@ -54,6 +64,17 @@
<hr>
<p>
<input id="data" type="text" size="60">&nbsp;
<input type="button" value="LOAD DATA" onclick="loadData();">
</p>
<pre class="comments">
Examples - binary data of simple programs:
db ff d3 ff c3 00 00 // Switch echo between A2 and A1.
3e 8c d3 ff 0f c3 02 00 // Pattern shift.</pre>
<hr>
<p>LEDs: <!-- &#x25cf; - on. &#x25cb; - off. -->
<div id="status-leds">
<p>
@ -203,14 +224,19 @@
sim.powerOff();
}
function loadData() {
var data = document.getElementById("data").value;
sim.loadDataAsHexString(0, data);
}
function run() {
// Switch echo between A2 and A1.
// sim.loadDataAsHexString(0, 'db ff d3 ff c3 00 00');
// Pattern shift.
sim.loadDataAsHexString(0, '3e 8c d3 ff 0f c3 02 00');
sim.start();
}
function singleStep() {
sim.step(1);
}
function stop() {
sim.stop();
}

View File

@ -104,9 +104,12 @@ class Sim8800 {
* @param {Array<number>} data The array of data.
*/
loadData(address, data) {
if (!this.isPoweredOn)
return;
for (let i = 0; i < data.length && address < this.mem.length; i++) {
this.mem[address++] = data[i];
}
this.dumpMem();
}
/**
@ -115,11 +118,14 @@ class Sim8800 {
* @param {string} hexString Data encoded in hex string, like 'c3 00 00'.
*/
loadDataAsHexString(address, hexString) {
if (!this.isPoweredOn || !hexString)
return;
var data = hexString.split(' ');
for (let i = 0; i < data.length && address < this.mem.length; i++) {
var byte = parseInt('0x' + data[i]);
this.mem[address++] = byte;
}
this.dumpMem();
}
/**
@ -257,23 +263,6 @@ class Sim8800 {
};
}
/**
* Runs a given number of CPU cycles.
* @param {number} cycles The number of CPU cycles to step on.
*/
step(cycles) {
if (!this.isPoweredOn)
return;
CPU8080.steps(cycles);
this.dumpCpu();
this.dumpMem();
if (this.setAddressLedsCallback) {
var cpu = CPU8080.status();
var pcBits = Sim8800.parseBits(cpu.pc, 16);
this.setAddressLedsCallback(pcBits);
}
}
/**
* Powers on the machine.
*/
@ -353,4 +342,21 @@ class Sim8800 {
}
window.setTimeout(this.getClockTickerCallback(), 1);
}
/**
* Runs a given number of CPU cycles.
* @param {number} cycles The number of CPU cycles to step on.
*/
step(cycles) {
if (!this.isPoweredOn)
return;
CPU8080.steps(cycles);
this.dumpCpu();
this.dumpMem();
if (this.setAddressLedsCallback) {
var cpu = CPU8080.status();
var pcBits = Sim8800.parseBits(cpu.pc, 16);
this.setAddressLedsCallback(pcBits);
}
}
};