emulator/fc2/js/nes-worker.js
2019-06-11 15:27:11 +08:00

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();
}