From cccb99226d3951fd9dfe1c4cf1c43126a1309d51 Mon Sep 17 00:00:00 2001 From: WlodekM Date: Mon, 31 Mar 2025 19:47:54 +0300 Subject: move to pc-thing/ --- pc-thing/instructions/sys.ts | 55 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 pc-thing/instructions/sys.ts (limited to 'pc-thing/instructions/sys.ts') diff --git a/pc-thing/instructions/sys.ts b/pc-thing/instructions/sys.ts new file mode 100644 index 0000000..5131bf2 --- /dev/null +++ b/pc-thing/instructions/sys.ts @@ -0,0 +1,55 @@ +// deno-lint-ignore-file no-case-declarations no-process-globals +import { PC } from "../pc.ts"; + +export default { + function(this: PC) { + switch (this.registers[0]) { + case 0: + switch (this.registers[1]) { + case 0: + const data = new Uint8Array(1024) + const len = Deno.stdin.readSync(data) ?? 0 + let i = 0; + while (i < len) { + this.mem[this.registers[2] + i] = data[i] + i++ + } + this.registers[0] = len + this.mem[this.registers[2] + i] = 0 + break; + + default: + throw 'unknown fd' + } + break; + case 1: + const writeBuff = []; + let i = this.registers[2]; + while (this.mem[i] != 0 && i <= this.mem.length) { + writeBuff.push(this.mem[i]); + i++ + } + switch (this.registers[1]) { + case 1: + process.stdout.write(writeBuff.map(a => String.fromCharCode(a)).join('')) + break; + + case 2: + process.stderr.write(writeBuff.map(a => String.fromCharCode(a)).join('')) + break; + + default: + throw 'unknown fd' + } + break; + + case 2: + Deno.stdin.setRaw(this.registers[1] ? true : false); + break; + + default: + throw 'unknown syscall id ' + this.registers[0] + } + }, + args: 0 +} \ No newline at end of file -- cgit 1.4.1-2-gfad0