aboutsummaryrefslogtreecommitdiff
path: root/projects/chip8emu/module.js
blob: 711736e75136cd49b986db0d213f7923a45a7d5f (plain)
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
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)
}))