aboutsummaryrefslogtreecommitdiff
path: root/src/js/tinyvm.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/tinyvm.ts')
-rw-r--r--src/js/tinyvm.ts22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/js/tinyvm.ts b/src/js/tinyvm.ts
index 4b4bc39..56fab70 100644
--- a/src/js/tinyvm.ts
+++ b/src/js/tinyvm.ts
@@ -10,7 +10,7 @@ declare const process: any, require: any, module: any, __dirname: string, Buffer
const fs: any = typeof require === 'function' ? require('fs') : undefined;
const path: any = typeof require === 'function' ? require('path') : undefined;
-// the compiler's map, computed from src/core/memmap.h at build time (build/js/layout.js)
+// the compiler's map, computed from build/core/map/memmap.h at build time (build/js/layout.js)
import { MAP } from './layout';
// float bits stay in vm words; arithmetic uses javascript's binary64 numbers.
@@ -257,6 +257,16 @@ export class TinyVM {
}
}
+ /** load an image file's bytes (little-endian 64-bit words, the format the c cores
+ #embed) at org. returns the number of words. */
+ public loadImage(bytes: Uint8Array, org: number = this.L.GORG): number {
+ if (bytes.length % 8) throw new RangeError('an image is a whole number of 64-bit words');
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.length);
+ const n = bytes.length / 8;
+ for (let i = 0; i < n; i++) this.mem[org + i] = view.getBigInt64(i * 8, true);
+ return n;
+ }
+
public getOutput(): string {
return new TextDecoder().decode(new Uint8Array(this.outputBuffer));
}
@@ -931,13 +941,13 @@ if (typeof require === 'function' && typeof module !== 'undefined' && require.ma
process.stderr.write('tinyvm.js: unknown option ' + option + '; use --help for usage\n');
process.exit(2);
}
- const genomePath = path.join(__dirname, 'genome.json');
+ const genomePath = path.join(__dirname, 'genome.bin');
if (!fs.existsSync(genomePath)) {
- console.error('Error: genome.json not found. Run extract_genome.js first.');
+ console.error('Error: genome.bin not found beside tinyvm.js. Run make js first.');
process.exit(1);
}
- const genomeData = JSON.parse(fs.readFileSync(genomePath, 'utf8'));
+ const genome: Uint8Array = fs.readFileSync(genomePath);
let inputSource = '';
if (process.argv.length > 2) {
@@ -970,9 +980,9 @@ if (typeof require === 'function' && typeof module !== 'undefined' && require.ma
onMessage: (msg: string) => process.stderr.write(msg)
});
- vm.loadGenome(genomeData.words, genomeData.gorg);
+ vm.loadImage(genome, GORG);
vm.setInput(inputSource);
- const code = vm.run(genomeData.gorg);
+ const code = vm.run(GORG);
process.exit(code);
}