From 0600ab3b9f540fb32992553eb439701bf54fc9d0 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Wed, 14 Oct 2020 17:33:15 -0500 Subject: [PATCH] file#_post: ignore/force params --- package.json | 3 ++- src/common/baseplatform.ts | 14 +++++------ src/ide/ui.ts | 20 +++++++++------ src/tools/runmachine.ts | 51 ++++++++++++++++++++++++++++++++++++++ src/tools/tsconfig.json | 3 ++- 5 files changed, 75 insertions(+), 16 deletions(-) create mode 100644 src/tools/runmachine.ts diff --git a/package.json b/package.json index 66a29974..2b269b1a 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,8 @@ "test-platforms": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000 test/cli/testplatforms.js", "test-profile": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000 --prof test/cli", "start": "electron .", - "fuzzbasic": "jsfuzz gen/common/basic/fuzz.js ~/basic/corpus/ --versifier false" + "fuzzbasic": "jsfuzz gen/common/basic/fuzz.js ~/basic/corpus/ --versifier false", + "machine": "node gen/tools/runmachine.js" }, "main": "electron.js", "keywords": [ diff --git a/src/common/baseplatform.ts b/src/common/baseplatform.ts index 335cd778..7bca3418 100644 --- a/src/common/baseplatform.ts +++ b/src/common/baseplatform.ts @@ -1029,25 +1029,25 @@ import { ProbeRecorder } from "./recorder"; export interface Machine extends Bus, Resettable, FrameBased, AcceptsROM, HasCPU, SavesState, SavesInputState { } -function hasVideo(arg:any): arg is VideoSource { +export function hasVideo(arg:any): arg is VideoSource { return typeof arg.connectVideo === 'function'; } -function hasAudio(arg:any): arg is SampledAudioSource { +export function hasAudio(arg:any): arg is SampledAudioSource { return typeof arg.connectAudio === 'function'; } -function hasKeyInput(arg:any): arg is AcceptsKeyInput { +export function hasKeyInput(arg:any): arg is AcceptsKeyInput { return typeof arg.setKeyInput === 'function'; } -function hasPaddleInput(arg:any): arg is AcceptsPaddleInput { +export function hasPaddleInput(arg:any): arg is AcceptsPaddleInput { return typeof arg.setPaddleInput === 'function'; } -function isRaster(arg:any): arg is RasterFrameBased { +export function isRaster(arg:any): arg is RasterFrameBased { return typeof arg.getRasterY === 'function'; } -function hasProbe(arg:any): arg is Probeable { +export function hasProbe(arg:any): arg is Probeable { return typeof arg.connectProbe == 'function'; } -function hasBIOS(arg:any): arg is AcceptsBIOS { +export function hasBIOS(arg:any): arg is AcceptsBIOS { return typeof arg.loadBIOS == 'function'; } diff --git a/src/ide/ui.ts b/src/ide/ui.ts index 39f6d757..1b55224e 100644 --- a/src/ide/ui.ts +++ b/src/ide/ui.ts @@ -2129,24 +2129,30 @@ function loadImportedURL(url : string) { } async function loadFormDataUpload() { + var ignore = !!qs['ignore']; + var force = !!qs['force']; setWaitDialog(true); for (var i=0; i<20; i++) { let path = qs['file'+i+'_name']; let dataenc = qs['file'+i+'_data']; if (path == null || dataenc == null) break; - let value = dataenc; - if (qs['file'+i+'_type'] == 'binary') { - value = stringToByteArray(atob(value)); - } var olddata = await store.getItem(path); - if (!olddata || confirm("Replace existing file '" + path + "'?")) { - await store.setItem(path, value); // TODO: alert when replacing? - if (i == 0) { qs['file'] = path; } // set main filename + if (!(ignore && olddata)) { + let value = dataenc; + if (qs['file'+i+'_type'] == 'binary') { + value = stringToByteArray(atob(value)); + } + if (!olddata || force || confirm("Replace existing file '" + path + "'?")) { + await store.setItem(path, value); + } } + if (i == 0) { qs['file'] = path; } // set main filename delete qs['file'+i+'_name']; delete qs['file'+i+'_data']; delete qs['file'+i+'_type']; } + delete qs['ignore']; + delete qs['force']; setWaitDialog(false); replaceURLState(); } diff --git a/src/tools/runmachine.ts b/src/tools/runmachine.ts new file mode 100644 index 00000000..e3daa4a9 --- /dev/null +++ b/src/tools/runmachine.ts @@ -0,0 +1,51 @@ + +import { hasAudio, hasVideo, Machine } from "../common/baseplatform"; +import { SampledAudioSink } from "../common/devices"; + +class NullAudio implements SampledAudioSink { + feedSample(value: number, count: number): void { + } +} + +class MachineRunner { + machine: Machine; + pixels: Uint32Array; + + constructor(machine: Machine) { + this.machine = machine; + } + setup() { + if (hasVideo(this.machine)) { + var vid = this.machine.getVideoParams(); + this.pixels = new Uint32Array(vid.width * vid.height); + this.machine.connectVideo(this.pixels); + } + if (hasAudio(this.machine)) { + this.machine.connectAudio(new NullAudio()); + } + this.machine.reset(); + } + run() { + this.machine.advanceFrame(null); + } +} + +async function loadMachine(modname: string, clsname: string) : Promise { + var mod = await import('../machine/'+modname); + var cls = mod[clsname]; + var machine = new cls(); + return machine; +} + +async function runMachine() { + var machine = await loadMachine(process.argv[2], process.argv[3]); + var runner = new MachineRunner(machine); + runner.setup(); + runner.run(); + console.log(runner.machine.saveState()); +} + +global.atob = require('atob'); +global.btoa = require('btoa'); +runMachine(); + diff --git a/src/tools/tsconfig.json b/src/tools/tsconfig.json index 9bedf86b..354d538d 100644 --- a/src/tools/tsconfig.json +++ b/src/tools/tsconfig.json @@ -5,7 +5,8 @@ "outDir": "../../gen/tools" }, "references": [ - { "path": "../common" } + { "path": "../common" }, + { "path": "../machine" } ], "include": [ "**/*.ts"