aboutsummaryrefslogtreecommitdiff
path: root/projects/chip8emu/module.js
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2024-03-10 18:13:33 +0530
committerRaghuram Subramani <raghus2247@gmail.com>2024-03-10 18:13:33 +0530
commit305b87aaa0c5a5fcab4295f83744831a5cb8586e (patch)
tree5979f725a00ae5f012068436f69e0856d714a5a3 /projects/chip8emu/module.js
parentc1927ab79c96435b325be26eaefda430e929d442 (diff)
progress
Diffstat (limited to 'projects/chip8emu/module.js')
-rw-r--r--projects/chip8emu/module.js85
1 files changed, 85 insertions, 0 deletions
diff --git a/projects/chip8emu/module.js b/projects/chip8emu/module.js
new file mode 100644
index 0000000..711736e
--- /dev/null
+++ b/projects/chip8emu/module.js
@@ -0,0 +1,85 @@
+var statusElement = document.getElementById('status');
+var progressElement = document.getElementById('progress');
+
+var Module = {
+ print: (function() {
+ var element = document.getElementById('output');
+ if (element) element.value = ''; // clear browser cache
+ return function(text) {
+ if (arguments.length > 1) text = Array.prototype.slice.call(arguments).join(' ');
+ console.log(text);
+ if (element) {
+ element.value += text + "\n";
+ element.scrollTop = element.scrollHeight;
+ }
+ };
+ })(),
+ canvas: (() => {
+ var canvas = document.getElementById('canvas');
+
+ // As a default initial behavior, pop up an alert when webgl context is lost. To make your
+ // application robust, you may want to override this behavior before shipping!
+ // See http://www.khronos.org/registry/webgl/specs/latest/1.0/#5.15.2
+ canvas.addEventListener("webglcontextlost", (e) => { alert('WebGL context lost. You will need to reload the page.'); e.preventDefault(); }, false);
+
+ return canvas;
+ })(),
+ setStatus: (text) => {
+ if (!Module.setStatus.last) Module.setStatus.last = { time: Date.now(), text: '' };
+ if (text === Module.setStatus.last.text) return;
+ var m = text.match(/([^(]+)\((\d+(\.\d+)?)\/(\d+)\)/);
+ var now = Date.now();
+ if (m && now - Module.setStatus.last.time < 30) return; // if this is a progress update, skip it if too soon
+ Module.setStatus.last.time = now;
+ Module.setStatus.last.text = text;
+ if (m) {
+ text = m[1];
+ progressElement.value = parseInt(m[2])*100;
+ progressElement.max = parseInt(m[4])*100;
+ progressElement.hidden = false;
+ } else {
+ progressElement.value = null;
+ progressElement.max = null;
+ }
+ statusElement.innerHTML = text;
+ },
+ totalDependencies: 0,
+ arguments: ['10', '2', 'roms/rom.ch8'],
+ monitorRunDependencies: (left) => {
+ this.totalDependencies = Math.max(this.totalDependencies, left);
+ Module.setStatus(left ? 'Preparing... (' + (this.totalDependencies-left) + '/' + this.totalDependencies + ')' : 'All downloads complete.');
+ },
+ simulateKeyPressE: function() {
+ var canvas = document.getElementById('canvas');
+ canvas.focus();
+
+ canvas.dispatchEvent(new KeyboardEvent('keydown', { 'key': 'e', 'code': 'KeyE', 'keyCode': 82 }));
+ }
+};
+Module.setStatus('Downloading...');
+window.onerror = () => {
+ Module.setStatus('Exception thrown, see JavaScript console');
+ Module.setStatus = (text) => {
+ if (text) console.error('[post-exception status] ' + text);
+ };
+};
+
+document.addEventListener("keydown", (function(e) {
+ var t = document.getElementById("canvas"),
+ n = new KeyboardEvent("keydown", {
+ key: e.key,
+ code: e.code,
+ keyCode: e.keyCode
+ });
+ t.dispatchEvent(n)
+}))
+
+document.addEventListener("keyup", (function(e) {
+ var t = document.getElementById("canvas"),
+ n = new KeyboardEvent("keyup", {
+ key: e.key,
+ code: e.code,
+ keyCode: e.keyCode
+ });
+ t.dispatchEvent(n)
+}))