diff options
| author | Brian Cully <bjc@spork.org> | 2025-08-23 13:40:37 -0400 |
|---|---|---|
| committer | Brian Cully <bjc@spork.org> | 2025-08-23 21:26:06 -0400 |
| commit | 365312b14723503424a601a49827c191af82ad7a (patch) | |
| tree | 5e37a01320fa77b6a19d7f0f0b7d44ec28e38a07 /main.mjs | |
| parent | 39042a3476ffbdc79d1e49a69cb5103628eb7265 (diff) | |
| download | automathon-365312b14723503424a601a49827c191af82ad7a.tar.gz automathon-365312b14723503424a601a49827c191af82ad7a.zip | |
begginnenblinken
Diffstat (limited to 'main.mjs')
| -rw-r--r-- | main.mjs | 63 |
1 files changed, 39 insertions, 24 deletions
@@ -15,9 +15,7 @@ function wordlistElts(wordlist) { } function selectorForIP(word, offset) { - const sel = `#wordlist x-bytecode[x-index='${word}'] x-op[x-index='${offset}']`; - console.debug('using sel', sel); - return sel; + return `#wordlist x-bytecode[x-index='${word}'] x-op[x-index='${offset}']`; } function initWordlist() { @@ -34,10 +32,8 @@ function renderStack(interp) { } interp.stack().reverse() .forEach(datum => { - console.debug('creating elt for', datum); const elt = document.createElement('li'); elt.textContent = datum; - console.debug('elt', elt); e.appendChild(elt); return elt; }); @@ -51,16 +47,29 @@ function renderCallStack(interp) { } interp.callstack().reverse() .forEach(datum => { - console.debug('creating elt for', datum); const elt = document.createElement('li'); elt.textContent = `${datum.word}@${datum.offset}`; - console.debug('elt', elt); e.appendChild(elt); return elt; }); }); } +function tick(interp) { + if (!interp.tick()) { + interp.reset_ip(); + } + + const { word, offset } = interp.ip(); + document.querySelectorAll('#wordlist .ip').forEach(e => e.classList.remove('ip')); + const sel = selectorForIP(word, offset); + document.querySelectorAll(sel).forEach(e => { + e.classList.add('ip'); + }); + renderStack(interp); + renderCallStack(interp); +} + async function loaded() { console.debug('running init'); const mod = await init(); @@ -75,7 +84,6 @@ async function loaded() { console.debug('removing child', wordlistContainer.lastChild) wordlistContainer.removeChild(wordlistContainer.lastChild); } - console.debug('container has firstchild', wordlistContainer.firstChild) // always add a newline until i decide what to do with the parser. const text = document.querySelector('textarea').value + '\n'; @@ -87,25 +95,13 @@ async function loaded() { const wordlist = wordlistElts(interp.wordlist()); wordlist.forEach(elt => wordlistContainer.appendChild(elt)); initWordlist(); + renderStack(interp); + renderCallStack(interp); } }; document.querySelector('#tick').onclick = e => { console.debug('tick clicked', e); - if (!interp.tick()) { - interp.reset_ip(); - } - console.info('callstack', interp.callstack()); - console.info('stack', interp.stack()); - - const { word, offset } = interp.ip(); - console.info('ip', word, offset); - document.querySelectorAll('#wordlist .ip').forEach(e => e.classList.remove('ip')); - const sel = selectorForIP(word, offset); - document.querySelectorAll(sel).forEach(e => { - e.classList.add('ip'); - }); - renderStack(interp); - renderCallStack(interp); + tick(interp); }; document.querySelector('#bench').onclick = e => { console.debug('bench clicked', e); @@ -115,9 +111,28 @@ async function loaded() { tickCount += interp.run(); } const end = performance.now(); - console.info(`run took ${end-start} ms for ${tickCount} ticks (${(end-start)/tickCount * 1000000} µs/tick).`); + console.info(`run took ${end-start} ms for ${tickCount} ticks (${(end-start)/tickCount * 1_000_000} ns/tick).`); console.info('result', interp.stack()); }; + + let blinkenRun = false; + document.querySelector('#blinken').onclick = e => { + console.debug('blinken clicked', e); + blinkenRun = !blinkenRun; + if (blinkenRun) { + e.target.textContent = 'haltenblinken'; + } else { + e.target.textContent = 'blinken'; + } + const frameRate = 6; + const onTimeout = _ => { + if (blinkenRun) { + tick(interp); + setTimeout(onTimeout, 1_000 / frameRate); + } + } + setTimeout(onTimeout); + } window.interp = interp; } |
