removed electron, upgrade npm pkgs
This commit is contained in:
parent
73389b1d1d
commit
3244c17ce1
11
Makefile
11
Makefile
|
@ -8,7 +8,6 @@ buildtsc:
|
||||||
npm run esbuild
|
npm run esbuild
|
||||||
|
|
||||||
prepare: buildtsc
|
prepare: buildtsc
|
||||||
patch -i meta/electron.diff -o electron.html
|
|
||||||
cp node_modules/jquery/dist/jquery.min.js ./jquery/
|
cp node_modules/jquery/dist/jquery.min.js ./jquery/
|
||||||
cp -r node_modules/bootstrap/dist/* ./bootstrap/
|
cp -r node_modules/bootstrap/dist/* ./bootstrap/
|
||||||
cp node_modules/bootstrap-tourist/*.css node_modules/bootstrap-tourist/*.js ./lib/
|
cp node_modules/bootstrap-tourist/*.css node_modules/bootstrap-tourist/*.js ./lib/
|
||||||
|
@ -25,16 +24,6 @@ distro: buildtsc
|
||||||
cp -rp gen $(TMP)
|
cp -rp gen $(TMP)
|
||||||
rm -r $(TMP)/doc $(TMP)/scripts $(TMP)/test* $(TMP)/tools $(TMP)/.[a-z]* $(TMP)/ts*.json # $(TMP)/meta
|
rm -r $(TMP)/doc $(TMP)/scripts $(TMP)/test* $(TMP)/tools $(TMP)/.[a-z]* $(TMP)/ts*.json # $(TMP)/meta
|
||||||
rm -f $(TMP)/javatari && mkdir -p $(TMP)/javatari && cp -p javatari.js/release/javatari/* $(TMP)/javatari/
|
rm -f $(TMP)/javatari && mkdir -p $(TMP)/javatari && cp -p javatari.js/release/javatari/* $(TMP)/javatari/
|
||||||
tar cf - `cat electron.html | egrep "^<(script|link)" | egrep -o '"([^"]+).(js|css)"' | cut -d '"' -f2` | tar x -C $(TMP)
|
|
||||||
|
|
||||||
desktop: distro
|
|
||||||
pushd $(TMP) && npm i && popd $(TMP)
|
|
||||||
mkdir -p $(TMP)/resources
|
|
||||||
./node_modules/.bin/electron-builder -mlw --project $(TMP) # --prepackaged $(TMP)
|
|
||||||
mv $(TMP)/dist/*.* ./release/desktop/
|
|
||||||
|
|
||||||
meta/electron.diff: index.html electron.html
|
|
||||||
-diff -u index.html electron.html > $@
|
|
||||||
|
|
||||||
tsweb:
|
tsweb:
|
||||||
npm run esbuild-clean
|
npm run esbuild-clean
|
||||||
|
|
|
@ -1,139 +0,0 @@
|
||||||
"use strict";
|
|
||||||
|
|
||||||
// preload.js for Electron app
|
|
||||||
const { ipcRenderer } = require('electron');
|
|
||||||
const fs = require('fs');
|
|
||||||
const _path = require('path');
|
|
||||||
const chokidar = require('chokidar');
|
|
||||||
|
|
||||||
const homeDirectory = require('os').homedir();
|
|
||||||
const wsroot = process.env.HOME_8BITWORKSHOP || _path.join(homeDirectory, '8bitworkshop');
|
|
||||||
|
|
||||||
function getLocalDir() {
|
|
||||||
const _ui = window.ui_1 || window.ui || window; // TODO: module naming
|
|
||||||
var dir = _ui.repo_id || _ui.platform_id || 'default';
|
|
||||||
return _path.join(wsroot, dir);
|
|
||||||
}
|
|
||||||
function getLocalFilePath(path) {
|
|
||||||
return _path.join(getLocalDir(), path);
|
|
||||||
}
|
|
||||||
|
|
||||||
function isProbablyBinary(path, data) {
|
|
||||||
var score = 0;
|
|
||||||
// decode as UTF-8
|
|
||||||
for (var i = 0; i < (data?data.length:0);) {
|
|
||||||
let c = data[i++];
|
|
||||||
if ((c & 0x80) == 0) {
|
|
||||||
// more likely binary if we see a NUL or obscure control character
|
|
||||||
if (c < 9 || (c >= 14 && c < 26) || c == 0x7f) {
|
|
||||||
score++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// look for invalid unicode sequences
|
|
||||||
var nextra = 0;
|
|
||||||
if ((c & 0xe0) == 0xc0) nextra = 1;
|
|
||||||
else if ((c & 0xf0) == 0xe0) nextra = 2;
|
|
||||||
else if ((c & 0xf8) == 0xf0) nextra = 3;
|
|
||||||
else if (c < 0xa0) score++;
|
|
||||||
else if (c == 0xff) score++;
|
|
||||||
while (nextra--) {
|
|
||||||
if (i >= data.length || (data[i++] & 0xc0) != 0x80) {
|
|
||||||
score++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return score > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// this is before startUI is called
|
|
||||||
process.once('loaded', () => {
|
|
||||||
var watcher;
|
|
||||||
var allfiles = new Set();
|
|
||||||
// get workspace root dir
|
|
||||||
// from browser: read workspace files asynchronously
|
|
||||||
window.alternateLocalFilesystem = {
|
|
||||||
getFileData: (path) => {
|
|
||||||
let fullpath = getLocalFilePath(path);
|
|
||||||
allfiles.add(fullpath);
|
|
||||||
if (!fs.existsSync(fullpath)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return new Promise( (resolve, reject) => {
|
|
||||||
fs.readFile(fullpath, (err,buf) => {
|
|
||||||
if (err) {
|
|
||||||
resolve(err);
|
|
||||||
} else {
|
|
||||||
let isBinary = isProbablyBinary(path, buf);
|
|
||||||
let data = isBinary ? buf : buf.toString('utf-8');
|
|
||||||
console.log("getWorkspaceFile", path, isBinary, data.length);
|
|
||||||
resolve(data);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
setFileData: (path, data) => {
|
|
||||||
let fullpath = getLocalFilePath(path);
|
|
||||||
allfiles.add(fullpath);
|
|
||||||
let encoding = typeof data === 'string' ? 'utf8' : null;
|
|
||||||
console.log("setWorkspaceFile", fullpath, data.length);
|
|
||||||
return new Promise( (resolve, reject) => {
|
|
||||||
fs.mkdir(_path.dirname(fullpath), {recursive:true}, (err,dirpath) => {
|
|
||||||
fs.writeFile(fullpath, data, {encoding:encoding}, (err) => {
|
|
||||||
if (err) {
|
|
||||||
reject(err);
|
|
||||||
} else {
|
|
||||||
resolve();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// watch/unwatch files as browser loses/gains focus
|
|
||||||
window.addEventListener("blur", (e) => {
|
|
||||||
let localdir = getLocalDir();
|
|
||||||
if (!watcher && localdir) {
|
|
||||||
// watch files for changes
|
|
||||||
watcher = chokidar.watch(Array.from(allfiles), {
|
|
||||||
//awaitWriteFinish: {pollInterval:50,stabilityThreshold:300},
|
|
||||||
ignoreInitial: true
|
|
||||||
});
|
|
||||||
watcher.on('all', (event, path) => {
|
|
||||||
path = path.substring(localdir.length + 1); //strip off prefix
|
|
||||||
console.log('WATCH', event, path);
|
|
||||||
// we don't use awaitWriteFinish b/c we might close() the watcher
|
|
||||||
setTimeout(() => {
|
|
||||||
window.reloadWorkspaceFile(path);
|
|
||||||
}, 300);
|
|
||||||
});
|
|
||||||
console.log('watching', getLocalDir());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
window.addEventListener("focus", (e) => {
|
|
||||||
if (watcher) {
|
|
||||||
watcher.close();
|
|
||||||
watcher = null;
|
|
||||||
}
|
|
||||||
console.log('stopped watching');
|
|
||||||
});
|
|
||||||
|
|
||||||
// from electron.js: set workspace root directory
|
|
||||||
/*
|
|
||||||
TODO
|
|
||||||
ipcRenderer.on('setWorkspaceRoot', (event, data) => {
|
|
||||||
wsroot = data.root;
|
|
||||||
var binpath = _path.join(wsroot, 'bin');
|
|
||||||
if (!fs.existsSync(binpath)) fs.mkdirSync(binpath, {});
|
|
||||||
console.log('setWorkspaceRoot', wsroot);
|
|
||||||
});
|
|
||||||
// from electron.js: file changed
|
|
||||||
ipcRenderer.on('fileChanged', (event, data) => {
|
|
||||||
var path = data.path;
|
|
||||||
window.reloadWorkspaceFile(path);
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
console.log('loaded preload', window.alternateLocalFilesystem, window.startUI);
|
|
||||||
});
|
|
257
electron.diff
257
electron.diff
|
@ -1,257 +0,0 @@
|
||||||
--- index.html 2020-08-11 11:10:30.000000000 -0500
|
|
||||||
+++ electron.html 2020-08-11 14:45:27.000000000 -0500
|
|
||||||
@@ -3,16 +3,6 @@
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<title>8bitworkshop IDE</title>
|
|
||||||
-<link rel="manifest" href="manifest.json">
|
|
||||||
-<meta name="googlebot" content="nosnippet" />
|
|
||||||
-<meta name="mobile-web-app-capable" content="yes">
|
|
||||||
-<meta name="apple-mobile-web-app-capable" content="yes">
|
|
||||||
-<meta name="application-name" content="8bitworkshop">
|
|
||||||
-<meta name="apple-mobile-web-app-title" content="8bitworkshop">
|
|
||||||
-<meta name="theme-color" content="#ffffff">
|
|
||||||
-<meta name="msapplication-navbutton-color" content="#ffffff">
|
|
||||||
-<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
|
||||||
-<meta name="msapplication-starturl" content="/redir.html">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=yes">
|
|
||||||
<style type="text/css" media="screen">
|
|
||||||
body {
|
|
||||||
@@ -21,46 +11,6 @@
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<link rel="stylesheet" href="css/ui.css">
|
|
||||||
-
|
|
||||||
-<!-- google analytics -->
|
|
||||||
-<script>
|
|
||||||
-window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
|
|
||||||
-if (window.location.host.endsWith('8bitworkshop.com')) {
|
|
||||||
- ga('create', 'UA-54497476-9', 'auto');
|
|
||||||
- ga('set', 'anonymizeIp', true);
|
|
||||||
-}
|
|
||||||
-</script>
|
|
||||||
-<script async src='https://www.google-analytics.com/analytics.js'></script>
|
|
||||||
-
|
|
||||||
-<!-- firebase libs -->
|
|
||||||
-<script defer src="https://www.gstatic.com/firebasejs/5.11.1/firebase-app.js"></script>
|
|
||||||
-<script defer src="https://www.gstatic.com/firebasejs/5.11.1/firebase-auth.js"></script>
|
|
||||||
-<script defer src="config.js"></script>
|
|
||||||
-
|
|
||||||
-<!-- Sentry error reporting -->
|
|
||||||
-<script
|
|
||||||
- src="https://browser.sentry-cdn.com/6.4.1/bundle.min.js"
|
|
||||||
- integrity="sha384-THoc7rflwZFKTdZNgv6jLFFDn299Uv3t1SW5B4yGLvLiCRTYP9ys6vXZcMl95TQF"
|
|
||||||
- crossorigin="anonymous"></script>
|
|
||||||
-<script>
|
|
||||||
-if (window.location.host.endsWith('8bitworkshop.com')) {
|
|
||||||
- Sentry.init({
|
|
||||||
- dsn: 'https://bf329df3d1b34afa9f5b5e8ecd80ad11@o320878.ingest.sentry.io/1813925',
|
|
||||||
- beforeBreadcrumb(breadcrumb, hint) {
|
|
||||||
- if (breadcrumb.category === 'xhr' && typeof breadcrumb.data.url === 'string') {
|
|
||||||
- if (breadcrumb.data.url.startsWith('http')) return null; // discard external scripts
|
|
||||||
- }
|
|
||||||
- return breadcrumb;
|
|
||||||
- },
|
|
||||||
- beforeSend(event, hint) {
|
|
||||||
- const error = hint.originalException;
|
|
||||||
- if (error && error.hasOwnProperty('$loc')) return null; // ignore EmuHalt
|
|
||||||
- return event;
|
|
||||||
- },
|
|
||||||
- });
|
|
||||||
-}
|
|
||||||
-</script>
|
|
||||||
-
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
@@ -88,26 +38,6 @@
|
|
||||||
<hr>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_addfile_include">Add Include File...</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_addfile_link">Add Linked File...</a></li>
|
|
||||||
- <hr>
|
|
||||||
- <!--
|
|
||||||
- <li><a class="dropdown-item" href="#" id="item_switch_https" style="display:none">Switch to HTTPS...</a></li>
|
|
||||||
- -->
|
|
||||||
- <li><a class="dropdown-item" href="#" id="item_request_persist">Request Local Storage Permissions</a></li>
|
|
||||||
- </ul>
|
|
||||||
- </li>
|
|
||||||
- <li class="dropdown dropdown-submenu">
|
|
||||||
- <a tabindex="-1" href="#">Sync</a>
|
|
||||||
- <ul class="dropdown-menu">
|
|
||||||
- <li><a class="dropdown-item" href="#" id="item_github_login">Sign in to Github...</a></li>
|
|
||||||
- <li><a class="dropdown-item" href="#" id="item_github_logout">Log out</a></li>
|
|
||||||
- <hr>
|
|
||||||
- <li><a class="dropdown-item" href="#" id="item_github_import">Import Project from GitHub...</a></li>
|
|
||||||
- <li><a class="dropdown-item" href="#" id="item_github_pull">Pull Latest from Repository</a></li>
|
|
||||||
- <hr>
|
|
||||||
- <li><a class="dropdown-item" href="#" id="item_github_publish">Publish Project on GitHub...</a></li>
|
|
||||||
- <li><a class="dropdown-item" href="#" id="item_github_push">Push Changes to Repository...</a></li>
|
|
||||||
- <hr>
|
|
||||||
- <li><a class="dropdown-item" href="#" id="item_repo_delete">Delete Local Repository...</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
@@ -133,36 +63,6 @@
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_debug_expr">Break Expression...</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
- <li class="dropdown dropdown-submenu">
|
|
||||||
- <a tabindex="-1" href="#">Tools</a>
|
|
||||||
- <ul class="dropdown-menu">
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_tools" href="https://8bitworkshop.com/dithertron/">Dithertron Image Converter</a></li>
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_tools" href="https://8bitworkshop.com/bitmapfontgenerator/">Bitmap Font Generator</a></li>
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_tools" href="http://tomeko.net/online_tools/file_to_hex.php?lang=en">Binary File to Hex Converter</a></li>
|
|
||||||
- <li class="dropdown dropdown-submenu">
|
|
||||||
- <a tabindex="-1" href="#">Atari 2600</a>
|
|
||||||
- <ul class="dropdown-menu">
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_tools" href="https://alienbill.com/2600/playerpalnext.html">playerpal 2600</a></li>
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_tools" href="https://alienbill.com/2600/playfieldpal.html">playfieldpal 2600</a></li>
|
|
||||||
- </ul>
|
|
||||||
- </li>
|
|
||||||
- </ul>
|
|
||||||
- </li>
|
|
||||||
- <hr>
|
|
||||||
- <li class="dropdown dropdown-submenu">
|
|
||||||
- <a tabindex="-1" href="#">About</a>
|
|
||||||
- <ul class="dropdown-menu">
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_about" href="https://8bitworkshop.com/blog">Latest News</a></li>
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_about" href="https://8bitworkshop.com/projects">Projects</a></li>
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_about" href="https://twitter.com/8bitworkshop">Twitter</a></li>
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_about" href="https://github.com/sehugg/8bitworkshop">GitHub</a></li>
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_about" href="https://github.com/sehugg/8bitworkshop/issues/new">Report an Issue</a></li>
|
|
||||||
- <li><a class="dropdown-item" target="_8bws_about" href="https://8bitworkshop.com/blog/docs/ide.md.html">IDE Help</a></li>
|
|
||||||
- </ul>
|
|
||||||
- </li>
|
|
||||||
- <!--
|
|
||||||
- <hr><li><a class="dropdown-item" href="/redir.html">Use Latest Version</a></li>
|
|
||||||
- -->
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
@@ -258,39 +158,6 @@
|
|
||||||
<span class="label"><span id="settle_label"></span> evals/clk</span>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
- <!-- BOOKS menu -->
|
|
||||||
- <span class="dropdown pull-right">
|
|
||||||
- <a class="btn dropdown-toggle hidden-xs toolbarMenuButton" id="booksMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
||||||
- <span class="glyphicon glyphicon-book" aria-hidden="true"></span>
|
|
||||||
- Get Books <span class="caret"></span>
|
|
||||||
- </a>
|
|
||||||
- <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="booksMenuButton">
|
|
||||||
- <li>
|
|
||||||
- <a class="dropdown-item dropdown-link book-vcs" target="_book_a2600" href="https://www.amazon.com/gp/product/1541021304/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=pzp-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=B01N4DSRIZ&linkId=04d39e274c06e6c93b93d20a9a977111">
|
|
||||||
- <img src="images/book_a2600.png"/>
|
|
||||||
- <span class="book-title">Making Games For The Atari 2600</span>
|
|
||||||
- </a>
|
|
||||||
- </li>
|
|
||||||
- <li>
|
|
||||||
- <a class="dropdown-item dropdown-link book-arcade" target="_book_arcade" href="https://www.amazon.com/gp/product/1545484759/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1545484759&linkCode=as2&tag=pzp-20&linkId=b27709c022d2ebe639e90316d9f4fd5b">
|
|
||||||
- <img src="images/book_arcade.png"/>
|
|
||||||
- <span class="book-title">Making 8-bit Arcade Games in C</span>
|
|
||||||
- </a>
|
|
||||||
- </li>
|
|
||||||
- <li>
|
|
||||||
- <a class="dropdown-item dropdown-link book-verilog" target="_book_verilog" href="https://www.amazon.com/gp/product/1728619440/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1728619440&linkCode=as2&tag=pzp-20&linkId=7237a25861cb6b49a4128ba53d84c3e2">
|
|
||||||
- <img src="images/book_verilog.png"/>
|
|
||||||
- <span class="book-title">Designing Video Game Hardware in Verilog</span>
|
|
||||||
- </a>
|
|
||||||
- </li>
|
|
||||||
- <li>
|
|
||||||
- <a class="dropdown-item dropdown-link book-nes" target="_book_nes" href="https://www.amazon.com/gp/product/1075952727/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1075952727&linkCode=as2&tag=pzp-20&linkId=633176e8b36fea7f927020e2c322d80a">
|
|
||||||
- <img src="images/book_nes.png"/>
|
|
||||||
- <span class="book-title">Making Games For The NES</span>
|
|
||||||
- </a>
|
|
||||||
- </li>
|
|
||||||
- </ul>
|
|
||||||
- </span>
|
|
||||||
<!-- 8bitworkshop logo -->
|
|
||||||
<span class="logo-gradient hidden-xs hidden-sm hidden-md pull-right" style="margin-left:auto" onclick="window.open('/','_8bitws');">8bitworkshop</span>
|
|
||||||
|
|
||||||
@@ -477,73 +344,6 @@
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
-<div id="importGithubModal" class="modal fade">
|
|
||||||
- <div class="modal-dialog modal-md" role="document">
|
|
||||||
- <div class="modal-content">
|
|
||||||
- <div class="modal-header">
|
|
||||||
- <h3 class="modal-title">Import Project from GitHub</h3>
|
|
||||||
- </div>
|
|
||||||
- <div class="modal-body">
|
|
||||||
- <p>Enter the GitHub repository URL:</p>
|
|
||||||
- <p><input id="importGithubURL" size="60" placeholder="https://github.com/user/repo"></input></p>
|
|
||||||
- <p>If the project is compatible with 8bitworkshop, it should build automatically.</p>
|
|
||||||
- <p>Otherwise, some work may be required -- make sure you've selected the correct platform.</p>
|
|
||||||
- <p>Source files must be in the root folder of the repository.</p>
|
|
||||||
- <p><button type="button" class="btn btn-primary" id="importGithubButton">Import Project</button></p>
|
|
||||||
- </div>
|
|
||||||
- <div class="modal-footer">
|
|
||||||
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
|
||||||
- </div>
|
|
||||||
- </div>
|
|
||||||
- </div>
|
|
||||||
-</div>
|
|
||||||
-<div id="publishGithubModal" class="modal fade">
|
|
||||||
- <div class="modal-dialog modal-md" role="document">
|
|
||||||
- <div class="modal-content">
|
|
||||||
- <div class="modal-header">
|
|
||||||
- <h3 class="modal-title">Publish Project on GitHub</h3>
|
|
||||||
- </div>
|
|
||||||
- <div class="modal-body">
|
|
||||||
- <p>This will migrate your existing project to a new GitHub repository.</p>
|
|
||||||
- <p>https://github.com/username/ <input id="githubRepoName" size="35" placeholder="Enter a project name"></input></p>
|
|
||||||
- <p><input id="githubRepoDesc" size="60" placeholder="Enter a project description"></input></p>
|
|
||||||
- <p>Your repository will be <select id="githubRepoPrivate">
|
|
||||||
- <option value="public">Public</option>
|
|
||||||
- <option value="private">Private</option>
|
|
||||||
- </select></p>
|
|
||||||
- <p>License: <select id="githubRepoLicense">
|
|
||||||
- <option value="">Will decide later / all rights reserved</option>
|
|
||||||
- <option value="cc0-1.0">CC Zero (public domain, remix-friendly)</option>
|
|
||||||
- <option value="mit">MIT (must preserve notices)</option>
|
|
||||||
- <option value="cc-by-4.0">CC BY (must attribute)</option>
|
|
||||||
- <option value="cc-by-sa-4.0">CC BY-SA (must attribute, use same license)</option>
|
|
||||||
- <option value="gpl-3.0">GPL v3 (must publish source)</option>
|
|
||||||
- </select></p>
|
|
||||||
- <p><button type="button" class="btn btn-primary" id="publishGithubButton">Upload Project</button></p>
|
|
||||||
- <p>Your existing file will be moved to a new folder in the IDE.</p>
|
|
||||||
- </div>
|
|
||||||
- <div class="modal-footer">
|
|
||||||
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
|
||||||
- </div>
|
|
||||||
- </div>
|
|
||||||
- </div>
|
|
||||||
-</div>
|
|
||||||
-<div id="pushGithubModal" class="modal fade">
|
|
||||||
- <div class="modal-dialog modal-md" role="document">
|
|
||||||
- <div class="modal-content">
|
|
||||||
- <div class="modal-header">
|
|
||||||
- <h3 class="modal-title">Push Project Changes to GitHub</h3>
|
|
||||||
- </div>
|
|
||||||
- <div class="modal-body">
|
|
||||||
- <p><input id="githubCommitMsg" size="50" placeholder="Enter a commit message"></input></p>
|
|
||||||
- <p><button type="button" class="btn btn-primary" id="pushGithubButton">Push Changes</button></p>
|
|
||||||
- </div>
|
|
||||||
- <div class="modal-footer">
|
|
||||||
- <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
|
||||||
- </div>
|
|
||||||
- </div>
|
|
||||||
- </div>
|
|
||||||
-</div>
|
|
||||||
|
|
||||||
<script src="jquery/jquery.min.js"></script>
|
|
||||||
|
|
||||||
@@ -635,12 +435,5 @@
|
|
||||||
startUI();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
-<script>
|
|
||||||
-/*
|
|
||||||
- var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1;
|
|
||||||
- if (!isFirefox && platform_id != 'vcs') { $("#best_in_firefox").show(); }
|
|
||||||
-*/
|
|
||||||
-</script>
|
|
||||||
-
|
|
||||||
</body>
|
|
||||||
</html>
|
|
460
electron.html
460
electron.html
|
@ -1,460 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<title>8bitworkshop IDE</title>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=yes">
|
|
||||||
<style type="text/css" media="screen">
|
|
||||||
body {
|
|
||||||
overflow: hidden;
|
|
||||||
font-size: 11px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<link rel="stylesheet" href="css/ui.css">
|
|
||||||
|
|
||||||
<!-- google analytics -->
|
|
||||||
<script>
|
|
||||||
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
|
|
||||||
if (window.location.host.endsWith('8bitworkshop.com')) {
|
|
||||||
ga('create', 'UA-54497476-9', 'auto');
|
|
||||||
ga('set', 'anonymizeIp', true);
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<script async src='https://www.google-analytics.com/analytics.js'></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
<div id="controls_top" class="disable-select">
|
|
||||||
<div id="controls_dynamic" style="visibility:hidden">
|
|
||||||
<!-- main menu -->
|
|
||||||
<span class="dropdown">
|
|
||||||
<a class="btn dropdown-toggle toolbarMenuButton" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="Menu">
|
|
||||||
<span class="glyphicon glyphicon-menu-hamburger" aria-hidden="true"></span>
|
|
||||||
<span class="caret"></span>
|
|
||||||
</a>
|
|
||||||
<ul class="dropdown-menu dropdown-menu-left" aria-labelledby="dropdownMenuButton" style="left:auto">
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_new_file">New Project...</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_upload_file">Upload...</a></li>
|
|
||||||
<hr>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">File</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_reset_file">Revert to Original...</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_rename_file">Rename File...</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_delete_file">Delete File...</a></li>
|
|
||||||
<hr>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_addfile_include">Add Include File...</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_addfile_link">Add Linked File...</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">Download</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_download_file">Download Source File</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_download_rom">Download ROM Image</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_download_zip">Download Project as ZIP</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_download_allzip">Download All Changes as ZIP</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">Share</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_share_file">Share Playable Link...</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_record_video">Record Video...</a></li>
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_export_cassette">Make Cassette Audio...</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">Debug</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="#" id="item_debug_expr">Break Expression...</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<!-- PLATFORMS menu -->
|
|
||||||
<span class="dropdown">
|
|
||||||
<a class="btn dropdown-toggle toolbarMenuButton" id="platformsMenuButton" style="min-width:90px" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
||||||
<span class="platform_name">PLATFORMS</span> <span class="caret"></span>
|
|
||||||
</a>
|
|
||||||
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="platformsMenuButton">
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">Game Consoles</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="?platform=vcs">Atari 2600</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=nes">NES</a></li>
|
|
||||||
<hr>
|
|
||||||
<li><a class="dropdown-item" href="?platform=astrocade">Bally Astrocade</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=coleco">ColecoVision</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=sms-sg1000-libcv">Sega SG-1000</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=sms-sms-libcv">Sega Master System</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=atari7800">Atari 7800</a></li>
|
|
||||||
<!--
|
|
||||||
<li><a class="dropdown-item" href="?platform=vectrex">Vectrex</a></li>
|
|
||||||
-->
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">Computers</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="?platform=c64">Commodore 64</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=msx">MSX (BIOS)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=msx-libcv">MSX (libCV)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=apple2">Apple ][+</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=zx">ZX Spectrum</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=x86">x86 (FreeDOS)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=cpc.6128">Amstrad CPC6128</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">Arcade Systems</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="?platform=vicdual">VIC Dual</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=mw8080bw">Midway 8080</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=galaxian-scramble">Galaxian/Scramble</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=vector-z80color">Atari Color Vector (Z80)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=vector-ataricolor">Atari Color Vector (6502)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=williams-z80">Williams (Z80)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=sound_williams-z80">Williams Sound (Z80)</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">Hardware</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="?platform=verilog">Verilog</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=verilog-vga">Verilog (VGA @ 25 Mhz)</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">Interpreters</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="?platform=basic">BASIC</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=zmachine">Z-Machine</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=markdown">Markdown Text Editor</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
<li class="dropdown dropdown-submenu">
|
|
||||||
<a tabindex="-1" href="#">MAME/Other</a>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="?platform=atari8-800xl.mame">Atari 800XL (MAME)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=atari8-5200.mame">Atari 5200 (MAME)</a></li>
|
|
||||||
<hr>
|
|
||||||
<li><a class="dropdown-item" href="?platform=vcs.stellerator">Atari 2600 (Stellerator)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=vcs.mame">Atari 2600 (MAME)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=coleco.mame">ColecoVision (MAME)</a></li>
|
|
||||||
<li><a class="dropdown-item" href="?platform=nes.mame">NES (MAME)</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<!-- project selector -->
|
|
||||||
<span id="repo_name" class="hidden-sm" style="color:#eee; font-size: small"></span>
|
|
||||||
<select id="preset_select" name="" title="Project Select" style="max-width:20em;visibility:hidden;height:2.3em">
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<img id="compile_spinner" src="images/spinner.gif" style="visibility:hidden;margin-left:8px;margin-right:8px;height:2em">
|
|
||||||
<span id="toolbar"></span>
|
|
||||||
<span class="btn_group view_group hidden-sm hidden-xs" id="speed_bar" style="display:none">
|
|
||||||
<button id="dbg_slowest" class="btn" title="Slowest"><span class="glyphicon glyphicon-fast-backward" aria-hidden="true"></span></button>
|
|
||||||
<button id="dbg_slower" class="btn" title="Slower"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button>
|
|
||||||
<span class="label"><span id="fps_label">60.00</span> fps</span>
|
|
||||||
<button id="dbg_faster" class="btn" title="Faster"><span class="glyphicon glyphicon-forward" aria-hidden="true"></span></button>
|
|
||||||
<button id="dbg_fastest" class="btn" title="Faster"><span class="glyphicon glyphicon-fast-forward" aria-hidden="true"></span></button>
|
|
||||||
</span>
|
|
||||||
<span id="verilog_bar" style="display:none">
|
|
||||||
<span class="label"><span id="settle_label"></span> evals/clk</span>
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<!-- BOOKS menu -->
|
|
||||||
<span class="dropdown pull-right">
|
|
||||||
<a class="btn dropdown-toggle hidden-xs hiddem-sm toolbarMenuButton" id="booksMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
||||||
<span class="glyphicon glyphicon-book" aria-hidden="true"></span>
|
|
||||||
Books <span class="caret"></span>
|
|
||||||
</a>
|
|
||||||
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="booksMenuButton">
|
|
||||||
<li>
|
|
||||||
<a class="dropdown-item dropdown-link book-vcs" target="_book_a2600" href="https://www.amazon.com/gp/product/1541021304/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&tag=pzp-20&camp=1789&creative=9325&linkCode=as2&creativeASIN=B01N4DSRIZ&linkId=04d39e274c06e6c93b93d20a9a977111">
|
|
||||||
<img src="images/book_a2600.png"/>
|
|
||||||
<span class="book-title">Making Games For The Atari 2600</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a class="dropdown-item dropdown-link book-arcade" target="_book_arcade" href="https://www.amazon.com/gp/product/1545484759/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1545484759&linkCode=as2&tag=pzp-20&linkId=b27709c022d2ebe639e90316d9f4fd5b">
|
|
||||||
<img src="images/book_arcade.png"/>
|
|
||||||
<span class="book-title">Making 8-bit Arcade Games in C</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a class="dropdown-item dropdown-link book-verilog" target="_book_verilog" href="https://www.amazon.com/gp/product/1728619440/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1728619440&linkCode=as2&tag=pzp-20&linkId=7237a25861cb6b49a4128ba53d84c3e2">
|
|
||||||
<img src="images/book_verilog.png"/>
|
|
||||||
<span class="book-title">Designing Video Game Hardware in Verilog</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<a class="dropdown-item dropdown-link book-nes" target="_book_nes" href="https://www.amazon.com/gp/product/1075952727/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1075952727&linkCode=as2&tag=pzp-20&linkId=633176e8b36fea7f927020e2c322d80a">
|
|
||||||
<img src="images/book_nes.png"/>
|
|
||||||
<span class="book-title">Making Games For The NES</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
<!-- 8bitworkshop logo -->
|
|
||||||
<span class="logo-gradient pull-right" style="margin-left:auto" onclick="window.open('https://8bitworkshop.com/','_8bitws');">8bitworkshop</span>
|
|
||||||
</div><!-- controls_dynamic -->
|
|
||||||
</div><!-- controls_top -->
|
|
||||||
|
|
||||||
<div id="notebook">
|
|
||||||
<div id="sidebar">
|
|
||||||
<ul id="windowMenuList">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div id="workspace">
|
|
||||||
</div>
|
|
||||||
<div class="emulator disable-select" id="emulator">
|
|
||||||
<!-- replay slider -->
|
|
||||||
<div id="replaydiv" class="replaydiv" style="display:none;color:#ccc;text-align:left">
|
|
||||||
<div style="display:grid; grid-template-columns: 3em 3em auto 3em; grid-gap: 1em">
|
|
||||||
<button id="replay_back" class="btn" title="Back one frame"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button>
|
|
||||||
<div>
|
|
||||||
Frame<br>
|
|
||||||
<span id="replay_frame" style="width:3em">-</span>
|
|
||||||
</div>
|
|
||||||
<input type="range" min="0" max="0" value="0" class="slider" id="replayslider">
|
|
||||||
<button id="replay_fwd" class="btn" title="Ahead one frame"><span class="glyphicon glyphicon-forward" aria-hidden="true"></span></button>
|
|
||||||
|
|
||||||
<button id="clock_back" class="btn" title="Back one step"><span class="glyphicon glyphicon-backward" aria-hidden="true"></span></button>
|
|
||||||
<div>
|
|
||||||
Step<br>
|
|
||||||
<span id="replay_clock" style="width:3em">-</span>
|
|
||||||
</div>
|
|
||||||
<input type="range" min="0" max="0" value="0" class="slider" id="clockslider">
|
|
||||||
<button id="clock_fwd" class="btn" title="Forward one step"><span class="glyphicon glyphicon-forward" aria-hidden="true"></span></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- emulator video -->
|
|
||||||
<div id="emuscreen">
|
|
||||||
</div>
|
|
||||||
<!-- for Javatari only -->
|
|
||||||
<div id="javatari-div" style="float:center;margin:10px;display:none">
|
|
||||||
<div id="javatari-screen" style="margin: 0 auto; box-shadow: 2px 2px 10px rgb(60, 60, 60);"></div>
|
|
||||||
<div id="javatari-console-panel" style="margin: 0 auto; box-shadow: 2px 2px 10px rgb(60, 60, 60);"></div>
|
|
||||||
</div>
|
|
||||||
<!-- control instructions -->
|
|
||||||
<div class="emucontrols-vcs emucontrols-c64 text-center small control-insns" style="display:none">
|
|
||||||
<span class="control-def"><span class="control-key">←↑↓→</span> Joystick</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Space</span> Button</span>
|
|
||||||
</div>
|
|
||||||
<div class="emucontrols-nes emucontrols-atari7800 text-center small control-insns" style="display:none">
|
|
||||||
<span class="control-def"><span class="control-key">←↑↓→</span> Joypad</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Space</span> Button A</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Shift</span> Button B</span>
|
|
||||||
<span class="control-def"><span class="control-key small">\</span> Select</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Enter</span> Start</span>
|
|
||||||
</div>
|
|
||||||
<div class="emucontrols-msx emucontrols-coleco emucontrols-sms text-center small control-insns" style="display:none">
|
|
||||||
<span class="control-def"><span class="control-key">←↑↓→</span> Joypad</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Space</span> Button A</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Shift</span> Button B</span>
|
|
||||||
</div>
|
|
||||||
<div class="emucontrols-vicdual emucontrols-galaxian emucontrols-vector text-center small control-insns" style="display:none">
|
|
||||||
<span class="control-def"><span class="control-key">←↑↓→</span> Joystick</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Space</span> Button 1</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Shift</span> Button 2</span>
|
|
||||||
<span class="control-def"><span class="control-key">\</span> Coin</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Enter</span> Start</span>
|
|
||||||
</div>
|
|
||||||
<div class="emucontrols-mw8080bw text-center small control-insns" style="display:none">
|
|
||||||
<span class="control-def"><span class="control-key">← →</span> Joystick</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Space</span> Fire</span>
|
|
||||||
</div>
|
|
||||||
<div class="emucontrols-williams text-center small control-insns" style="display:none">
|
|
||||||
<span class="control-def"><span class="control-key">A W S D</span> Move</span>
|
|
||||||
<span class="control-def"><span class="control-key">←↑↓→</span> Fire</span>
|
|
||||||
<span class="control-def"><span class="control-key">\</span> Coin</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Enter</span> Start</span>
|
|
||||||
<span class="control-def"><span class="control-key small">6 7 8 9</span> Extra</span>
|
|
||||||
</div>
|
|
||||||
<div class="emucontrols-astrocade text-center small control-insns" style="display:none">
|
|
||||||
<span class="control-def"><span class="control-key">←↑↓→</span> Joystick</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Space</span> Trigger</span>
|
|
||||||
<span class="control-def"><span class="control-key small">Mouse X</span> Knob</span>
|
|
||||||
<span class="control-def"><span class="control-key small" style="display:inline-block;font-family:monospace">
|
|
||||||
U I O P<br>
|
|
||||||
J K L /<br>
|
|
||||||
7 8 9 X<br>
|
|
||||||
4 5 6 -<br>
|
|
||||||
1 2 3 ,<br>
|
|
||||||
\ 0 . =</span> Keypad</span>
|
|
||||||
</div>
|
|
||||||
<div class="emucontrols-vectrex text-center small control-insns" style="display:none">
|
|
||||||
<span class="control-def"><span class="control-key">←↑↓→</span> Joystick</span>
|
|
||||||
<span class="control-def"><span class="control-key">Z X C V</span> Buttons</span>
|
|
||||||
</div>
|
|
||||||
<div class="emucontrols-atari8 text-center small control-insns" style="display:none">
|
|
||||||
<span class="control-def"><span class="control-key">←↑↓→</span> Joystick</span>
|
|
||||||
<span class="control-def"><span class="control-key">Z</span> Button 1</span>
|
|
||||||
<span class="control-def"><span class="control-key">X</span> Button 2</span>
|
|
||||||
<span class="control-def"><span class="control-key">1</span> Start</span>
|
|
||||||
</div>
|
|
||||||
<!-- -->
|
|
||||||
<div id="emuoverlay" class="emuoverlay" style="display:none">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="mem_info" class="mem_info" style="display:none">
|
|
||||||
</div>
|
|
||||||
<div id="error_alert" class="alert alert-danger alert-dismissable" style="position:absolute;right:0;top:0;display:none">
|
|
||||||
<button type="button" class="close" onclick="$('.alert').hide()" aria-hidden="true">×</button>
|
|
||||||
<div id="error_alert_msg"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--
|
|
||||||
<div class="twitbtn">
|
|
||||||
<a target="_new" href="https://twitter.com/8bitworkshop" class="twitter-follow-button" data-show-count="false">Follow @8bitworkshop</a>-->
|
|
||||||
<!--<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>-->
|
|
||||||
<!--</div>-->
|
|
||||||
<div id="pleaseWaitModal" class="modal fade">
|
|
||||||
<div class="modal-dialog modal-md" role="document">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-body">
|
|
||||||
Please wait...
|
|
||||||
<div class="progress">
|
|
||||||
<div class="progress-bar progress-bar-striped active" role="progressbar" id="pleaseWaitProgressBar">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="videoPreviewModal" class="modal fade">
|
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h3 class="modal-title">Video Preview - Right-click to save</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<img id="videoPreviewImage">
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="embedLinkModal" class="modal fade">
|
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h3 class="modal-title">Share Playable Link</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<p>Here's a direct link to a playable version of your game:</p>
|
|
||||||
<textarea rows="4" cols="80" id="embedLinkTextarea" class="cliptext"></textarea>
|
|
||||||
<button type="button" class="btn btn-primary" data-clipboard-target="#embedLinkTextarea">Copy Direct Link</button>
|
|
||||||
<p>You can also embed it into an IFRAME:</p>
|
|
||||||
<textarea rows="4" cols="80" id="embedIframeTextarea" class="cliptext"></textarea>
|
|
||||||
<button type="button" class="btn btn-primary" data-clipboard-target="#embedIframeTextarea">Copy IFRAME Tag</button>
|
|
||||||
<p id="embedAdviceWarnIE">Note: These links may be too long for IE/Edge browsers.</p>
|
|
||||||
<p id="embedAdviceWarnAll">Note: These links may be too long for some browsers.</p>
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
Choose one (or none) then
|
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="debugExprModal" class="modal fade">
|
|
||||||
<div class="modal-dialog modal-md" role="document">
|
|
||||||
<div class="modal-content">
|
|
||||||
<div class="modal-header">
|
|
||||||
<h3 class="modal-title">Break Expression</h3>
|
|
||||||
</div>
|
|
||||||
<div class="modal-body">
|
|
||||||
<p>Enter a break expression:</p>
|
|
||||||
<p><input id="debugExprInput" size="60"></input></p>
|
|
||||||
<p>Examples:</p>
|
|
||||||
<pre id="debugExprExamples"></pre>
|
|
||||||
</div>
|
|
||||||
<div class="modal-footer">
|
|
||||||
<button type="button" class="btn btn-primary" id="debugExprSubmit">Debug</button>
|
|
||||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script src="jquery/jquery.min.js"></script>
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
|
|
||||||
<script src="bootstrap/js/bootstrap.min.js"></script>
|
|
||||||
<script src="bootstrap/js/bootbox.all.min.js"></script>
|
|
||||||
<link rel="stylesheet" href="lib/bootstrap-tourist.css">
|
|
||||||
|
|
||||||
<script src="src/codemirror/codemirror.js"></script>
|
|
||||||
<script src="codemirror/mode/clike/clike.js"></script>
|
|
||||||
<script src="codemirror/mode/z80/z80.js"></script>
|
|
||||||
<script src="codemirror/mode/verilog/verilog.js"></script>
|
|
||||||
<script src="codemirror/mode/markdown/markdown.js"></script>
|
|
||||||
<script src="codemirror/mode/javascript/javascript.js"></script>
|
|
||||||
<script src="codemirror/mode/gas/gas.js"></script>
|
|
||||||
<script src="src/codemirror/6502.js"></script>
|
|
||||||
<script src="src/codemirror/bataribasic.js"></script>
|
|
||||||
<script src="src/codemirror/inform6.js"></script>
|
|
||||||
<script src="src/codemirror/fastbasic.js"></script>
|
|
||||||
<script src="src/codemirror/basic.js"></script>
|
|
||||||
<script src="src/codemirror/wiz.js"></script>
|
|
||||||
<script src="src/codemirror/vasm.js"></script>
|
|
||||||
<link rel="stylesheet" href="css/codemirror.css">
|
|
||||||
<script src="codemirror/addon/edit/matchbrackets.js"></script>
|
|
||||||
<script src="codemirror/addon/search/search.js"></script>
|
|
||||||
<script src="codemirror/addon/search/searchcursor.js"></script>
|
|
||||||
<script src="codemirror/addon/search/jump-to-line.js"></script>
|
|
||||||
<script src="codemirror/addon/dialog/dialog.js"></script>
|
|
||||||
<script src="codemirror/addon/selection/active-line.js"></script>
|
|
||||||
<link rel="stylesheet" href="codemirror/addon/dialog/dialog.css">
|
|
||||||
|
|
||||||
<script src="tss/js/tss/PsgDeviceChannel.js"></script>
|
|
||||||
<script src="tss/js/tss/MasterChannel.js"></script>
|
|
||||||
<script src="tss/js/tss/AudioLooper.js"></script>
|
|
||||||
<script src="tss/js/Log.js"></script>
|
|
||||||
|
|
||||||
<!-- main IDE module -->
|
|
||||||
<script src="gen/ui.js" type="module"></script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
// submenus open on click + hover
|
|
||||||
$( ".dropdown-submenu" ).click(function(event) {
|
|
||||||
event.stopPropagation();
|
|
||||||
$(this).parent().siblings().removeClass('open');
|
|
||||||
$(this).parent().toggleClass('open');
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- Sentry error reporting -->
|
|
||||||
<script
|
|
||||||
src="https://browser.sentry-cdn.com/6.4.1/bundle.min.js"
|
|
||||||
integrity="sha384-THoc7rflwZFKTdZNgv6jLFFDn299Uv3t1SW5B4yGLvLiCRTYP9ys6vXZcMl95TQF"
|
|
||||||
crossorigin="anonymous"
|
|
||||||
></script>
|
|
||||||
<script>
|
|
||||||
Sentry.init({
|
|
||||||
dsn: 'https://bf329df3d1b34afa9f5b5e8ecd80ad11@o320878.ingest.sentry.io/1813925',
|
|
||||||
beforeBreadcrumb(breadcrumb, hint) {
|
|
||||||
if (breadcrumb.category === 'xhr' && typeof breadcrumb.data.url === 'string') {
|
|
||||||
if (breadcrumb.data.url.startsWith('http')) return null; // discard external scripts
|
|
||||||
}
|
|
||||||
return breadcrumb;
|
|
||||||
},
|
|
||||||
beforeSend(event, hint) {
|
|
||||||
const error = hint.originalException;
|
|
||||||
if (error && error.hasOwnProperty('$loc')) return null; // ignore EmuHalt
|
|
||||||
return event;
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
255
electron.js
255
electron.js
|
@ -1,255 +0,0 @@
|
||||||
"use strict";
|
|
||||||
|
|
||||||
const { app, dialog, Menu, BrowserWindow } = require('electron')
|
|
||||||
const _path = require('path')
|
|
||||||
const isMac = process.platform === 'darwin'
|
|
||||||
|
|
||||||
const homeDirectory = require('os').homedir();
|
|
||||||
const wsroot = process.env.HOME_8BITWORKSHOP || _path.join(homeDirectory, '8bitworkshop');
|
|
||||||
|
|
||||||
// call updater
|
|
||||||
require('update-electron-app')()
|
|
||||||
|
|
||||||
// init sentry
|
|
||||||
require('@sentry/electron').init({ dsn: "https://bf329df3d1b34afa9f5b5e8ecd80ad11@o320878.ingest.sentry.io/1813925" });
|
|
||||||
|
|
||||||
function openURL(url) {
|
|
||||||
return async () => {
|
|
||||||
const { shell } = require('electron')
|
|
||||||
await shell.openExternal(url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function createWindow (platform, repo, mainfile) {
|
|
||||||
// Create the browser window.
|
|
||||||
const win = new BrowserWindow({
|
|
||||||
width: 1024,
|
|
||||||
height: 768,
|
|
||||||
backgroundColor: '#fff',
|
|
||||||
webPreferences: {
|
|
||||||
preload: _path.join(__dirname, './electron-preload.js'),
|
|
||||||
nodeIntegration: false,
|
|
||||||
enableRemoteModule: false,
|
|
||||||
contextIsolation: false,
|
|
||||||
sandbox: false,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// and load the index.html of the app.
|
|
||||||
var qs = 'electron=1&';
|
|
||||||
if (platform != null) {
|
|
||||||
qs += 'platform=' + platform + '&';
|
|
||||||
}
|
|
||||||
if (mainfile != null) {
|
|
||||||
qs += 'file=' + mainfile + '&'
|
|
||||||
}
|
|
||||||
qs += 'repo=' + (repo || '/');
|
|
||||||
win.loadFile('electron.html', {
|
|
||||||
search: qs
|
|
||||||
});
|
|
||||||
|
|
||||||
// Maximize
|
|
||||||
win.maximize();
|
|
||||||
return win;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: doesn't work if browser window reloads itself
|
|
||||||
function reloadCurrentWindow() {
|
|
||||||
var wnd = BrowserWindow.getFocusedWindow();
|
|
||||||
wnd.reload();
|
|
||||||
}
|
|
||||||
|
|
||||||
function openWorkspaceWindow(mainfilepath) {
|
|
||||||
var relpath = _path.relative(wsroot, mainfilepath);
|
|
||||||
if (relpath.startsWith('.')) {
|
|
||||||
dialog.showErrorBox('Error', `Your workspace directory must be directly under "${wsroot}/<platform>/"`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var toks = relpath.split(_path.sep);
|
|
||||||
if (toks.length < 3) {
|
|
||||||
dialog.showErrorBox('Error', `You must create a directory for your project, e.g. "${toks[0]||'<platform>'}/myproject/"`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (toks.length > 3) {
|
|
||||||
dialog.showErrorBox('Error', `Your main file must be directly under "${wsroot}/<platform>/<project>/"`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var wnd = BrowserWindow.getFocusedWindow();
|
|
||||||
if (wnd) wnd.close();
|
|
||||||
createWindow(toks[0], toks[0] + '/' + toks[1], toks[2]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function openWorkspaceDialog() {
|
|
||||||
dialog.showOpenDialog({
|
|
||||||
title: "Open Project",
|
|
||||||
defaultPath: wsroot,
|
|
||||||
properties: ['openFile', 'promptToCreate'],
|
|
||||||
message: "Choose the main source file in your project directory (i.e. ~/8bitworkshop/c64/myproject/main.c)",
|
|
||||||
}).then((rtn) => {
|
|
||||||
if (!rtn.canceled && rtn.filePaths && rtn.filePaths.length > 0) {
|
|
||||||
var path = rtn.filePaths[0];
|
|
||||||
if (path) {
|
|
||||||
openWorkspaceWindow(path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
///
|
|
||||||
|
|
||||||
function buildMenu() {
|
|
||||||
|
|
||||||
const template = [
|
|
||||||
// { role: 'appMenu' }
|
|
||||||
...(isMac ? [{
|
|
||||||
label: app.name,
|
|
||||||
submenu: [
|
|
||||||
{ role: 'about' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'services' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'hide' },
|
|
||||||
{ role: 'hideothers' },
|
|
||||||
{ role: 'unhide' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'quit' }
|
|
||||||
]
|
|
||||||
}] : []),
|
|
||||||
// { role: 'fileMenu' }
|
|
||||||
{
|
|
||||||
label: 'File',
|
|
||||||
submenu: [
|
|
||||||
{
|
|
||||||
label: 'Open Workspace...',
|
|
||||||
click: openWorkspaceDialog,
|
|
||||||
accelerator: 'CmdOrCtrl+O',
|
|
||||||
},
|
|
||||||
// When a file is requested from the recent documents menu, the open-file event of app module will be emitted for it.
|
|
||||||
{
|
|
||||||
"label":"Open Recent",
|
|
||||||
"role":"recentdocuments",
|
|
||||||
"submenu":[
|
|
||||||
{
|
|
||||||
"label":"Clear Recent",
|
|
||||||
"role":"clearrecentdocuments"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{ type: 'separator' },
|
|
||||||
isMac ? { role: 'close' } : { role: 'quit' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// { role: 'editMenu' }
|
|
||||||
{
|
|
||||||
label: 'Edit',
|
|
||||||
submenu: [
|
|
||||||
{ role: 'undo' },
|
|
||||||
{ role: 'redo' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'cut' },
|
|
||||||
{ role: 'copy' },
|
|
||||||
{ role: 'paste' },
|
|
||||||
...(isMac ? [
|
|
||||||
{ role: 'pasteAndMatchStyle' },
|
|
||||||
{ role: 'delete' },
|
|
||||||
{ role: 'selectAll' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{
|
|
||||||
label: 'Speech',
|
|
||||||
submenu: [
|
|
||||||
{ role: 'startspeaking' },
|
|
||||||
{ role: 'stopspeaking' }
|
|
||||||
]
|
|
||||||
}
|
|
||||||
] : [
|
|
||||||
{ role: 'delete' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'selectAll' }
|
|
||||||
])
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// { role: 'viewMenu' }
|
|
||||||
{
|
|
||||||
label: 'View',
|
|
||||||
submenu: [
|
|
||||||
{
|
|
||||||
label: 'Reload Window',
|
|
||||||
click: reloadCurrentWindow
|
|
||||||
},
|
|
||||||
{ role: 'toggledevtools' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'resetzoom' },
|
|
||||||
{ role: 'zoomin' },
|
|
||||||
{ role: 'zoomout' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'togglefullscreen' }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
// { role: 'windowMenu' }
|
|
||||||
{
|
|
||||||
label: 'Window',
|
|
||||||
submenu: [
|
|
||||||
{ role: 'minimize' },
|
|
||||||
{ role: 'zoom' },
|
|
||||||
...(isMac ? [
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'front' },
|
|
||||||
{ type: 'separator' },
|
|
||||||
{ role: 'window' }
|
|
||||||
] : [
|
|
||||||
{ role: 'close' }
|
|
||||||
])
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
role: 'help',
|
|
||||||
submenu: [
|
|
||||||
{
|
|
||||||
label: 'IDE Help',
|
|
||||||
click: openURL('https://8bitworkshop.com/docs/docs/ide.html')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Latest News',
|
|
||||||
click: openURL('https://8bitworkshop.com/docs/blog.html')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Report an Issue',
|
|
||||||
click: openURL('https://github.com/sehugg/8bitworkshop/issues/new')
|
|
||||||
},
|
|
||||||
{ type: 'separator' },
|
|
||||||
{
|
|
||||||
label: 'Follow @8bitworkshop on Twitter',
|
|
||||||
click: openURL('https://twitter.com/8bitworkshop')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Become a Patreon',
|
|
||||||
click: openURL('https://www.patreon.com/8bitworkshop')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
label: 'Buy 8bitworkshop Books',
|
|
||||||
click: openURL('https://www.amazon.com/s?k=8bitworkshop&i=stripbooks&dc&qid=1598884483&tag=pzp-20')
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
const menu = Menu.buildFromTemplate(template)
|
|
||||||
Menu.setApplicationMenu(menu)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Quit when all windows are closed, except on macOS. There, it's common
|
|
||||||
// for applications and their menu bar to stay active until the user quits
|
|
||||||
// explicitly with Cmd + Q.
|
|
||||||
app.on('window-all-closed', () => {
|
|
||||||
app.quit()
|
|
||||||
})
|
|
||||||
|
|
||||||
app.on('open-file', (event, path) => {
|
|
||||||
openWorkspaceWindow(path);
|
|
||||||
})
|
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
|
||||||
// initialization and is ready to create browser windows.
|
|
||||||
// Some APIs can only be used after this event occurs.
|
|
||||||
app.whenReady().then(buildMenu).then(createWindow)
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
22
package.json
22
package.json
|
@ -1,9 +1,9 @@
|
||||||
{
|
{
|
||||||
"name": "8bitworkshop",
|
"name": "8bitworkshop",
|
||||||
"version": "3.9.0",
|
"version": "3.9.1",
|
||||||
"author": "Steven Hugg",
|
"author": "Steven Hugg",
|
||||||
"category": "Development",
|
"category": "Development",
|
||||||
"description": "Desktop version of 8bitworkshop.com retro programming IDE",
|
"description": "8bitworkshop.com retro programming IDE",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/sehugg/8bitworkshop.git"
|
"url": "git+https://github.com/sehugg/8bitworkshop.git"
|
||||||
|
@ -43,25 +43,19 @@
|
||||||
"esbuild": "^0.12.16",
|
"esbuild": "^0.12.16",
|
||||||
"jsdom": "^12.2.0",
|
"jsdom": "^12.2.0",
|
||||||
"lzg": "^1.0.x",
|
"lzg": "^1.0.x",
|
||||||
"mocha": "^7.2.0",
|
"mocha": "^9.2.0",
|
||||||
"mocha-simple-html-reporter": "^2.0.0",
|
"mocha-simple-html-reporter": "^2.0.0",
|
||||||
"typescript": "^4.3.4",
|
"typescript": "^4.4.4",
|
||||||
"typescript-formatter": "^7.2.2"
|
"typescript-formatter": "^7.2.2"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@sentry/electron": "^2.5.1",
|
"chromedriver": "^97.0.1",
|
||||||
"chokidar": "^3.5.0",
|
|
||||||
"chromedriver": "^92.0.0",
|
|
||||||
"electron": "^9.4.0",
|
|
||||||
"electron-builder": "^22.11.7",
|
|
||||||
"electron-packager": "^15.2.0",
|
|
||||||
"heapdump": "^0.3.15",
|
"heapdump": "^0.3.15",
|
||||||
"jsfuzz": "^1.0.14",
|
"jsfuzz": "^1.0.14",
|
||||||
"nightwatch": "^1.6.4",
|
"nightwatch": "^1.7.13",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rgbquant": "^1.1.2",
|
"rgbquant": "^1.1.2",
|
||||||
"typedoc": "^0.21.0",
|
"typedoc": "^0.22.11"
|
||||||
"update-electron-app": "^2.0.1"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "make prepare",
|
"build": "make prepare",
|
||||||
|
@ -79,13 +73,11 @@
|
||||||
"test-verilog": "NODE_PATH=$(pwd) mocha --timeout 60000 --reporter mocha-simple-html-reporter --reporter-options output=test/output/verilog.html test/verilog/testverilog.js",
|
"test-verilog": "NODE_PATH=$(pwd) mocha --timeout 60000 --reporter mocha-simple-html-reporter --reporter-options output=test/output/verilog.html test/verilog/testverilog.js",
|
||||||
"test-web-quick": "nightwatch -e chrome test/web/testembed.js",
|
"test-web-quick": "nightwatch -e chrome test/web/testembed.js",
|
||||||
"test-web-all": "nightwatch -e chrome test/web",
|
"test-web-all": "nightwatch -e chrome test/web",
|
||||||
"start": "electron .",
|
|
||||||
"fuzzbasic": "jsfuzz gen/common/basic/fuzz.js ~/basic/corpus/ --versifier false",
|
"fuzzbasic": "jsfuzz gen/common/basic/fuzz.js ~/basic/corpus/ --versifier false",
|
||||||
"fuzzhdl": "jsfuzz -r binaryen gen/common/hdl/fuzz.js ~/verilator/corpus/ --versifier false",
|
"fuzzhdl": "jsfuzz -r binaryen gen/common/hdl/fuzz.js ~/verilator/corpus/ --versifier false",
|
||||||
"machine": "node gen/tools/runmachine.js",
|
"machine": "node gen/tools/runmachine.js",
|
||||||
"mkdoc": "typedoc --out web/jsdoc src/common/"
|
"mkdoc": "typedoc --out web/jsdoc src/common/"
|
||||||
},
|
},
|
||||||
"main": "electron.js",
|
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"8bit",
|
"8bit",
|
||||||
"ide",
|
"ide",
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { Platform } from "../common/baseplatform";
|
||||||
import { stringToByteArray, getWithBinary, loadScript, getRootBasePlatform } 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";
|
import { importPlatform } from "../platform/_index";
|
||||||
|
import { saveAs } from "file-saver";
|
||||||
|
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue