Use atomic wait/notify on RXTAIL in KEY
This commit is contained in:
2
emu.js
2
emu.js
@@ -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) {
|
||||||
|
|||||||
19
wipforth.wat
19
wipforth.wat
@@ -628,15 +628,24 @@
|
|||||||
;; Serial I/O
|
;; Serial I/O
|
||||||
|
|
||||||
(func $key (local $head i32)
|
(func $key (local $head i32)
|
||||||
|
global.get $RXHEAD
|
||||||
|
i32.atomic.load8_u
|
||||||
|
local.tee $head
|
||||||
|
|
||||||
;; Wait for RXBUF to be non-empty
|
;; Wait for RXBUF to be non-empty
|
||||||
loop $wait
|
loop $wait (param i32)
|
||||||
global.get $RXHEAD
|
|
||||||
i32.atomic.load8_u
|
|
||||||
local.tee $head
|
|
||||||
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
|
||||||
|
|||||||
Reference in New Issue
Block a user