From 843c478cdd33375c8b0ab50740ae8f37f115e474 Mon Sep 17 00:00:00 2001 From: wixette Date: Sat, 7 Mar 2020 00:11:13 +0800 Subject: [PATCH] support poweron and power off --- index.html | 38 ++++++++++++++++++++------------------ js/sim8800.js | 43 ++++++++++++++++++++++++++++++++++++------- 2 files changed, 56 insertions(+), 25 deletions(-) diff --git a/index.html b/index.html index 4afdd19..67bbc99 100644 --- a/index.html +++ b/index.html @@ -59,20 +59,20 @@

INTE   PROT   - MEMR   + MEMR   INP   - MI   + MI   OUT   HLTA   STACK   - WO   + WO   INT  

- WAIT   + WAIT   HLDA  

@@ -169,24 +169,30 @@ ledElem.innerHTML = isRunning ? '○' : '●'; } + function setStatusLedsCallback(isPoweredOn) { + var ledElems = [ + document.getElementById('memr-led'), + document.getElementById('mi-led'), + document.getElementById('wo-led') + ]; + for (let i = 0; i < ledElems.length; i++) { + ledElems[i].innerHTML = isPoweredOn ? '●' : '○'; + } + } + var dumpCpuElem = document.getElementById('cpu'); var dumpMemElem = document.getElementById('mem'); var sim = new Sim8800(256, 1000000, setAddressLedsCallback, setDataLedsCallback, - setWaitLedCallback, + setWaitLedCallback, setStatusLedsCallback, dumpCpuElem, dumpMemElem); - function init() { - sim.loadDataAsHexString(0, '00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f'); - sim.loadData(16, [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]); - sim.dumpCpu(); - sim.dumpMem() + function powerOn() { + sim.powerOn(); } - function test() { - console.log(Sim8800.parseBits(10, 1)); - console.log(Sim8800.parseBits(0xF8, 1)); - console.log(Sim8800.parseBits(0xF0, 2)); + function powerOff() { + sim.powerOff(); } function run() { @@ -195,14 +201,10 @@ // Pattern shift. sim.loadDataAsHexString(0, '3e 8c d3 ff 0f c3 02 00'); sim.start(); - sim.dumpCpu(); - sim.dumpMem() } function stop() { sim.stop(); - sim.dumpCpu(); - sim.dumpMem() } diff --git a/js/sim8800.js b/js/sim8800.js index 48ab988..c045bd2 100644 --- a/js/sim8800.js +++ b/js/sim8800.js @@ -30,6 +30,8 @@ class Sim8800 { * callback to set data LEDs. * @param {function(boolean)?} setWaitLedCallback The callback to * set the WAIT LED. + * @param {function(boolean)?} setStatusLedsCallback The callback to + * set the STATUS LEDs. * @param {Element?} dumpCpuElem The DOM element used to render * dumped CPU status. null to disable the feature. * @param {Element?} dumpMemElem The DOM element used to render @@ -37,13 +39,14 @@ class Sim8800 { */ constructor(memSize, clockRate, setAddressLedsCallback, setDataLedsCallback, - setWaitLedCallback, + setWaitLedCallback, setStatusLedsCallback, dumpCpuElem, dumpMemElem) { this.clockRate = clockRate; this.mem = new Array(memSize); this.setAddressLedsCallback = setAddressLedsCallback; this.setDataLedsCallback = setDataLedsCallback; this.setWaitLedCallback = setWaitLedCallback; + this.setStatusLedsCallback = setStatusLedsCallback; this.dumpCpuElem = dumpCpuElem; this.dumpMemElem = dumpMemElem; this.running = false; @@ -85,12 +88,12 @@ class Sim8800 { * Fills the memory with dummy bytes. */ initMem(random = false) { - for (let i = 0; i < this.mem.length; i++) { - if (random) { + if (random) { + for (let i = 0; i < this.mem.length; i++) { this.mem[i] = Math.floor(Math.random() * 256); - } else { - this.mem[i] = 0; } + } else { + this.mem.fill(0); } } @@ -273,8 +276,16 @@ class Sim8800 { */ powerOn() { this.stop(); - reset(); + this.reset(); this.initMem(); + if (this.setStatusLedsCallback) { + this.setStatusLedsCallback(true); + } + if (this.setWaitLedCallback) { + this.setWaitLedCallback(false); + } + this.dumpCpu(); + this.dumpMem(); } /** @@ -282,8 +293,26 @@ class Sim8800 { */ powerOff() { this.stop(); - reset(); + this.reset(); this.initMem(); + if (this.setStatusLedsCallback) { + this.setStatusLedsCallback(false); + } + if (this.setWaitLedCallback) { + this.setWaitLedCallback(true); + } + if (this.setAddressLedsCallback) { + this.setAddressLedsCallback(new Array(16).fill(0)); + } + if (this.setDataLedsCallback) { + this.setDataLedsCallback(new Array(8).fill(0)); + } + if (this.dumpCpuElem) { + this.dumpCpuElem.innerHTML = ''; + } + if (this.dumpMemElem) { + this.dumpMemElem.innerHTML = ''; + } } /**