started migration to esbuild modules

This commit is contained in:
Steven Hugg 2021-08-01 13:03:50 -05:00
parent 5c52862a0b
commit 4506ebd7e0
33 changed files with 384 additions and 822 deletions

View File

@ -43,9 +43,11 @@ meta/electron.diff: index.html electron.html
-diff -u index.html electron.html > $@ -diff -u index.html electron.html > $@
tsweb: tsweb:
npm run esbuild-clean
(ip addr || ifconfig) | grep inet (ip addr || ifconfig) | grep inet
$(TSC) -w & $(TSC) -w --preserveWatchOutput &
npm run eswatch & npm run esbuild-worker -- --watch &
npm run esbuild-ui -- --watch &
python3 scripts/serveit.py 2>> /dev/null #http.out python3 scripts/serveit.py 2>> /dev/null #http.out
astrolibre.b64.txt: astrolibre.rom astrolibre.b64.txt: astrolibre.rom

View File

@ -56,47 +56,16 @@ if (window.location.host.endsWith('8bitworkshop.com')) {
<script src="jquery/jquery.min.js"></script> <script src="jquery/jquery.min.js"></script>
<script src="javatari.js/release/javatari/javatari.js"></script> <script src="javatari.js/release/javatari/javatari.js"></script>
<script src="jsnes/dist/jsnes.min.js"></script>
<script src="src/common/cpu/6809.js"></script> <script src="src/common/cpu/6809.js"></script>
<script src="lib/FileSaver.min.js"></script> <script src="lib/FileSaver.min.js"></script>
<script src="lib/mousetrap.min.js"></script>
<script src="lib/mousetrap-global-bind.min.js"></script>
<script>
var exports = {};
function require(modname) {
if (modname == 'jquery') return $;
else if (modname.startsWith('.')) return exports;
else { console.log("Unknown require()", modname); return exports; }
}
</script>
<script src="tss/js/tss/PsgDeviceChannel.js"></script> <script src="tss/js/tss/PsgDeviceChannel.js"></script>
<script src="tss/js/tss/MasterChannel.js"></script> <script src="tss/js/tss/MasterChannel.js"></script>
<script src="tss/js/tss/AudioLooper.js"></script> <script src="tss/js/tss/AudioLooper.js"></script>
<script src="tss/js/Log.js"></script> <script src="tss/js/Log.js"></script>
<script src="gen/common/video/tms9918a.js"></script>
<script src="gen/common/util.js"></script>
<script src="gen/common/emu.js"></script>
<script src="gen/common/baseplatform.js"></script>
<script src="gen/common/audio.js"></script>
<script src="gen/common/recorder.js"></script>
<script src="gen/common/devices.js"></script>
<script src="gen/common/cpu/MOS6502.js"></script>
<script src="gen/common/cpu/ZilogZ80.js"></script>
<script src="gen/machine/vdp_z80.js"></script>
<script src="gen/ide/embedui.js"></script>
<script src="lib/liblzg.js"></script> <script src="lib/liblzg.js"></script>
<script> <script src="gen/embedui.js" type="module"></script>
// are we not in an iframe?
if(self === top) {
document.body.style.backgroundColor = '#555';
}
startEmbed();
</script>
</body> </body>
</html> </html>

View File

@ -555,7 +555,6 @@ if (window.location.host.endsWith('8bitworkshop.com')) {
<script src="codemirror/addon/selection/active-line.js"></script> <script src="codemirror/addon/selection/active-line.js"></script>
<link rel="stylesheet" href="codemirror/addon/dialog/dialog.css"> <link rel="stylesheet" href="codemirror/addon/dialog/dialog.css">
<script src="javatari.js/release/javatari/javatari.js"></script> <script src="javatari.js/release/javatari/javatari.js"></script>
<script src="jsnes/dist/jsnes.min.js"></script>
<script src="src/common/cpu/6809.js"></script> <script src="src/common/cpu/6809.js"></script>
<script src="lib/mousetrap.min.js"></script> <script src="lib/mousetrap.min.js"></script>
<script src="lib/mousetrap-global-bind.min.js"></script> <script src="lib/mousetrap-global-bind.min.js"></script>
@ -563,18 +562,6 @@ if (window.location.host.endsWith('8bitworkshop.com')) {
<link rel="stylesheet" href="lib/bootstrap-tourist.css"> <link rel="stylesheet" href="lib/bootstrap-tourist.css">
<script src="lib/bootstrap-tourist.js"></script> <script src="lib/bootstrap-tourist.js"></script>
<script src="lib/FileSaver.min.js"></script> <script src="lib/FileSaver.min.js"></script>
<script src="lib/localforage.min.js"></script>
<script src="lib/split.min.js"></script>
<script>
var exports = {};
function require(modname) {
if (modname == 'jquery') return $;
else if (modname == 'localforage') return localforage;
else if (modname.startsWith('.')) return exports;
else { console.log("Unknown require()", modname); return exports; }
}
</script>
<script src="lib/octokat.js"></script> <script src="lib/octokat.js"></script>
<script src="tss/js/tss/PsgDeviceChannel.js"></script> <script src="tss/js/tss/PsgDeviceChannel.js"></script>
@ -582,29 +569,7 @@ function require(modname) {
<script src="tss/js/tss/AudioLooper.js"></script> <script src="tss/js/tss/AudioLooper.js"></script>
<script src="tss/js/Log.js"></script> <script src="tss/js/Log.js"></script>
<script src="gen/ide/vlist.js"></script> <script src="gen/ui.js" type="module"></script>
<script src="gen/common/video/tms9918a.js"></script>
<script src="gen/common/util.js"></script>
<script src="gen/common/emu.js"></script>
<script src="gen/common/baseplatform.js"></script>
<script src="gen/common/analysis.js"></script>
<script src="gen/common/audio.js"></script>
<script src="gen/common/cpu/disasm6502.js"></script>
<script src="gen/common/cpu/disasmz80.js"></script>
<script src="gen/common/workertypes.js"></script>
<script src="gen/ide/project.js"></script>
<script src="gen/ide/windows.js"></script>
<script src="gen/ide/views.js"></script>
<script src="gen/common/recorder.js"></script>
<script src="gen/ide/waveform.js"></script>
<script src="gen/ide/pixeleditor.js"></script>
<script src="gen/ide/services.js"></script>
<script src="gen/ide/ui.js"></script>
<script src="gen/common/devices.js"></script>
<script src="gen/common/cpu/MOS6502.js"></script>
<script src="gen/common/cpu/ZilogZ80.js"></script>
<script src="gen/common/cpu/ARM.js"></script>
<script src="gen/machine/vdp_z80.js"></script>
<script> <script>
// submenus open on click + hover // submenus open on click + hover
@ -615,10 +580,6 @@ $( ".dropdown-submenu" ).click(function(event) {
}); });
</script> </script>
<script>
startUI();
</script>
<!-- Sentry error reporting --> <!-- Sentry error reporting -->
<script <script
src="https://browser.sentry-cdn.com/6.4.1/bundle.min.js" src="https://browser.sentry-cdn.com/6.4.1/bundle.min.js"

File diff suppressed because one or more lines are too long

173
lib/capstone-arm.min.js vendored Normal file

File diff suppressed because one or more lines are too long

56
package-lock.json generated
View File

@ -1,11 +1,11 @@
{ {
"name": "8bitworkshop", "name": "8bitworkshop",
"version": "3.8.1", "version": "3.9.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"version": "3.8.1", "version": "3.9.0",
"license": "GPL-3.0", "license": "GPL-3.0",
"dependencies": { "dependencies": {
"@sentry/electron": "^2.5.1", "@sentry/electron": "^2.5.1",
@ -14,8 +14,11 @@
"@wasmer/wasmfs": "^0.12.0", "@wasmer/wasmfs": "^0.12.0",
"binaryen": "^101.0.0", "binaryen": "^101.0.0",
"chokidar": "^3.5.0", "chokidar": "^3.5.0",
"jquery": "^3.5.1", "jquery": "^3.6.0",
"localforage": "^1.9.0",
"mousetrap": "^1.6.5",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"split.js": "^1.6.2",
"update-electron-app": "^2.0.1" "update-electron-app": "^2.0.1"
}, },
"devDependencies": { "devDependencies": {
@ -28,7 +31,7 @@
"bootstrap": "^3.4.1", "bootstrap": "^3.4.1",
"bootstrap-tourist": "^0.2.1", "bootstrap-tourist": "^0.2.1",
"btoa": "^1.2.x", "btoa": "^1.2.x",
"chromedriver": "^90.0.1", "chromedriver": "^92.0.0",
"clipboard": "^2.0.6", "clipboard": "^2.0.6",
"command-exists": "^1.2.9", "command-exists": "^1.2.9",
"electron": "^9.4.0", "electron": "^9.4.0",
@ -40,16 +43,13 @@
"jsdom": "^12.2.0", "jsdom": "^12.2.0",
"jsfuzz": "^1.0.14", "jsfuzz": "^1.0.14",
"jszip": "^3.5.0", "jszip": "^3.5.0",
"localforage": "^1.9.0",
"lzg": "^1.0.x", "lzg": "^1.0.x",
"mocha": "^7.2.0", "mocha": "^7.2.0",
"mocha-simple-html-reporter": "^2.0.0", "mocha-simple-html-reporter": "^2.0.0",
"mousetrap": "^1.6.5",
"nightwatch": "^1.6.4", "nightwatch": "^1.6.4",
"octokat": "^0.10.0", "octokat": "^0.10.0",
"pngjs": "^3.4.0", "pngjs": "^3.4.0",
"rgbquant": "^1.1.2", "rgbquant": "^1.1.2",
"split.js": "^1.6.2",
"typedoc": "^0.21.0", "typedoc": "^0.21.0",
"typescript": "^4.3.4", "typescript": "^4.3.4",
"typescript-formatter": "^7.2.2", "typescript-formatter": "^7.2.2",
@ -1965,8 +1965,9 @@
} }
}, },
"node_modules/chromedriver": { "node_modules/chromedriver": {
"version": "90.0.1", "version": "92.0.0",
"integrity": "sha512-jvyhin0I/Bacxfet7eg29B1j+5mKR35XwWGbgcCOUALeE3mqcCKJY8xUW9cVrqVqTK9/iUOq8/kar7qrTVshPA==", "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-92.0.0.tgz",
"integrity": "sha512-IdJ5n5jLL6tCsGQF/fQHF2gDEhVzoYIqktUn6hE/BSsXlCcyDTi45fQbhTEhZlmshM8+BpnRtPuIT5DRbxNqKg==",
"dev": true, "dev": true,
"hasInstallScript": true, "hasInstallScript": true,
"dependencies": { "dependencies": {
@ -4539,8 +4540,7 @@
}, },
"node_modules/immediate": { "node_modules/immediate": {
"version": "3.0.6", "version": "3.0.6",
"integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
"dev": true
}, },
"node_modules/import-lazy": { "node_modules/import-lazy": {
"version": "2.1.0", "version": "2.1.0",
@ -5382,7 +5382,6 @@
"node_modules/localforage": { "node_modules/localforage": {
"version": "1.9.0", "version": "1.9.0",
"integrity": "sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==", "integrity": "sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==",
"dev": true,
"dependencies": { "dependencies": {
"lie": "3.1.1" "lie": "3.1.1"
} }
@ -5390,7 +5389,6 @@
"node_modules/localforage/node_modules/lie": { "node_modules/localforage/node_modules/lie": {
"version": "3.1.1", "version": "3.1.1",
"integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
"dev": true,
"dependencies": { "dependencies": {
"immediate": "~3.0.5" "immediate": "~3.0.5"
} }
@ -5970,8 +5968,7 @@
}, },
"node_modules/mousetrap": { "node_modules/mousetrap": {
"version": "1.6.5", "version": "1.6.5",
"integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==", "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="
"dev": true
}, },
"node_modules/ms": { "node_modules/ms": {
"version": "2.1.2", "version": "2.1.2",
@ -6006,8 +6003,9 @@
} }
}, },
"node_modules/nightwatch": { "node_modules/nightwatch": {
"version": "1.7.3", "version": "1.7.8",
"integrity": "sha512-8haEi+FhJfjB3bfhsmNhGrllhFsLz+Ax+xxLbJ1vvyKPH27XgQQQ3UbYXAq2kvj+TiyfT4nHeHLKEwRvVeY3kA==", "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-1.7.8.tgz",
"integrity": "sha512-GTY2VoPU2EuoBUB+mz5tAjeEWRQmuT54Il2lOUTmpv87D7cO8fXaadrxSHwl2YDX9rDFvNZovqwiKBtk3/5R6w==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"assertion-error": "^1.1.0", "assertion-error": "^1.1.0",
@ -7927,8 +7925,7 @@
}, },
"node_modules/split.js": { "node_modules/split.js": {
"version": "1.6.4", "version": "1.6.4",
"integrity": "sha512-kYmQZprRJrF1IOjg/E+gdBEsKFv5kbgUE6RJVJZvrIzTOK/IHzKSqIeiJnWs7IP5D9TnpTQ2CbanuDuIWcyDUQ==", "integrity": "sha512-kYmQZprRJrF1IOjg/E+gdBEsKFv5kbgUE6RJVJZvrIzTOK/IHzKSqIeiJnWs7IP5D9TnpTQ2CbanuDuIWcyDUQ=="
"dev": true
}, },
"node_modules/sprintf-js": { "node_modules/sprintf-js": {
"version": "1.0.3", "version": "1.0.3",
@ -10669,8 +10666,9 @@
} }
}, },
"chromedriver": { "chromedriver": {
"version": "90.0.1", "version": "92.0.0",
"integrity": "sha512-jvyhin0I/Bacxfet7eg29B1j+5mKR35XwWGbgcCOUALeE3mqcCKJY8xUW9cVrqVqTK9/iUOq8/kar7qrTVshPA==", "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-92.0.0.tgz",
"integrity": "sha512-IdJ5n5jLL6tCsGQF/fQHF2gDEhVzoYIqktUn6hE/BSsXlCcyDTi45fQbhTEhZlmshM8+BpnRtPuIT5DRbxNqKg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@testim/chrome-version": "^1.0.7", "@testim/chrome-version": "^1.0.7",
@ -12637,8 +12635,7 @@
}, },
"immediate": { "immediate": {
"version": "3.0.6", "version": "3.0.6",
"integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
"dev": true
}, },
"import-lazy": { "import-lazy": {
"version": "2.1.0", "version": "2.1.0",
@ -13254,7 +13251,6 @@
"localforage": { "localforage": {
"version": "1.9.0", "version": "1.9.0",
"integrity": "sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==", "integrity": "sha512-rR1oyNrKulpe+VM9cYmcFn6tsHuokyVHFaCM3+osEmxaHTbEk8oQu6eGDfS6DQLWi/N67XRmB8ECG37OES368g==",
"dev": true,
"requires": { "requires": {
"lie": "3.1.1" "lie": "3.1.1"
}, },
@ -13262,7 +13258,6 @@
"lie": { "lie": {
"version": "3.1.1", "version": "3.1.1",
"integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=",
"dev": true,
"requires": { "requires": {
"immediate": "~3.0.5" "immediate": "~3.0.5"
} }
@ -13734,8 +13729,7 @@
}, },
"mousetrap": { "mousetrap": {
"version": "1.6.5", "version": "1.6.5",
"integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==", "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="
"dev": true
}, },
"ms": { "ms": {
"version": "2.1.2", "version": "2.1.2",
@ -13767,8 +13761,9 @@
"dev": true "dev": true
}, },
"nightwatch": { "nightwatch": {
"version": "1.7.3", "version": "1.7.8",
"integrity": "sha512-8haEi+FhJfjB3bfhsmNhGrllhFsLz+Ax+xxLbJ1vvyKPH27XgQQQ3UbYXAq2kvj+TiyfT4nHeHLKEwRvVeY3kA==", "resolved": "https://registry.npmjs.org/nightwatch/-/nightwatch-1.7.8.tgz",
"integrity": "sha512-GTY2VoPU2EuoBUB+mz5tAjeEWRQmuT54Il2lOUTmpv87D7cO8fXaadrxSHwl2YDX9rDFvNZovqwiKBtk3/5R6w==",
"dev": true, "dev": true,
"requires": { "requires": {
"assertion-error": "^1.1.0", "assertion-error": "^1.1.0",
@ -15232,8 +15227,7 @@
}, },
"split.js": { "split.js": {
"version": "1.6.4", "version": "1.6.4",
"integrity": "sha512-kYmQZprRJrF1IOjg/E+gdBEsKFv5kbgUE6RJVJZvrIzTOK/IHzKSqIeiJnWs7IP5D9TnpTQ2CbanuDuIWcyDUQ==", "integrity": "sha512-kYmQZprRJrF1IOjg/E+gdBEsKFv5kbgUE6RJVJZvrIzTOK/IHzKSqIeiJnWs7IP5D9TnpTQ2CbanuDuIWcyDUQ=="
"dev": true
}, },
"sprintf-js": { "sprintf-js": {
"version": "1.0.3", "version": "1.0.3",

View File

@ -1,6 +1,6 @@
{ {
"name": "8bitworkshop", "name": "8bitworkshop",
"version": "3.8.1", "version": "3.9.0",
"author": "Steven Hugg", "author": "Steven Hugg",
"category": "Development", "category": "Development",
"description": "Desktop version of 8bitworkshop.com retro programming IDE", "description": "Desktop version of 8bitworkshop.com retro programming IDE",
@ -16,8 +16,11 @@
"@wasmer/wasmfs": "^0.12.0", "@wasmer/wasmfs": "^0.12.0",
"binaryen": "^101.0.0", "binaryen": "^101.0.0",
"chokidar": "^3.5.0", "chokidar": "^3.5.0",
"jquery": "^3.5.1", "jquery": "^3.6.0",
"localforage": "^1.9.0",
"mousetrap": "^1.6.5",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"split.js": "^1.6.2",
"update-electron-app": "^2.0.1" "update-electron-app": "^2.0.1"
}, },
"devDependencies": { "devDependencies": {
@ -30,7 +33,7 @@
"bootstrap": "^3.4.1", "bootstrap": "^3.4.1",
"bootstrap-tourist": "^0.2.1", "bootstrap-tourist": "^0.2.1",
"btoa": "^1.2.x", "btoa": "^1.2.x",
"chromedriver": "^90.0.1", "chromedriver": "^92.0.0",
"clipboard": "^2.0.6", "clipboard": "^2.0.6",
"command-exists": "^1.2.9", "command-exists": "^1.2.9",
"electron": "^9.4.0", "electron": "^9.4.0",
@ -42,16 +45,13 @@
"jsdom": "^12.2.0", "jsdom": "^12.2.0",
"jsfuzz": "^1.0.14", "jsfuzz": "^1.0.14",
"jszip": "^3.5.0", "jszip": "^3.5.0",
"localforage": "^1.9.0",
"lzg": "^1.0.x", "lzg": "^1.0.x",
"mocha": "^7.2.0", "mocha": "^7.2.0",
"mocha-simple-html-reporter": "^2.0.0", "mocha-simple-html-reporter": "^2.0.0",
"mousetrap": "^1.6.5",
"nightwatch": "^1.6.4", "nightwatch": "^1.6.4",
"octokat": "^0.10.0", "octokat": "^0.10.0",
"pngjs": "^3.4.0", "pngjs": "^3.4.0",
"rgbquant": "^1.1.2", "rgbquant": "^1.1.2",
"split.js": "^1.6.2",
"typedoc": "^0.21.0", "typedoc": "^0.21.0",
"typescript": "^4.3.4", "typescript": "^4.3.4",
"typescript-formatter": "^7.2.2", "typescript-formatter": "^7.2.2",
@ -60,8 +60,10 @@
"scripts": { "scripts": {
"build": "tsc --build tsconfig.json", "build": "tsc --build tsconfig.json",
"test": "npm run test-node", "test": "npm run test-node",
"esbuild": "esbuild src/worker/workermain.ts --bundle --minify --sourcemap --target=es2020,chrome58,firefox57,safari11 --outfile=./gen/worker/bundle.js --external:binaryen", "esbuild": "npm run esbuild-worker && npm run esbuild-ui",
"eswatch": "npm run esbuild -- --watch", "esbuild-clean": "rm -f ./gen/*.*",
"esbuild-worker": "esbuild src/worker/workermain.ts --bundle --minify --sourcemap --target=es2020,chrome58,firefox57,safari11 --outfile=./gen/worker/bundle.js",
"esbuild-ui": "esbuild src/ide/ui.ts src/ide/embedui.ts --splitting --format=esm --bundle --minify --sourcemap --target=es2020 --outdir=./gen/ --external:path --external:fs",
"test-one": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000", "test-one": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000",
"test-node": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000 test/cli", "test-node": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000 test/cli",
"test-profile": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000 --prof test/cli", "test-profile": "NODE_PATH=$(pwd) mocha --recursive --timeout 60000 --prof test/cli",

View File

@ -138,6 +138,7 @@ export interface Platform {
readFile?(path: string) : FileData; readFile?(path: string) : FileData;
writeFile?(path: string, data: FileData) : boolean; writeFile?(path: string, data: FileData) : boolean;
sourceFileFetch?: (path:string) => FileData;
getDownloadFile?() : {extension:string, blob:Blob}; getDownloadFile?() : {extension:string, blob:Blob};
} }
@ -1556,7 +1557,7 @@ export abstract class BaseWASMMachine {
} }
} }
import { loadScript } from "../ide/ui"; import { loadScript } from "../common/util";
import { WasmFs } from "@wasmer/wasmfs"; import { WasmFs } from "@wasmer/wasmfs";
let stub = function() { console.log(arguments); return 0 } let stub = function() { console.log(arguments); return 0 }

View File

@ -194,7 +194,7 @@ export class BASICRuntime {
getBuiltinFunctions() { getBuiltinFunctions() {
var fnames = this.program && this.opts.validFunctions; var fnames = this.program && this.opts.validFunctions;
// if no valid function list, look for ABC...() functions in prototype // if no valid function list, look for ABC...() functions in prototype
if (!fnames) fnames = Object.keys(BASICRuntime.prototype).filter((name) => /^[A-Z]{3,}[$]?$/.test(name)); if (!fnames) fnames = Object.getOwnPropertyNames(BASICRuntime.prototype).filter((name) => /^[A-Z]{3,}[$]?$/.test(name));
var dict = {}; var dict = {};
for (var fn of fnames) if (this.supportsFunction(fn)) dict[fn] = this[fn].bind(this); for (var fn of fnames) if (this.supportsFunction(fn)) dict[fn] = this[fn].bind(this);
return dict; return dict;

View File

@ -263,6 +263,7 @@ export var OPS_6502 = [
export function disassemble6502(pc:number, b0:number, b1:number, b2:number) : {line:string, nbytes:number, isaddr:boolean} { export function disassemble6502(pc:number, b0:number, b1:number, b2:number) : {line:string, nbytes:number, isaddr:boolean} {
var op = OPS_6502[b0]; var op = OPS_6502[b0];
if (op == null) return {line:"???", nbytes:1, isaddr:false};
var s = op.mn; var s = op.mn;
var am = op.am; var am = op.am;
var isaddr = false; var isaddr = false;

View File

@ -2,10 +2,11 @@
import { hex, clamp, lpad } from "./util"; import { hex, clamp, lpad } from "./util";
import { SourceLocation } from "./workertypes"; import { SourceLocation } from "./workertypes";
import Mousetrap = require('mousetrap');
import { VirtualList } from "./vlist"
// external modules // external modules
declare var jt, Javatari; declare var jt, Javatari;
declare var Mousetrap;
// Emulator classes // Emulator classes
@ -721,8 +722,6 @@ export function getVisibleEditorLineHeight() : number{
return $("#booksMenuButton").first().height(); return $("#booksMenuButton").first().height();
} }
declare var VirtualList;
export interface VirtualTextLine { export interface VirtualTextLine {
text : string; text : string;
clas? : string; clas? : string;
@ -780,3 +779,4 @@ export class VirtualTextScroller {
} }
} }
} }

View File

@ -1,5 +1,6 @@
import binaryen = require('binaryen'); import * as binaryen from 'binaryen';
//import binaryen = require("binaryen");
import { hasDataType, HDLBinop, HDLBlock, HDLConstant, HDLDataType, HDLDataTypeObject, HDLExpr, HDLExtendop, HDLFuncCall, HDLModuleDef, HDLModuleRunner, HDLSourceLocation, HDLSourceObject, HDLTriop, HDLUnop, HDLValue, HDLVariableDef, HDLVarRef, HDLWhileOp, isArrayItem, isArrayType, isBigConstExpr, isBinop, isBlock, isConstExpr, isFuncCall, isLogicType, isTriop, isUnop, isVarDecl, isVarRef, isWhileop } from "./hdltypes"; import { hasDataType, HDLBinop, HDLBlock, HDLConstant, HDLDataType, HDLDataTypeObject, HDLExpr, HDLExtendop, HDLFuncCall, HDLModuleDef, HDLModuleRunner, HDLSourceLocation, HDLSourceObject, HDLTriop, HDLUnop, HDLValue, HDLVariableDef, HDLVarRef, HDLWhileOp, isArrayItem, isArrayType, isBigConstExpr, isBinop, isBlock, isConstExpr, isFuncCall, isLogicType, isTriop, isUnop, isVarDecl, isVarRef, isWhileop } from "./hdltypes";
import { HDLError } from "./hdlruntime"; import { HDLError } from "./hdlruntime";

View File

@ -506,3 +506,13 @@ export function byteToASCII(b: number) : string {
return String.fromCharCode(b); return String.fromCharCode(b);
} }
export function loadScript(scriptfn:string) : Promise<Event> {
return new Promise( (resolve, reject) => {
var script = document.createElement('script');
script.onload = resolve;
script.onerror = reject;
script.src = scriptfn;
document.getElementsByTagName('head')[0].appendChild(script);
});
}

View File

@ -29,7 +29,7 @@
* @param {object} config * @param {object} config
* @constructor * @constructor
*/ */
function VirtualList(config) { export function VirtualList(config) {
var width = (config && config.w + 'px') || '100%'; var width = (config && config.w + 'px') || '100%';
var height = (config && config.h + 'px') || '100%'; var height = (config && config.h + 'px') || '100%';
var itemHeight = this.itemHeight = config.itemHeight; var itemHeight = this.itemHeight = config.itemHeight;

View File

@ -3,8 +3,9 @@ window['Javatari'].AUTO_START = false;
import { PLATFORMS } from "../common/emu"; import { PLATFORMS } from "../common/emu";
import { Platform } from "../common/baseplatform"; import { Platform } from "../common/baseplatform";
import { stringToByteArray, getWithBinary } from "../common/util"; import { stringToByteArray, getWithBinary, loadScript, getRootBasePlatform } from "../common/util";
import { StateRecorderImpl } from "../common/recorder"; import { StateRecorderImpl } from "../common/recorder";
import { importPlatform } from "../platform/_index";
export var platform_id : string; // platform ID string export var platform_id : string; // platform ID string
export var platform : Platform; // platform object export var platform : Platform; // platform object
@ -168,20 +169,7 @@ async function loadPlatform(qs) {
if (qs.data) qs = qs.data; if (qs.data) qs = qs.data;
platform_id = qs['p']; platform_id = qs['p'];
if (!platform_id) throw('No platform variable!'); if (!platform_id) throw('No platform variable!');
var platformfn = 'gen/platform/' + platform_id.split(/[.-]/)[0] + '.js'; // required file var module = await importPlatform(getRootBasePlatform(platform_id));
var machinefn = platformfn.replace('/platform/', '/machine/'); // optional file
try {
await loadScript(platformfn); // load platform file
} catch (e) {
console.log(e);
throw('Platform "' + platform_id + '" not supported.');
return;
}
try {
await loadScript(machinefn); // load machine file
} catch (e) {
console.log('skipped',machinefn); // optional file skipped
}
try { try {
console.log("starting platform", platform_id); // loaded required <platform_id>.js file console.log("starting platform", platform_id); // loaded required <platform_id>.js file
await startPlatform(qs); await startPlatform(qs);
@ -191,16 +179,6 @@ async function loadPlatform(qs) {
} }
} }
export function loadScript(scriptfn:string) : Promise<Event> {
return new Promise( (resolve, reject) => {
var script = document.createElement('script');
script.onload = resolve;
script.onerror = reject;
script.src = scriptfn;
document.getElementsByTagName('head')[0].appendChild(script);
});
}
// start // start
export function startEmbed() { export function startEmbed() {
installErrorHandler(); installErrorHandler();
@ -251,4 +229,12 @@ function receiveMessage(event) {
console.log("Unknown data.cmd: " + cmd); console.log("Unknown data.cmd: " + cmd);
} }
} }
} }
/////
// are we not in an iframe?
if(self === top) {
document.body.style.backgroundColor = '#555';
}
startEmbed();

View File

@ -3,7 +3,7 @@
import { hex, rgb2bgr, rle_unpack } from "../common/util"; import { hex, rgb2bgr, rle_unpack } from "../common/util";
import { ProjectWindows } from "./windows"; import { ProjectWindows } from "./windows";
import { Toolbar } from "../common/emu"; import { Toolbar } from "../common/emu";
declare var Mousetrap; import Mousetrap = require('mousetrap');
export type UintArray = number[] | Uint8Array | Uint16Array | Uint32Array; //{[i:number]:number}; export type UintArray = number[] | Uint8Array | Uint16Array | Uint32Array; //{[i:number]:number};

View File

@ -1,14 +0,0 @@
"use strict";
// TODO: don't need this file anymore?
declare var localforage;
export function createNewPersistentStore(storeid:string, callback?) {
var store = localforage.createInstance({
name: "__" + storeid,
version: 2.0
});
if (callback != null) { callback(store); } // for tests only
return store;
}

View File

@ -1,8 +1,6 @@
// 8bitworkshop IDE user interface // 8bitworkshop IDE user interface
import $ = require("jquery");
import * as bootstrap from "bootstrap";
import * as localforage from "localforage"; import * as localforage from "localforage";
import { CodeProject, LocalForageFilesystem, OverlayFilesystem, ProjectFilesystem, WebPresetsFileSystem } from "./project"; import { CodeProject, LocalForageFilesystem, OverlayFilesystem, ProjectFilesystem, WebPresetsFileSystem } from "./project";
import { WorkerResult, WorkerOutput, VerilogOutput, SourceFile, WorkerError, FileData } from "../common/workertypes"; import { WorkerResult, WorkerOutput, VerilogOutput, SourceFile, WorkerError, FileData } from "../common/workertypes";
@ -11,15 +9,18 @@ import { Platform, Preset, DebugSymbols, DebugEvalCondition, isDebuggable, EmuSt
import { PLATFORMS, EmuHalt, Toolbar } from "../common/emu"; import { PLATFORMS, EmuHalt, Toolbar } from "../common/emu";
import * as Views from "./views"; import * as Views from "./views";
import { getFilenameForPath, getFilenamePrefix, highlightDifferences, invertMap, byteArrayToString, compressLZG, stringToByteArray, import { getFilenameForPath, getFilenamePrefix, highlightDifferences, invertMap, byteArrayToString, compressLZG, stringToByteArray,
byteArrayToUTF8, isProbablyBinary, getWithBinary, getBasePlatform, getRootBasePlatform, hex } from "../common/util"; byteArrayToUTF8, isProbablyBinary, getWithBinary, getBasePlatform, getRootBasePlatform, hex, loadScript } from "../common/util";
import { StateRecorderImpl } from "../common/recorder"; import { StateRecorderImpl } from "../common/recorder";
import { GHSession, GithubService, getRepos, parseGithubURL, FirebaseProjectFilesystem } from "./services"; import { GHSession, GithubService, getRepos, parseGithubURL, FirebaseProjectFilesystem } from "./services";
import Split = require('split.js');
import { importPlatform } from "../platform/_index";
// external libs (TODO) // external libs (TODO)
declare var Tour, GIF, saveAs, JSZip, Mousetrap, Split, firebase; declare var Tour, GIF, saveAs, JSZip, firebase;
declare var ga; declare var ga;
// in index.html // in index.html
declare var exports; declare var exports;
declare var $ : JQueryStatic; // use browser jquery
// make sure VCS doesn't start // make sure VCS doesn't start
if (window['Javatari']) window['Javatari'].AUTO_START = false; if (window['Javatari']) window['Javatari'].AUTO_START = false;
@ -121,16 +122,6 @@ function alertInfo(s:string) {
bootbox.alert(s); bootbox.alert(s);
} }
export function loadScript(scriptfn:string) : Promise<Event> {
return new Promise( (resolve, reject) => {
var script = document.createElement('script');
script.onload = resolve;
script.onerror = reject;
script.src = scriptfn;
document.getElementsByTagName('head')[0].appendChild(script);
});
}
function newWorker() : Worker { function newWorker() : Worker {
return new Worker("./gen/worker/bundle.js"); return new Worker("./gen/worker/bundle.js");
} }
@ -542,9 +533,6 @@ async function getLocalFilesystem(repoid: string) : Promise<ProjectFilesystem> {
bootbox.alert(`Could not get permission to access filesystem.`); bootbox.alert(`Could not get permission to access filesystem.`);
return; return;
} }
for await (const entry of dirHandle.values()) {
console.log(entry.kind, entry.name);
}
return { return {
getFileData: async (path) => { getFileData: async (path) => {
console.log('getFileData', path); console.log('getFileData', path);
@ -2190,6 +2178,7 @@ async function startPlatform() {
await loadBIOSFromProject(); await loadBIOSFromProject();
await initProject(); await initProject();
await loadProject(qs['file']); await loadProject(qs['file']);
platform.sourceFileFetch = (path) => current_project.filedata[path];
setupDebugControls(); setupDebugControls();
addPageFocusHandlers(); addPageFocusHandlers();
showInstructions(); showInstructions();
@ -2366,20 +2355,7 @@ export async function startUI() {
} }
async function loadAndStartPlatform() { async function loadAndStartPlatform() {
var platformfn = 'gen/platform/' + platform_id.split(/[.-]/)[0] + '.js'; // required file var module = await importPlatform(getRootBasePlatform(platform_id));
var machinefn = platformfn.replace('/platform/', '/machine/'); // optional file
try {
await loadScript(platformfn); // load platform file
} catch (e) {
console.log(e);
alertError('Platform "' + platform_id + '" not supported.');
return;
}
try {
await loadScript(machinefn); // load machine file
} catch (e) {
console.log('skipped',machinefn); // optional file skipped
}
try { try {
console.log("starting platform", platform_id); // loaded required <platform_id>.js file console.log("starting platform", platform_id); // loaded required <platform_id>.js file
try { try {
@ -2487,3 +2463,8 @@ export function highlightSearch(query: string) { // TODO: filename?
} }
} }
} }
/// start UI if in browser (not node)
if (typeof process === 'undefined') {
startUI();
}

View File

@ -8,8 +8,8 @@ import { platform, platform_id, compparams, current_project, lastDebugState, pro
import { ProbeRecorder, ProbeFlags } from "../common/recorder"; import { ProbeRecorder, ProbeFlags } from "../common/recorder";
import { getMousePos, dumpRAM, getVisibleEditorLineHeight, VirtualTextScroller, VirtualTextLine } from "../common/emu"; import { getMousePos, dumpRAM, getVisibleEditorLineHeight, VirtualTextScroller, VirtualTextLine } from "../common/emu";
import * as pixed from "./pixeleditor"; import * as pixed from "./pixeleditor";
import Mousetrap = require('mousetrap');
declare var Mousetrap; import { VirtualList } from "../common/vlist";
export interface ProjectView { export interface ProjectView {
createDiv(parent:HTMLElement) : HTMLElement; createDiv(parent:HTMLElement) : HTMLElement;
@ -34,7 +34,6 @@ export interface ProjectView {
export var isMobileDevice = window.matchMedia && window.matchMedia("only screen and (max-width: 760px)").matches; export var isMobileDevice = window.matchMedia && window.matchMedia("only screen and (max-width: 760px)").matches;
declare var CodeMirror; declare var CodeMirror;
declare var VirtualList;
// helper function for editor // helper function for editor
function jumpToLine(ed, i:number) { function jumpToLine(ed, i:number) {
@ -2116,9 +2115,9 @@ export class AssetEditorView implements ProjectView, pixed.EditorContext {
setVisible?(showing : boolean) : void { setVisible?(showing : boolean) : void {
// TODO: make into toolbar? // TODO: make into toolbar?
if (showing) { if (showing) {
Mousetrap.bind('ctrl+z', projectWindows.undoStep.bind(projectWindows)); if (Mousetrap.bind) Mousetrap.bind('ctrl+z', projectWindows.undoStep.bind(projectWindows));
} else { } else {
Mousetrap.unbind('ctrl+z'); if (Mousetrap.unbind) Mousetrap.unbind('ctrl+z');
} }
} }

View File

@ -1,7 +1,6 @@
import { Toolbar } from "../common/emu"; import { Toolbar } from "../common/emu";
import { VirtualList } from "../common/vlist";
declare var VirtualList;
const BUILTIN_INPUT_PORTS = [ const BUILTIN_INPUT_PORTS = [
'clk', 'reset', 'clk', 'reset',

36
src/platform/_index.ts Normal file
View File

@ -0,0 +1,36 @@
// hard-code platform files for esbuild code-splitting
export function importPlatform(name: string) : Promise<any> {
switch (name) {
case "apple2": return import("../platform/apple2");
case "arm32": return import("../platform/arm32");
case "astrocade": return import("../platform/astrocade");
case "atari7800": return import("../platform/atari7800");
case "atari8": return import("../platform/atari8");
case "basic": return import("../platform/basic");
case "c64": return import("../platform/c64");
case "coleco": return import("../platform/coleco");
case "devel": return import("../platform/devel");
case "galaxian": return import("../platform/galaxian");
case "kim1": return import("../platform/kim1");
case "markdown": return import("../platform/markdown");
case "msx": return import("../platform/msx");
case "mw8080bw": return import("../platform/mw8080bw");
case "nes": return import("../platform/nes");
case "sms": return import("../platform/sms");
case "sound_konami": return import("../platform/sound_konami");
case "sound_williams": return import("../platform/sound_williams");
case "vcs": return import("../platform/vcs");
case "vector": return import("../platform/vector");
case "vectrex": return import("../platform/vectrex");
case "verilog": return import("../platform/verilog");
case "vicdual": return import("../platform/vicdual");
case "williams": return import("../platform/williams");
case "x86": return import("../platform/x86");
case "zmachine": return import("../platform/zmachine");
case "zx": return import("../platform/zx");
default: throw new Error(`Platform not recognized: '${name}'`)
}
}

View File

@ -1,8 +1,7 @@
import { BaseDebugPlatform, CpuState, EmuState, Platform, DisasmLine, Debuggable, Machine, BaseMachinePlatform } from "../common/baseplatform"; import { BaseDebugPlatform, CpuState, EmuState, Platform, DisasmLine, Debuggable, Machine, BaseMachinePlatform } from "../common/baseplatform";
import { AnimationTimer, EmuHalt, padBytes, PLATFORMS, RasterVideo } from "../common/emu"; import { AnimationTimer, EmuHalt, padBytes, PLATFORMS, RasterVideo } from "../common/emu";
import { loadScript } from "../ide/ui"; import { hex, lpad, loadScript } from "../common/util";
import { hex, lpad } from "../common/util";
import { ARM32CPU } from "../common/cpu/ARM"; import { ARM32CPU } from "../common/cpu/ARM";
import { ARM32Machine } from "../machine/arm32"; import { ARM32Machine } from "../machine/arm32";
@ -25,203 +24,6 @@ interface ARM32State extends EmuState {
r: Uint32Array; // registers r: Uint32Array; // registers
} }
class ARM32UnicornPlatform extends BaseDebugPlatform implements Platform, Debuggable {
u : any; // Unicorn
d : any; // Capstone
mainElement : HTMLElement;
video : RasterVideo;
timer : AnimationTimer;
romSize = 0;
halted = false;
state : ARM32State;
cpu : ARM32CPU;
constructor(mainElement: HTMLElement) {
super();
this.mainElement = mainElement;
}
getPresets() { return ARM32_PRESETS };
async start() {
console.log("Loading Unicorn/Capstone");
await loadScript('./lib/unicorn-arm.min.js');
await loadScript('./lib/capstone-arm.min.js');
this.cpu = new ARM32CPU();
this.u = new uc.Unicorn(uc.ARCH_ARM, uc.MODE_ARM);
this.u.mem_map(ROM_START_ADDR, ROM_SIZE, uc.PROT_READ | uc.PROT_EXEC);
this.u.mem_map(HIROM_START_ADDR, ROM_SIZE, uc.PROT_READ | uc.PROT_EXEC);
this.u.mem_map(RAM_START_ADDR, RAM_SIZE, uc.PROT_READ | uc.PROT_WRITE | uc.PROT_EXEC);
this.d = new cs.Capstone(cs.ARCH_ARM, cs.MODE_ARM);
this.video = new RasterVideo(this.mainElement, SCREEN_WIDTH, SCREEN_HEIGHT);
this.video.create();
this.timer = new AnimationTimer(60, this.nextFrame.bind(this));
}
reset() {
this.cpu.reset();
this.u.reg_write_i32(uc.ARM_REG_PC, 0);
var cpsr = this.u.reg_read_i32(uc.ARM_REG_CPSR);
this.u.reg_write_i32(uc.ARM_REG_CPSR, (cpsr & 0xffffff00) | 0b11010011);
this.u.mem_write(RAM_START_ADDR, new Uint8Array(RAM_SIZE)); // clear RAM
this.halted = false;
this.state = null;
}
pause(): void {
this.timer.stop();
}
resume(): void {
this.timer.start();
console.log('resume')
}
isRunning() {
return this.timer.isRunning();
}
isBlocked() {
return this.halted;
}
checkPCOverflow(pc) {
}
disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {
try {
var b = this.u.mem_read(pc, 4);
var insns = this.d.disasm(b, pc, 4);
var i0 = insns[0];
return {
nbytes: i0.size,
line: i0.mnemonic + " " + i0.op_str,
isaddr: i0.address > 0
};
} catch (e) {
return {
nbytes: 4,
line: "???",
isaddr: false
};
}
}
advance(novideo?: boolean): number {
this.state = null;
var pc = this.getPC();
var endpc = this.romSize;
if (pc >= endpc) {
this.halted = true;
this.haltAndCatchFire("ROM overrun at PC 0x" + hex(pc));
this.pause();
return 1;
}
var debugCond = this.getDebugCallback();
try {
if (debugCond != null) {
for (var i=0; i<CLOCKS_PER_FRAME && pc <= endpc; i++) {
if (debugCond()) {
break;
}
this.u.emu_start(pc, endpc, 0, 1);
pc = this.getPC();
}
} else {
this.u.emu_start(pc, endpc, 0, CLOCKS_PER_FRAME); // TODO
}
} catch (e) {
throw new EmuHalt(e + " at PC=0x" + hex(this.getPC()));
}
if (!novideo) {
this.updateVideo();
}
return CLOCKS_PER_FRAME; //throw new Error("Method not implemented.");
}
updateVideo() {
var vmem8 : Uint8Array = this.u.mem_read(RAM_START_ADDR, SCREEN_WIDTH * SCREEN_HEIGHT * 4);
var vmem32 = new Uint32Array(vmem8.buffer);
var pixels = this.video.getFrameData();
for (var i=0; i<vmem32.length; i++)
pixels[i] = vmem32[i] | 0xff000000;
this.video.updateFrame();
}
getToolForFilename() {
return "vasmarm";
}
getDefaultExtension() {
return ".asm";
}
loadROM(title, data: Uint8Array) {
this.romSize = data.length;
data = padBytes(data, ROM_SIZE);
this.u.mem_write(ROM_START_ADDR, data);
this.u.mem_write(HIROM_START_ADDR, data);
this.state = null;
this.reset();
}
readAddress(addr: number) {
// TODO: slow
try {
return this.u.mem_read(addr, 1)[0];
} catch (e) {
return 0;
}
}
getCPUState(): CpuState {
return {
PC: this.getPC(),
SP: this.getSP(),
};
}
isStable(): boolean {
return true;
}
getPC() {
return this.u.reg_read_i32(uc.ARM_REG_PC);
}
getSP() {
return this.u.reg_read_i32(uc.ARM_REG_SP);
}
loadState(state: ARM32State): void {
for (var i=0; i<uc.ARM_REG_ENDING; i++) {
this.u.reg_write_i32(i, state.r[i]);
}
this.u.mem_write(RAM_START_ADDR, state.b);
}
saveState(): ARM32State {
var regs = new Uint32Array(uc.ARM_REG_ENDING);
for (var i=0; i<uc.ARM_REG_ENDING; i++) {
regs[i] = this.u.reg_read_i32(i);
}
this.state = {
c: this.getCPUState(),
b: this.u.mem_read(RAM_START_ADDR, RAM_SIZE),
r: regs
};
return this.state;
}
showHelp(tool: string) {
if (tool == 'vasmarm') {
window.open('http://sun.hasenbraten.de/vasm/release/vasm.html');
}
}
getDebugCategories() {
return ["CPU"];
}
getDebugInfo?(category:string, state:ARM32State) : string {
var s = '';
for (var i=0; i<13; i++) {
s += lpad('r'+i, 3) + ' ' + hex(state.r[i+uc.ARM_REG_R0],8) + '\n';
}
s += ' SP ' + hex(state.r[uc.ARM_REG_SP],8) + '\n';
s += ' LR ' + hex(state.r[uc.ARM_REG_LR],8) + '\n';
s += ' PC ' + hex(state.r[uc.ARM_REG_PC],8) + '\n';
s += 'CPSR ' + hex(state.r[uc.ARM_REG_CPSR],8) + '\n';
return s;
}
}
////
export abstract class BaseARMMachinePlatform<T extends Machine> extends BaseMachinePlatform<T> { export abstract class BaseARMMachinePlatform<T extends Machine> extends BaseMachinePlatform<T> {
//getOpcodeMetadata = getOpcodeMetadata_z80; //getOpcodeMetadata = getOpcodeMetadata_z80;
@ -282,5 +84,4 @@ class ARM32Platform extends BaseARMMachinePlatform<ARM32Machine> implements Plat
//// ////
PLATFORMS['arm32.u'] = ARM32UnicornPlatform;
PLATFORMS['arm32'] = ARM32Platform; PLATFORMS['arm32'] = ARM32Platform;

View File

@ -1,7 +1,6 @@
import { Platform, BreakpointCallback, DebugCondition, DebugEvalCondition } from "../common/baseplatform"; import { Platform, BreakpointCallback, DebugCondition, DebugEvalCondition } from "../common/baseplatform";
import { PLATFORMS, AnimationTimer, EmuHalt } from "../common/emu"; import { PLATFORMS, AnimationTimer, EmuHalt } from "../common/emu";
import { loadScript } from "../ide/ui";
import * as views from "../ide/views"; import * as views from "../ide/views";
import { BASICRuntime } from "../common/basic/runtime"; import { BASICRuntime } from "../common/basic/runtime";
import { BASICProgram } from "../common/basic/compiler"; import { BASICProgram } from "../common/basic/compiler";
@ -43,8 +42,6 @@ class BASICPlatform implements Platform {
} }
async start() { async start() {
await loadScript('./gen/common/basic/runtime.js');
await loadScript('./gen/common/teletype.js');
// create runtime // create runtime
this.runtime = new BASICRuntime(); this.runtime = new BASICRuntime();
this.runtime.reset(); this.runtime.reset();

View File

@ -4,9 +4,9 @@ import { EmuHalt, PLATFORMS } from "../common/emu";
import { Devel6502 } from "../machine/devel"; import { Devel6502 } from "../machine/devel";
import { Base6502MachinePlatform } from "../common/baseplatform"; import { Base6502MachinePlatform } from "../common/baseplatform";
import { SerialIOInterface } from "../common/devices"; import { SerialIOInterface } from "../common/devices";
import { byteArrayToString, convertDataToUint8Array, hex } from "../common/util"; import { byteArrayToString, convertDataToUint8Array } from "../common/util";
import { TeleType } from "../common/teletype"; import { TeleType } from "../common/teletype";
import { haltEmulation, loadScript } from "../ide/ui"; import { haltEmulation } from "../ide/ui";
var DEVEL_6502_PRESETS = [ var DEVEL_6502_PRESETS = [
{id:'hello.dasm', name:'Hello World (ASM)'}, {id:'hello.dasm', name:'Hello World (ASM)'},
@ -126,7 +126,6 @@ class Devel6502Platform extends Base6502MachinePlatform<Devel6502> implements Pl
async start() { async start() {
super.start(); super.start();
await loadScript('./gen/common/teletype.js');
this.serial = new SerialTestHarness(); this.serial = new SerialTestHarness();
this.serial.viewer = this.serview; this.serial.viewer = this.serview;
this.serview.start(); this.serview.start();

View File

@ -6,9 +6,8 @@ import { CodeAnalyzer_nes } from "../common/analysis";
import { SampleAudio } from "../common/audio"; import { SampleAudio } from "../common/audio";
import { ProbeRecorder } from "../common/recorder"; import { ProbeRecorder } from "../common/recorder";
import { NullProbe, Probeable, ProbeAll } from "../common/devices"; import { NullProbe, Probeable, ProbeAll } from "../common/devices";
import Mousetrap = require('mousetrap');
declare var jsnes : any; import jsnes = require('../../jsnes');
declare var Mousetrap;
const JSNES_PRESETS = [ const JSNES_PRESETS = [
{id:'hello.c', name:'Hello World'}, {id:'hello.c', name:'Hello World'},
@ -100,7 +99,7 @@ class JSNESPlatform extends Base6502Platform implements Platform, Probeable {
this.ntvideo.create(); this.ntvideo.create();
$(this.ntvideo.canvas).hide(); $(this.ntvideo.canvas).hide();
this.ntlastbuf = new Uint32Array(0x1000); this.ntlastbuf = new Uint32Array(0x1000);
Mousetrap.bind('ctrl+shift+alt+n', () => { if (Mousetrap.bind) Mousetrap.bind('ctrl+shift+alt+n', () => {
$(this.video.canvas).toggle() $(this.video.canvas).toggle()
$(this.ntvideo.canvas).toggle() $(this.ntvideo.canvas).toggle()
}); });

View File

@ -464,5 +464,10 @@ class VCSMAMEPlatform extends BaseMAME6502Platform implements Platform {
//////////////// ////////////////
export const Platforms = {
'vcs': VCSPlatform,
'vcs.mame': VCSMAMEPlatform,
}
PLATFORMS['vcs'] = VCSPlatform; PLATFORMS['vcs'] = VCSPlatform;
PLATFORMS['vcs.mame'] = VCSMAMEPlatform; PLATFORMS['vcs.mame'] = VCSMAMEPlatform;

View File

@ -2,14 +2,12 @@
import { Platform, BasePlatform } from "../common/baseplatform"; import { Platform, BasePlatform } from "../common/baseplatform";
import { PLATFORMS, setKeyboardFromMap, AnimationTimer, RasterVideo, Keys, makeKeycodeMap, getMousePos, KeyFlags } from "../common/emu"; import { PLATFORMS, setKeyboardFromMap, AnimationTimer, RasterVideo, Keys, makeKeycodeMap, getMousePos, KeyFlags } from "../common/emu";
import { SampleAudio } from "../common/audio"; import { SampleAudio } from "../common/audio";
import { safe_extend } from "../common/util";
import { WaveformView, WaveformProvider, WaveformMeta } from "../ide/waveform"; import { WaveformView, WaveformProvider, WaveformMeta } from "../ide/waveform";
import { setFrameRateUI, loadScript, current_project } from "../ide/ui";
import { HDLModuleRunner, HDLModuleTrace, HDLUnit, isLogicType } from "../common/hdl/hdltypes"; import { HDLModuleRunner, HDLModuleTrace, HDLUnit, isLogicType } from "../common/hdl/hdltypes";
import { HDLModuleJS } from "../common/hdl/hdlruntime"; import { HDLModuleJS } from "../common/hdl/hdlruntime";
import { HDLModuleWASM } from "../common/hdl/hdlwasm"; import { HDLModuleWASM } from "../common/hdl/hdlwasm";
import Split = require("split.js");
declare var Split; import { FileData } from "../common/workertypes";
interface WaveformSignal extends WaveformMeta { interface WaveformSignal extends WaveformMeta {
name: string; name: string;
@ -169,6 +167,8 @@ var VerilogPlatform = function(mainElement, options) {
split; split;
hasvideo : boolean; hasvideo : boolean;
sourceFileFetch : (path:string) => FileData;
getPresets() { return VERILOG_PRESETS; } getPresets() { return VERILOG_PRESETS; }
setVideoParams(width:number, height:number, clock:number) { setVideoParams(width:number, height:number, clock:number) {
@ -179,10 +179,7 @@ var VerilogPlatform = function(mainElement, options) {
} }
async start() { async start() {
await loadScript('./gen/common/hdl/hdltypes.js'); //await loadScript('./lib/binaryen.js'); // TODO: remove
await loadScript('./gen/common/hdl/hdlruntime.js');
await loadScript('./gen/common/hdl/hdlwasm.js');
await loadScript('./lib/binaryen.js');
video = new RasterVideo(mainElement,videoWidth,videoHeight,{overscan:true}); video = new RasterVideo(mainElement,videoWidth,videoHeight,{overscan:true});
video.create(); video.create();
poller = setKeyboardFromMap(video, switches, VERILOG_KEYCODE_MAP, (o,key,code,flags) => { poller = setKeyboardFromMap(video, switches, VERILOG_KEYCODE_MAP, (o,key,code,flags) => {
@ -219,22 +216,6 @@ var VerilogPlatform = function(mainElement, options) {
}); });
// setup mouse events // setup mouse events
video.setupMouseEvents(); video.setupMouseEvents();
// setup mouse click
video.vcanvas.click( (e) => {
if (!top) return; // must have created emulator
if (!e.ctrlKey) {
//setFrameRateUI(60);
return; // ctrl key must be down
}
setFrameRateUI(1.0/2048);
var pos = getMousePos(video.canvas, e);
var new_y = Math.floor(pos.y);
var clock = 0;
while (framey != new_y || clock++ > 200000) {
this.setGenInputs();
this.updateVideoFrameCycles(1, true, false);
}
});
} }
// TODO: pollControls() { poller.poll(); } // TODO: pollControls() { poller.poll(); }
@ -585,7 +566,7 @@ var VerilogPlatform = function(mainElement, options) {
var useWASM = true; var useWASM = true;
var topcons = useWASM ? HDLModuleWASM : HDLModuleJS; var topcons = useWASM ? HDLModuleWASM : HDLModuleJS;
var _top = new topcons(topmod, unit.modules['@CONST-POOL@']); var _top = new topcons(topmod, unit.modules['@CONST-POOL@']);
_top.getFileData = (path) => current_project.filedata[path]; // external file provider _top.getFileData = this.sourceFileFetch;
await _top.init(); await _top.init();
this.dispose(); this.dispose();
top = _top; top = _top;
@ -617,13 +598,9 @@ var VerilogPlatform = function(mainElement, options) {
if (this.hasvideo) { if (this.hasvideo) {
const IGNORE_SIGNALS = ['clk','reset']; const IGNORE_SIGNALS = ['clk','reset'];
trace_signals = trace_signals.filter((v) => { return IGNORE_SIGNALS.indexOf(v.name)<0; }); // remove clk, reset trace_signals = trace_signals.filter((v) => { return IGNORE_SIGNALS.indexOf(v.name)<0; }); // remove clk, reset
$("#speed_bar").show(); this.showVideoControls();
$("#run_bar").show();
$("#dbg_record").show();
} else { } else {
$("#speed_bar").hide(); this.hideVideoControls();
$("#run_bar").hide();
$("#dbg_record").hide();
} }
} }
} }
@ -649,6 +626,18 @@ var VerilogPlatform = function(mainElement, options) {
// assert reset pin, wait 100 cycles if using video // assert reset pin, wait 100 cycles if using video
this.reset(); this.reset();
} }
showVideoControls() {
$("#speed_bar").show();
$("#run_bar").show();
$("#dbg_record").show();
}
hideVideoControls() {
$("#speed_bar").hide();
$("#run_bar").hide();
$("#dbg_record").hide();
}
restartAudio() { restartAudio() {
// stop/start audio // stop/start audio

View File

@ -1,7 +1,7 @@
import { Platform } from "../common/baseplatform"; import { Platform } from "../common/baseplatform";
import { PLATFORMS, RasterVideo } from "../common/emu"; import { PLATFORMS, RasterVideo } from "../common/emu";
import { loadScript } from "../ide/ui"; import { loadScript } from "../common/util";
// PC emulator: https://github.com/copy/v86 // PC emulator: https://github.com/copy/v86

View File

@ -1,9 +1,9 @@
import { Platform, BasePlatform, BaseDebugPlatform, Preset, EmuState, inspectSymbol } from "../common/baseplatform"; import { Platform, BasePlatform, BaseDebugPlatform, Preset, EmuState, inspectSymbol } from "../common/baseplatform";
import { PLATFORMS, EmuHalt } from "../common/emu"; import { EmuHalt, PLATFORMS } from "../common/emu";
import { loadScript } from "../ide/ui";
import { TeleType, TeleTypeWithKeyboard } from "../common/teletype"; import { TeleType, TeleTypeWithKeyboard } from "../common/teletype";
import { InputResponse } from "../common/basic/runtime"; import { InputResponse } from "../common/basic/runtime";
import { loadScript } from "../common/util";
const ZMACHINE_PRESETS = [ const ZMACHINE_PRESETS = [
{ id: 'hello.inf', name: 'Hello World' }, { id: 'hello.inf', name: 'Hello World' },
@ -627,8 +627,6 @@ class ZmachinePlatform implements Platform {
async start() { async start() {
await loadScript('./lib/zvm/ifvms.min.js'); await loadScript('./lib/zvm/ifvms.min.js');
await loadScript('./gen/common/teletype.js');
// create divs // create divs
var parent = this.mainElement; var parent = this.mainElement;
var gameport = $('<div id="gameport"/>').appendTo(parent); var gameport = $('<div id="gameport"/>').appendTo(parent);

View File

@ -2725,6 +2725,7 @@ function compileInform6(step:BuildStep) {
lstout += "\n"; lstout += "\n";
} }
} }
// TODO: step.path must end in '.inf' or error
var args = [ '-afjnops', '-v5', '-Cu', '-E1', '-k', '+/share/lib', step.path ]; var args = [ '-afjnops', '-v5', '-Cu', '-E1', '-k', '+/share/lib', step.path ];
var inform : EmscriptenModule = emglobal.inform({ var inform : EmscriptenModule = emglobal.inform({
instantiateWasm: moduleInstFn('inform'), instantiateWasm: moduleInstFn('inform'),

View File

@ -15,6 +15,7 @@ global.location = {href:'.'};
global.path = require('path'); global.path = require('path');
global.btoa = require('btoa'); global.btoa = require('btoa');
global.atob = require('atob'); global.atob = require('atob');
global.navigator = global; // for mousetrap :P
global.includeInThisContext = function(path) { global.includeInThisContext = function(path) {
var code = fs.readFileSync(path); var code = fs.readFileSync(path);

View File

@ -9,12 +9,16 @@ function testCompile(browser, platform_id, platform_name) {
.waitForElementVisible('#booksMenuButton') .waitForElementVisible('#booksMenuButton')
.waitForElementVisible('#preset_select') .waitForElementVisible('#preset_select')
.assert.containsText('#platformsMenuButton', platform_name) .assert.containsText('#platformsMenuButton', platform_name)
.waitForElementNotVisible('#compile_spinner') .waitForElementNotVisible('#compile_spinner', time=10000)
.waitForElementNotVisible('#error_alert') .waitForElementNotVisible('#error_alert')
.waitForElementNotPresent('.bootbox-alert'); .waitForElementNotPresent('.bootbox-alert');
if (platform_id == 'vcs') { if (platform_id == 'vcs') {
browser.waitForElementVisible('#javatari-screen'); browser.waitForElementVisible('#javatari-screen');
} else if (platform_id == 'verilog') {
browser.waitForElementVisible('#emuoverlay');
} else if (platform_id == 'basic' || platform_id == 'zmachine') {
browser.waitForElementVisible('.transcript-line');
} else { } else {
browser.waitForElementVisible('#emuscreen'); browser.waitForElementVisible('#emuscreen');
browser.waitForElementVisible('.emuvideo'); browser.waitForElementVisible('.emuvideo');
@ -22,7 +26,10 @@ function testCompile(browser, platform_id, platform_name) {
} }
} }
function testDebugging(browser) { function testDebugging(browser, platform_id) {
if (platform_id == 'verilog') return;
if (platform_id == 'basic') return;
if (platform_id == 'zmachine') return;
// do some debugging // do some debugging
browser browser
.waitForElementVisible('#dbg_go.btn_active') .waitForElementVisible('#dbg_go.btn_active')
@ -52,40 +59,54 @@ function testTourDialog(browser) {
.click('button[data-role="end"]'); .click('button[data-role="end"]');
} }
function testPlatform(exports, platform_id, platform_name, numPresets) { function testInitialLoad(exports, platform_id) {
exports['load_'+platform_id] = function(browser) { exports['load '+platform_id+' none'] = function(browser) {
browser.url(IDEURL + '?platform='+platform_id+"&file=NOEXIST"); var ext = "";
browser.waitForElementVisible('.bootbox-alert'); // test unknown file alert (TODO: check text) if (platform_id == 'zmachine') ext = '.inf';
browser.waitForElementNotVisible('#error_alert'); // but it will build anyway browser.url(IDEURL + '?platform='+platform_id+"&file=NOEXIST" + ext);
testTourDialog(browser); browser.waitForElementVisible('.bootbox-alert'); // test unknown file alert (TODO: check text)
browser.waitForElementNotVisible('#error_alert'); // but it will build anyway
testTourDialog(browser);
} }
}
function testPlatform(exports, platform_id, platform_name, numPresets) {
testInitialLoad(exports, platform_id);
for (let i=1; i<=numPresets; i++) { for (let i=1; i<=numPresets; i++) {
exports['load_'+platform_id+'_'+i] = function(browser) { exports['load '+platform_id+' '+i] = function(browser) {
browser.click('#preset_select option:nth-child('+(i+1)+')'); browser.click('#preset_select option:nth-child('+(i+1)+')');
testCompile(browser, platform_id, platform_name); testCompile(browser, platform_id, platform_name);
browser.getTitle( (title) => { console.log(title); } ); browser.getTitle( (title) => { console.log(title); } );
testDebugging(browser); testDebugging(browser, platform_id);
} }
} }
exports['end_'+platform_id] = function(browser) { exports['end '+platform_id] = function(browser) {
browser.end(); browser.end();
} }
exports['@tags'].push(platform_id);
} }
/// ///
testPlatform(this, 'vcs', 'Atari 2600', 35); var ex = module.exports;
testPlatform(this, 'nes', 'NES', 30); ex['@tags'] = []
testPlatform(this, 'vicdual', 'VIC Dual', 7); testPlatform(ex, 'vcs', 'Atari 2600', 35);
testPlatform(this, 'mw8080bw', 'Midway 8080', 3); testPlatform(ex, 'nes', 'NES', 30);
testPlatform(this, 'galaxian-scramble', 'Galaxian/Scramble', 3); testPlatform(ex, 'vicdual', 'VIC Dual', 7);
testPlatform(this, 'vector-z80color', 'Atari Color Vector (Z80)', 3); testPlatform(ex, 'mw8080bw', 'Midway 8080', 3);
testPlatform(this, 'williams-z80', 'Williams (Z80)', 3); testPlatform(ex, 'galaxian-scramble', 'Galaxian/Scramble', 3);
// TODO testPlatform(this, 'sound_williams-z80', 'Williams Sound (Z80)', 1); testPlatform(ex, 'vector-z80color', 'Atari Color Vector (Z80)', 3);
testPlatform(this, 'coleco', 'ColecoVision', 12); testPlatform(ex, 'williams-z80', 'Williams (Z80)', 3);
//testPlatform(this, 'sms-sg1000-libcv', 'Sega SG-1000', 3); // TODO testPlatform(ex, 'sound_williams-z80', 'Williams Sound (Z80)', 1);
testPlatform(this, 'sms-sms-libcv', 'Sega Master System', 2); testPlatform(ex, 'coleco', 'ColecoVision', 12);
testPlatform(this, 'atari7800', 'Atari 7800', 1); //testPlatform(ex, 'sms-sg1000-libcv', 'Sega SG-1000', 3);
testPlatform(this, 'astrocade', 'Bally Astrocade', 12); testPlatform(ex, 'sms-sms-libcv', 'Sega Master System', 2);
testPlatform(this, 'apple2', 'Apple ][+', 10); testPlatform(ex, 'atari7800', 'Atari 7800', 1);
testPlatform(ex, 'astrocade', 'Bally Astrocade', 12);
testPlatform(ex, 'verilog', 'Verilog', 33);
testPlatform(ex, 'apple2', 'Apple ][+', 10);
testPlatform(ex, 'basic', 'BASIC', 10);
testPlatform(ex, 'zmachine', 'Z-Machine', 19);
//testPlatform(ex, 'atari8-800xl.mame', 'Atari 800XL', 9);
testPlatform(ex, 'msx', 'MSX', 5);
testPlatform(ex, 'zx', 'ZX', 3);

View File

@ -12,6 +12,7 @@
"es2017", "es2017",
"dom" "dom"
], ],
"esModuleInterop": true,
"noImplicitThis": false, "noImplicitThis": false,
"noImplicitAny": false, "noImplicitAny": false,
"preserveConstEnums": true, "preserveConstEnums": true,