mirror of
https://github.com/remko/waforth
synced 2024-12-26 09:59:09 +01:00
ACCEPT: Implement in terms of KEY
This commit is contained in:
parent
fca7a90869
commit
ccd49c2b12
4 changed files with 56 additions and 35 deletions
|
@ -971,17 +971,17 @@ T{ OUTPUT-TEST -> }T
|
||||||
|
|
||||||
\ ------------------------------------------------------------------------
|
\ ------------------------------------------------------------------------
|
||||||
\ TESTING INPUT: ACCEPT
|
\ TESTING INPUT: ACCEPT
|
||||||
\
|
|
||||||
\ CREATE ABUF 50 CHARS ALLOT
|
CREATE ABUF 50 CHARS ALLOT
|
||||||
\
|
|
||||||
\ : ACCEPT-TEST
|
: ACCEPT-TEST
|
||||||
\ CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
|
CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
|
||||||
\ ABUF 50 ACCEPT
|
ABUF 50 ACCEPT
|
||||||
\ CR ." RECEIVED: " [CHAR] " EMIT
|
CR ." RECEIVED: " [CHAR] " EMIT
|
||||||
\ ABUF SWAP TYPE [CHAR] " EMIT CR
|
ABUF SWAP TYPE [CHAR] " EMIT CR
|
||||||
\ ;
|
;
|
||||||
\
|
|
||||||
\ T{ ACCEPT-TEST -> }T
|
T{ ACCEPT-TEST -> }T
|
||||||
|
|
||||||
\ ------------------------------------------------------------------------
|
\ ------------------------------------------------------------------------
|
||||||
TESTING DICTIONARY SEARCH RULES
|
TESTING DICTIONARY SEARCH RULES
|
||||||
|
|
|
@ -15,8 +15,6 @@
|
||||||
(import "shell" "emit" (func $shell_emit (param i32)))
|
(import "shell" "emit" (func $shell_emit (param i32)))
|
||||||
(import "shell" "getc" (func $shell_getc (result i32)))
|
(import "shell" "getc" (func $shell_getc (result i32)))
|
||||||
(import "shell" "key" (func $shell_key (result i32)))
|
(import "shell" "key" (func $shell_key (result i32)))
|
||||||
(import "shell" "accept" (func $shell_accept (param i32) (param i32) (result i32)))
|
|
||||||
;; (import "shell" "debug" (func $shell_debug (param i32)))
|
|
||||||
|
|
||||||
;; Load a webassembly module.
|
;; Load a webassembly module.
|
||||||
;; Parameters: memory offset, size, table index where the new module will
|
;; Parameters: memory offset, size, table index where the new module will
|
||||||
|
@ -712,9 +710,23 @@
|
||||||
(func $ACCEPT (param $tos i32) (result i32)
|
(func $ACCEPT (param $tos i32) (result i32)
|
||||||
(local $btos i32)
|
(local $btos i32)
|
||||||
(local $bbtos i32)
|
(local $bbtos i32)
|
||||||
(i32.store (local.tee $bbtos (i32.sub (local.get $tos) (i32.const 8)))
|
(local $addr i32)
|
||||||
(call $shell_accept (i32.load (local.get $bbtos))
|
(local $p i32)
|
||||||
(i32.load (local.tee $btos (i32.sub (local.get $tos) (i32.const 4))))))
|
(local $endp i32)
|
||||||
|
(local $c i32)
|
||||||
|
(local.set $endp
|
||||||
|
(i32.add
|
||||||
|
(local.tee $addr (i32.load (local.tee $bbtos (i32.sub (local.get $tos) (i32.const 8)))))
|
||||||
|
(i32.load (local.tee $btos (i32.sub (local.get $tos) (i32.const 4))))))
|
||||||
|
(local.set $p (local.get $addr))
|
||||||
|
(block $endLoop
|
||||||
|
(loop $loop
|
||||||
|
(br_if $endLoop (i32.eq (local.tee $c (call $shell_key)) (i32.const 0xa)))
|
||||||
|
(i32.store8 (local.get $p) (local.get $c))
|
||||||
|
(local.set $p (i32.add (local.get $p) (i32.const 1)))
|
||||||
|
(call $shell_emit (local.get $c))
|
||||||
|
(br_if $loop (i32.lt_u (local.get $p) (local.get $endp)))))
|
||||||
|
(i32.store (local.get $bbtos) (i32.sub (local.get $p) (local.get $addr)))
|
||||||
(local.get $btos))
|
(local.get $btos))
|
||||||
(data (i32.const 135744) "4\12\02\00" "\06" "ACCEPT\00" "<\00\00\00")
|
(data (i32.const 135744) "4\12\02\00" "\06" "ACCEPT\00" "<\00\00\00")
|
||||||
(elem (i32.const 0x3c) $ACCEPT)
|
(elem (i32.const 0x3c) $ACCEPT)
|
||||||
|
|
|
@ -14,6 +14,14 @@ function loadTests() {
|
||||||
output = output + c;
|
output = output + c;
|
||||||
// console.log(output);
|
// console.log(output);
|
||||||
};
|
};
|
||||||
|
let k = 0;
|
||||||
|
const keyString =
|
||||||
|
"abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
|
forth.key = () => {
|
||||||
|
const c = keyString.charCodeAt(k);
|
||||||
|
k = (k + 1) % keyString.length;
|
||||||
|
return c;
|
||||||
|
};
|
||||||
const x = forth.load().then(
|
const x = forth.load().then(
|
||||||
() => {
|
() => {
|
||||||
core = forth.core.exports;
|
core = forth.core.exports;
|
||||||
|
@ -1576,6 +1584,9 @@ function loadTests() {
|
||||||
"YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:\n SIGNED: -80000000 7FFFFFFF \n"
|
"YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:\n SIGNED: -80000000 7FFFFFFF \n"
|
||||||
);
|
);
|
||||||
expect(output).to.include("UNSIGNED: 0 FFFFFFFF \n");
|
expect(output).to.include("UNSIGNED: 0 FFFFFFFF \n");
|
||||||
|
expect(output).to.include(
|
||||||
|
`RECEIVED: "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr"\n`
|
||||||
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -55,6 +55,7 @@ class WAForth {
|
||||||
* `c` is the ASCII code of the character to be emitted.
|
* `c` is the ASCII code of the character to be emitted.
|
||||||
*/
|
*/
|
||||||
onEmit?: (c: string) => void;
|
onEmit?: (c: string) => void;
|
||||||
|
key: () => number;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.#fns = {};
|
this.#fns = {};
|
||||||
|
@ -70,6 +71,21 @@ class WAForth {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
const keyBuffer: string[] = [];
|
||||||
|
this.key = () => {
|
||||||
|
while (keyBuffer.length === 0) {
|
||||||
|
const c = window.prompt("Enter text");
|
||||||
|
if (c == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
keyBuffer.push(...c.split(""));
|
||||||
|
if (c.length === 0 || c.length > 1) {
|
||||||
|
keyBuffer.push("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return keyBuffer.shift()!.charCodeAt(0);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -101,26 +117,8 @@ class WAForth {
|
||||||
return buffer.pop();
|
return buffer.pop();
|
||||||
},
|
},
|
||||||
|
|
||||||
debug: (d: number) => {
|
|
||||||
console.log("DEBUG: ", d, String.fromCharCode(d));
|
|
||||||
},
|
|
||||||
|
|
||||||
key: () => {
|
key: () => {
|
||||||
let c: string | null = null;
|
return this.key();
|
||||||
while (c == null || c == "") {
|
|
||||||
c = window.prompt("Enter character");
|
|
||||||
}
|
|
||||||
return c.charCodeAt(0);
|
|
||||||
},
|
|
||||||
|
|
||||||
accept: (p: number, n: number) => {
|
|
||||||
const input = (window.prompt("Enter text") || "").substring(0, n);
|
|
||||||
const target = new Uint8Array(memory.buffer, p, input.length);
|
|
||||||
for (let i = 0; i < input.length; ++i) {
|
|
||||||
target[i] = input.charCodeAt(i);
|
|
||||||
}
|
|
||||||
console.log("ACCEPT", p, n, input.length);
|
|
||||||
return input.length;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
////////////////////////////////////////
|
////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in a new issue