159 lines
4.1 KiB
JavaScript
159 lines
4.1 KiB
JavaScript
if('function' === typeof importScripts) {
|
|
importScripts('./jsnes.min.js');
|
|
}
|
|
var SCREEN_WIDTH = 256;
|
|
var SCREEN_HEIGHT = 240;
|
|
var FRAMEBUFFER_SIZE = SCREEN_WIDTH * SCREEN_HEIGHT;
|
|
var framebuffer_u8, framebuffer_u32;
|
|
|
|
var AUDIO_BUFFERING = 512;
|
|
var SAMPLE_COUNT = 4 * 1024;
|
|
var SAMPLE_MASK = SAMPLE_COUNT - 1;
|
|
var audio_samples_L = new Float32Array(SAMPLE_COUNT);
|
|
var audio_samples_R = new Float32Array(SAMPLE_COUNT);
|
|
var audio_write_cursor = 0
|
|
, audio_read_cursor = 0;
|
|
var netmode = false;
|
|
|
|
var nes = new jsnes.NES({
|
|
onFrame: function(framebuffer_24) {
|
|
for (var i = 0; i < FRAMEBUFFER_SIZE; i++)
|
|
framebuffer_u32[i] = 0xFF000000 | framebuffer_24[i];
|
|
},
|
|
onAudioSample: function(l, r) {
|
|
audio_samples_L[audio_write_cursor] = l;
|
|
audio_samples_R[audio_write_cursor] = r;
|
|
audio_write_cursor = (audio_write_cursor + 1) & SAMPLE_MASK;
|
|
},
|
|
});
|
|
|
|
function keyboard(callback, event, p) {
|
|
var player = p || 1;
|
|
switch (event.keyCode) {
|
|
case 38:
|
|
// UP
|
|
callback(player, jsnes.Controller.BUTTON_UP);
|
|
break;
|
|
case 40:
|
|
// Down
|
|
callback(player, jsnes.Controller.BUTTON_DOWN);
|
|
break;
|
|
case 37:
|
|
// Left
|
|
callback(player, jsnes.Controller.BUTTON_LEFT);
|
|
break;
|
|
case 39:
|
|
// Right
|
|
callback(player, jsnes.Controller.BUTTON_RIGHT);
|
|
break;
|
|
case 65:
|
|
// 'a' - qwerty, dvorak
|
|
case 81:
|
|
// 'q' - azerty
|
|
callback(player, jsnes.Controller.BUTTON_A);
|
|
break;
|
|
case 83:
|
|
// 's' - qwerty, azerty
|
|
case 79:
|
|
// 'o' - dvorak
|
|
callback(player, jsnes.Controller.BUTTON_B);
|
|
break;
|
|
case 9:
|
|
// Tab
|
|
callback(player, jsnes.Controller.BUTTON_SELECT);
|
|
break;
|
|
case 13:
|
|
// Return
|
|
callback(player, jsnes.Controller.BUTTON_START);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
onmessage = function(event) {
|
|
switch (event.data.f) {
|
|
case 'nesloadROM':
|
|
nes.loadROM(event.data.data);
|
|
|
|
if (netmode === false) {
|
|
setInterval(function() {
|
|
nes.frame();
|
|
postMessage({
|
|
f: "frame",
|
|
data: {
|
|
framebuffer_u8: framebuffer_u8,
|
|
audio_samples_L: audio_samples_L,
|
|
audio_samples_R: audio_samples_R,
|
|
audio_read_cursor: audio_read_cursor,
|
|
}
|
|
});
|
|
}, 1000 / 60)
|
|
}
|
|
break;
|
|
case 'updateframe':
|
|
nes.frame();
|
|
postMessage({
|
|
f: "frame",
|
|
data: {
|
|
framebuffer_u8: framebuffer_u8,
|
|
audio_samples_L: audio_samples_L,
|
|
audio_samples_R: audio_samples_R,
|
|
audio_read_cursor: audio_read_cursor,
|
|
}
|
|
});
|
|
break;
|
|
case 'netmode':
|
|
netmode = event.data.data;
|
|
break;
|
|
case 'setBuffer':
|
|
var buffer = new ArrayBuffer(event.data.data);
|
|
framebuffer_u8 = new Uint8ClampedArray(buffer);
|
|
framebuffer_u32 = new Uint32Array(buffer);
|
|
break;
|
|
case 'keypad':
|
|
if (event.data.data.action === "keydown") {
|
|
keyboard(nes.buttonDown, event.data.data)
|
|
} else {
|
|
keyboard(nes.buttonUp, event.data.data)
|
|
}
|
|
break;
|
|
case 'netkeypad':
|
|
if (event.data.data.keyaction === "keydown") {
|
|
keyboard(nes.buttonDown, event.data.data, event.data.data.player)
|
|
} else {
|
|
keyboard(nes.buttonUp, event.data.data, event.data.data.player)
|
|
}
|
|
break;
|
|
case 'netframe':
|
|
nes.frame();
|
|
postMessage({
|
|
f: "frame",
|
|
data: {
|
|
framebuffer_u8: framebuffer_u8,
|
|
audio_samples_L: audio_samples_L,
|
|
audio_samples_R: audio_samples_R,
|
|
audio_read_cursor: audio_read_cursor,
|
|
}
|
|
});
|
|
break;
|
|
case 'save':
|
|
var currData = nes.toJSON();
|
|
var saveData = JSON.stringify(currData);
|
|
postMessage({
|
|
f: "saveData",
|
|
data: saveData
|
|
});
|
|
break;
|
|
case 'load':
|
|
var decodedData = event.data.data;
|
|
console.log(decodedData);
|
|
nes.fromJSON(decodedData);
|
|
break;
|
|
case 'reload':
|
|
nes.reloadROM();
|
|
break;
|
|
}
|
|
//console.log('11Received message ' + event.data);
|
|
// doSomething();
|
|
}
|