Handle prelude loading message in JS rather than Forth
This commit is contained in:
35
emu.js
35
emu.js
@@ -6,6 +6,7 @@ const RXHEAD = 0x108;
|
||||
const RXTAIL = 0x10c;
|
||||
|
||||
const SYSREADY = 0x110;
|
||||
const SYSINTER = 0x114;
|
||||
|
||||
const DOT_INTERVAL_MS = 120;
|
||||
const PERIPHS_SIZE = 0x200;
|
||||
@@ -50,14 +51,18 @@ class Emulator {
|
||||
document.addEventListener('keydown', (e) => this.handle_keydown(e));
|
||||
window.addEventListener('resize', () => this.handle_resize());
|
||||
|
||||
this.forth = new Worker('boot.js', { type: 'module' });
|
||||
|
||||
this.print("Assembling kernel ");
|
||||
const dots = setInterval(() => this.print("."), DOT_INTERVAL_MS);
|
||||
this.worker = new Worker('boot.js', { type: 'module' });
|
||||
this.worker.postMessage({ type: "load", mem: this.mem });
|
||||
this.worker.onmessage = (e) => {
|
||||
clearInterval(dots);
|
||||
this.dots = setInterval(() => this.print("."), DOT_INTERVAL_MS);
|
||||
this.forth.postMessage({ type: "load", mem: this.mem });
|
||||
this.forth.onmessage = (e) => {
|
||||
clearInterval(this.dots);
|
||||
this.print(" done\n");
|
||||
this.worker.postMessage({ type: "boot" });
|
||||
|
||||
this.print("Loading prelude ");
|
||||
this.forth.postMessage({ type: "boot" });
|
||||
this.dots = setInterval(() => this.print("."), DOT_INTERVAL_MS);
|
||||
};
|
||||
|
||||
fetch('prelude.f')
|
||||
@@ -84,9 +89,15 @@ class Emulator {
|
||||
if (!this.input_enable) {
|
||||
const sysready = Atomics.load(this.mem_u8, SYSREADY);
|
||||
if (sysready != 0) {
|
||||
clearInterval(this.dots);
|
||||
this.print(" done\n");
|
||||
|
||||
Atomics.store(this.mem_u8, SYSINTER, 1);
|
||||
Atomics.notify(this.mem_i32, SYSINTER / 4);
|
||||
|
||||
this.input_enable = true;
|
||||
this.blink = true;
|
||||
this.flush_output();
|
||||
document.getElementById('cursor').classList.add('blinking');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -180,12 +191,14 @@ class Emulator {
|
||||
}
|
||||
|
||||
e.preventDefault();
|
||||
this.blink = false;
|
||||
this.flush_output();
|
||||
|
||||
document.getElementById('cursor').classList.remove('blinking');
|
||||
if (this.idle_timer)
|
||||
clearTimeout(this.idle_timer);
|
||||
this.idle_timer = setTimeout(() => {
|
||||
this.blink = true;
|
||||
document.getElementById('cursor').classList.add('blinking');
|
||||
}, CURSOR_IDLE_TIME_MS);
|
||||
}
|
||||
@@ -272,10 +285,12 @@ class Emulator {
|
||||
return row.map((c, x) => {
|
||||
const ec = this.html_escape(c);
|
||||
if (this.input_enable
|
||||
&& x == this.cursor.x && y == this.cursor.y)
|
||||
return '<span id="cursor">' + ec + '</span>';
|
||||
else
|
||||
&& x == this.cursor.x && y == this.cursor.y) {
|
||||
const cl = this.blink ? 'class="blinking"' : '';
|
||||
return `<span id="cursor" ${cl}>` + ec + '</span>';
|
||||
} else {
|
||||
return ec;
|
||||
}
|
||||
}).join('').trimEnd();
|
||||
}).join('\n');
|
||||
this.output.innerHTML = html;
|
||||
|
||||
Reference in New Issue
Block a user