diff options
Diffstat (limited to 'src/js/tinyvm.ts')
| -rw-r--r-- | src/js/tinyvm.ts | 22 |
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); } |
