mirror of
https://github.com/exoticorn/microw8.git
synced 2026-01-20 19:26:43 +01:00
first version with uw8loader
This commit is contained in:
BIN
web/src/base.wasm
Normal file
BIN
web/src/base.wasm
Normal file
Binary file not shown.
@@ -5,7 +5,8 @@
|
|||||||
<title>MicroW8</title>
|
<title>MicroW8</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<canvas id="screen" width="320" height="256" />
|
<canvas id="screen" width="320" height="256"></canvas>
|
||||||
|
<div id="message"></div>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
import "./main.js";
|
import "./main.js";
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -1,17 +1,50 @@
|
|||||||
import wasmDataUrl from "data-url:./trainride.uw8";
|
import loaderUrl from "data-url:./uw8loader.wasm";
|
||||||
|
import baseUrl from "data-url:./base.wasm";
|
||||||
|
|
||||||
async function main() {
|
async function loadWasm(url, imports) {
|
||||||
let wasm_module = await (await fetch(wasmDataUrl)).arrayBuffer();
|
let wasm_module = await (await fetch(url)).arrayBuffer();
|
||||||
let compiled_module = await WebAssembly.compile(wasm_module);
|
let compiled_module = await WebAssembly.compile(wasm_module);
|
||||||
|
|
||||||
let import_object = {
|
return new WebAssembly.Instance(compiled_module, imports);
|
||||||
|
}
|
||||||
|
|
||||||
|
let cancelFunction;
|
||||||
|
|
||||||
|
async function runModule(data) {
|
||||||
|
if(cancelFunction) {
|
||||||
|
cancelFunction();
|
||||||
|
cancelFunction = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById('message').innerText = '' + data.byteLength + ' bytes';
|
||||||
|
|
||||||
|
let loaderImport = {
|
||||||
|
uw8: {
|
||||||
|
ram: new WebAssembly.Memory({ initial: 8 })
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let loadMem = loaderImport.uw8.ram.buffer;
|
||||||
|
let loader = await loadWasm(loaderUrl, loaderImport);
|
||||||
|
|
||||||
|
new Uint8Array(loadMem).set(new Uint8Array(data));
|
||||||
|
|
||||||
|
let baseModule = await (await fetch(baseUrl)).arrayBuffer();
|
||||||
|
new Uint8Array(loadMem).set(new Uint8Array(baseModule), data.byteLength);
|
||||||
|
|
||||||
|
let destOffset = data.byteLength + baseModule.byteLength;
|
||||||
|
let endOffset = loader.exports.load_uw8(0, data.byteLength, data.byteLength, destOffset);
|
||||||
|
|
||||||
|
data = new ArrayBuffer(endOffset - destOffset);
|
||||||
|
new Uint8Array(data).set(new Uint8Array(loadMem).slice(destOffset, endOffset));
|
||||||
|
|
||||||
|
let importObject = {
|
||||||
uw8: {
|
uw8: {
|
||||||
ram: new WebAssembly.Memory({ initial: 8, maximum: 8 }),
|
ram: new WebAssembly.Memory({ initial: 8, maximum: 8 }),
|
||||||
time: new WebAssembly.Global({value: 'i32', mutable: true}, 0),
|
time: new WebAssembly.Global({value: 'i32', mutable: true}, 0),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let instance = new WebAssembly.Instance(compiled_module, import_object);
|
let instance = new WebAssembly.Instance(await WebAssembly.compile(data), importObject);
|
||||||
|
|
||||||
let canvasCtx = document.getElementById('screen').getContext('2d');
|
let canvasCtx = document.getElementById('screen').getContext('2d');
|
||||||
let imageData = canvasCtx.createImageData(320, 256);
|
let imageData = canvasCtx.createImageData(320, 256);
|
||||||
@@ -23,12 +56,18 @@ async function main() {
|
|||||||
|
|
||||||
let startTime = Date.now();
|
let startTime = Date.now();
|
||||||
|
|
||||||
|
let keepRunning = true;
|
||||||
|
cancelFunction = () => keepRunning = false;
|
||||||
|
|
||||||
function mainloop() {
|
function mainloop() {
|
||||||
import_object.uw8.time.value = Date.now() - startTime;
|
if(!keepRunning) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
importObject.uw8.time.value = Date.now() - startTime;
|
||||||
|
|
||||||
instance.exports.tic();
|
instance.exports.tic();
|
||||||
|
|
||||||
let framebuffer = new Uint8Array(import_object.uw8.ram.buffer.slice(120, 120 + 320*256));
|
let framebuffer = new Uint8Array(importObject.uw8.ram.buffer.slice(120, 120 + 320*256));
|
||||||
for(let i = 0; i < 320*256; ++i) {
|
for(let i = 0; i < 320*256; ++i) {
|
||||||
buffer[i * 4] = framebuffer[i];
|
buffer[i * 4] = framebuffer[i];
|
||||||
buffer[i * 4 + 1] = framebuffer[i];
|
buffer[i * 4 + 1] = framebuffer[i];
|
||||||
@@ -42,4 +81,13 @@ async function main() {
|
|||||||
mainloop();
|
mainloop();
|
||||||
}
|
}
|
||||||
|
|
||||||
main();
|
async function runModuleFromURL(url) {
|
||||||
|
runModule(await (await fetch(url)).arrayBuffer());
|
||||||
|
}
|
||||||
|
|
||||||
|
function runModuleFromHash() {
|
||||||
|
runModuleFromURL('data:;base64,' + window.location.hash.slice(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onhashchange = runModuleFromHash;
|
||||||
|
runModuleFromHash();
|
||||||
Binary file not shown.
BIN
web/src/uw8loader.wasm
Normal file
BIN
web/src/uw8loader.wasm
Normal file
Binary file not shown.
Reference in New Issue
Block a user