forked from ktye/ktye.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreboot.html
More file actions
103 lines (85 loc) · 4.32 KB
/
Copy pathreboot.html
File metadata and controls
103 lines (85 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<head><meta charset="utf-8"><title>w</title></head>
<link rel='icon' type'image/png' href="k32.png">
<style>
html,body,textarea,input,select{margin:0;padding:0;overflow:hidden;font-family:monospace;}table{position:absolute;width:100%;height:100%;border-collapse:collapse;}td{width:50%;}
textarea{top:0;left:0;width:100%;height:100%;background:black;color:#cccccc;border:none;resize:none;overflow-y:auto;overflow-x:hidden;scrollbar-width:none;}::-webkit-scrollbar{width:0;height:0;}
textarea:focus{color:white;}.hold{background:#666666}
</style>
<body>
<textarea id="term" class="term" wrap="off" spellcheck="false"></textarea>
<script>
var term = document.getElementById("term")
function kd(e){var N="\n";var t=e.srcElement;
if(e.which===27){pd(e);if(t.hold){t.className="";t.selectionStart=t.hold;t.hold=0}else{t.hold=t.selectionStart;t.className="hold"}}
if(e.which===13&&!t.hold){pd(e);let s=t.value,p=t.selectionStart,q=t.selectionEnd;if(p===q){p=s.slice(0,p).lastIndexOf(N)+1;q+=s.slice(q).indexOf(N)+1}else{t.value+=s.slice(p,q)}S=s.slice(p,q);exec(S,t)}
}
function dbl(e){var t=e.srcElement;t.full=!t.full;t.style.position=t.full?"absolute":""}
function out(t,s){return function(s){t.value+=s;t.scrollTo(0,t.scrollHeight)}}
term.onkeydown=kd;term.ondblclick=dbl;term.O=out(term);term.hold=0
function pd(e){if(e){e.preventDefault();e.stopPropagation()}};
function exec(s,t) {s=s.trim();
if(s=="\\c"){term.value=" ";return}
if(s.startsWith("\\l")){load(s.slice(2).trim());return}
if(s.startsWith("\\reboot")){highjump(s.slice(7).trim());return}
if((s=="\\")||(s=="\\h")){term.value+="\n"+term.help+"\n ";term.scrollTo(0,t.scrollHeight);return}
term.exec(s)}
term.value = "ktye/fosbury [enter \\ for instructions]\n "
term.exec = function(s){var s=ktry(s);term.O(s.length?"\n"+s+"\n ":"\n ")}
function KO(s){term.value += s;term.scrollTo(0,term.scrollHeight)}
function us(s){return new TextEncoder("utf-8").encode(s)}
function su(u){return (u.length)?new TextDecoder("utf-8").decode(u):""}
function cu(u){var x=mk(1,u.length);K.C.set(u,8+x);return x}
function sk(x){var n=nn(x);var s=su(K.C.slice(x+8,x+8+n));dx(x);return s}
function sy(s){return sc(cu(us(s)))}
var fname
function load(s){fname=s;
if(s.endsWith(".k"))fetch(s).then(r=>{return r.text()}).then(s=>term.exec(strip(s))) // e.g. \l m.k
else fetch(s).then(r=>{return r.arrayBuffer()}).then(b=>{dx(asn(sy(fname),cu(new Uint8Array(b))));KO("\n ")}) // e.g. \l s
}
function strip(s){return s.split("\n\\")[0]}
// ktye wasm module
var K
var draw = function(w,h,p){}
var grow = function(x) {var cur=K.exports.mem.buffer.byteLength;if((1<<x)>cur){var a=(1<<x)-cur;K.exports.mem.grow(a>>>16); msl()};return x}
var printc= function(x,y) {KO(su(K.C.slice(x,x+y)))}
var msl = function() {var b=K.exports.mem.buffer;K.C=new Uint8Array(b);K.U=new Uint32Array(b);K.I=new Int32Array(b);K.F=new Float64Array(b)}
var env = {"ext":{"sin":Math.sin,"cos":Math.cos,"exp":Math.exp,"log":Math.log,"atan2":Math.atan2,"hypot":Math.hypot,"draw":draw,"grow":grow,"printc":printc} }
var nn, tp, dx, mk, sc, val, kst, asn, lup, bak
function kinit(r){
K=r.instance;msl();K.exports.ini(16);bak=K.C.slice(0);var e=K.exports
nn=e.nn;tp=e.tp;dx=e.dx;rx=e.rx;mk=e.mk;sc=e.sc;val=e.val;kst=e.kst;asn=e.asn;lup=e.lup
}
function ktry(s){
try {var x=sk(kst(val(cu(us(s))))); bak=K.C.slice(0, 1<<K.U[32]);return x}
catch(e){K.C.set(bak);return "!\n"}}
fetch('k.wasm').then(r=>r.arrayBuffer()).then(r=>WebAssembly.instantiate(r,env)).then(r=>kinit(r))
function highjump(s){
var x=lup(sy(s));var n=nn(x);var b=K.C.slice(x+8,x+8+n)
WebAssembly.instantiate(b,env).then(r=>kinit(r))
}
term.help = `A "reboot" replaces the running wasm instance with a new binary.
We start by loading the binary we are currently running from the server.
\\l k.wasm
b:.\`"k.wasm"
#b
(click on a line and hit Enter to execute it)
k.wasm is stored in k's variable b. Let's jump to it:
\\reboot b
We have a new instance. b should not exist anymore within k.
Let's compile k.wasm from it's source (which is the file "s" on the server).
We also need the w compiler.
\\l s
\\l w.k
To prove the point, we redefine integer addition:
s: "adi.V:III{z::(I x)-I y}"/: "adi.V:III{z::(I x)+I y}"\\: s
b:wasm compile s
(nobody promised it would be fast)
Reboot and test:
1+2
\\reboot b
1+2
`
function L(x){console.log(x);return x}
</script>
</body>
</html>