Use atomic wait/notify on RXTAIL in KEY

This commit is contained in:
2026-03-02 18:53:17 +00:00
parent 2a3949e09f
commit 32c3c6e356
2 changed files with 16 additions and 5 deletions

2
emu.js
View File

@@ -27,6 +27,7 @@ class Emulator {
this.mem_u8 = new Uint8Array(this.mem.buffer); this.mem_u8 = new Uint8Array(this.mem.buffer);
for (let i = 0; i < PERIPHS_SIZE; ++i) for (let i = 0; i < PERIPHS_SIZE; ++i)
this.mem_u8[i] = 0; this.mem_u8[i] = 0;
this.mem_i32 = new Int32Array(this.mem.buffer);
this.decoder = new TextDecoder('utf-8'); this.decoder = new TextDecoder('utf-8');
this.encoder = new TextEncoder('utf-8'); this.encoder = new TextEncoder('utf-8');
@@ -103,6 +104,7 @@ class Emulator {
tail = this.fifo_next(tail); tail = this.fifo_next(tail);
} while (this.fifo_next(tail) != head && this.rx_queue.length != 0); } while (this.fifo_next(tail) != head && this.rx_queue.length != 0);
Atomics.store(this.mem_u8, RXTAIL, tail); Atomics.store(this.mem_u8, RXTAIL, tail);
Atomics.notify(this.mem_i32, RXTAIL / 4);
} }
print(str) { print(str) {

View File

@@ -628,15 +628,24 @@
;; Serial I/O ;; Serial I/O
(func $key (local $head i32) (func $key (local $head i32)
;; Wait for RXBUF to be non-empty
loop $wait
global.get $RXHEAD global.get $RXHEAD
i32.atomic.load8_u i32.atomic.load8_u
local.tee $head local.tee $head
;; Wait for RXBUF to be non-empty
loop $wait (param i32)
global.get $RXTAIL global.get $RXTAIL
i32.atomic.load8_u i32.atomic.load8_u
i32.eq i32.eq
br_if $wait if
global.get $RXTAIL
local.get $head
i64.const -1
memory.atomic.wait32
local.get $head
br $wait
end
end end
;; Read byte at head position ;; Read byte at head position