This repository has been archived by the owner on Jan 31, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 27
/
Copy pathmain.js
executable file
·85 lines (73 loc) · 2.18 KB
/
main.js
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
import Oscillator from './src/nes/browser/oscillator.js';
import Noise from './src/nes/browser/noise.js';
let buf = null
const convertKeyCode = (keyCode) => {
switch (keyCode) {
case 88: return 0x01; // X A
case 90: return 0x02; // Z B
case 65: return 0x04; // A SELECT
case 83: return 0x08; // S START
case 38: return 0x10; // ↑ ↑
case 40: return 0x20; // ↓ ↓
case 37: return 0x40; // ← ←
case 39: return 0x80; // → →
}
};
const onKeydown = (e) => {
if (buf != null)
buf[buf.length - 1] |= convertKeyCode(e.keyCode);
}
const onKeyup = (e) => {
if (buf != null)
buf[buf.length - 1] &= ~convertKeyCode(e.keyCode);
}
const setupKeyHandler = () => {
if (typeof window !== 'undefined') {
document.addEventListener('keydown', onKeydown);
document.addEventListener('keyup', onKeyup);
}
};
setupKeyHandler();
const startArrayBuf = (arrayBuf) => {
const run = Module.cwrap('run', null, ['number', 'number']);
const canvas = document.querySelector("canvas");
const ctx = canvas.getContext('2d');
if (Module.NES) {
Module.NES.oscs.forEach(o => o.close());
Module.NES.noise.close();
}
Module.NES = {
ctx,
canvas,
image: ctx.createImageData(256, 240),
oscs: [new Oscillator(), new Oscillator(), new Oscillator('triangle')],
noise: new Noise(),
}
canvas.width = 256;
canvas.height = 240;
const nes = new Uint8Array(arrayBuf);
// Add key code area to tail.
const size = nes.byteLength + 1;
const ptr = Module._malloc(size);
buf = new Uint8Array(Module.HEAPU8.buffer, ptr, size);
buf.set(nes);
console.log('start nes');
run(size, buf.byteOffset);
};
export const start = async (rom = './roms/falling.nes') => {
const res = await fetch(rom);
const arrayBuf = await res.arrayBuffer();
startArrayBuf(arrayBuf);
};
export const startFile = async (file) => {
const loadFile = (file) => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = (e) => resolve(e.target.result);
reader.onerror = (e) => reject(reader.error);
reader.readAsArrayBuffer(file);
});
};
const arrayBuf = await loadFile(file)
startArrayBuf(arrayBuf);
};