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