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-family: monospace;
font-size: 14px; font-size: 14px;
} }
hr {
border-top: #ccc solid 1px;
height: 0;
margin: 10px 0 10px 0;
}
div { div {
border: 0; border: 0;
padding: 0; padding: 0;
@ -23,6 +28,11 @@
margin: 0 13px 0 0; margin: 0 13px 0 0;
padding: 0; padding: 0;
} }
.comments {
font-size: 11px;
color: #666;
line-height: 14px;
}
</style> </style>
</head> </head>
<body> <body>
@ -54,6 +64,17 @@
<hr> <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. --> <p>LEDs: <!-- &#x25cf; - on. &#x25cb; - off. -->
<div id="status-leds"> <div id="status-leds">
<p> <p>
@ -203,14 +224,19 @@
sim.powerOff(); sim.powerOff();
} }
function loadData() {
var data = document.getElementById("data").value;
sim.loadDataAsHexString(0, data);
}
function run() { 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(); sim.start();
} }
function singleStep() {
sim.step(1);
}
function stop() { function stop() {
sim.stop(); sim.stop();
} }

View File

@ -104,9 +104,12 @@ class Sim8800 {
* @param {Array<number>} data The array of data. * @param {Array<number>} data The array of data.
*/ */
loadData(address, data) { loadData(address, data) {
if (!this.isPoweredOn)
return;
for (let i = 0; i < data.length && address < this.mem.length; i++) { for (let i = 0; i < data.length && address < this.mem.length; i++) {
this.mem[address++] = data[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'. * @param {string} hexString Data encoded in hex string, like 'c3 00 00'.
*/ */
loadDataAsHexString(address, hexString) { loadDataAsHexString(address, hexString) {
if (!this.isPoweredOn || !hexString)
return;
var data = hexString.split(' '); var data = hexString.split(' ');
for (let i = 0; i < data.length && address < this.mem.length; i++) { for (let i = 0; i < data.length && address < this.mem.length; i++) {
var byte = parseInt('0x' + data[i]); var byte = parseInt('0x' + data[i]);
this.mem[address++] = byte; 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. * Powers on the machine.
*/ */
@ -353,4 +342,21 @@ class Sim8800 {
} }
window.setTimeout(this.getClockTickerCallback(), 1); 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);
}
}
}; };