mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-25 18:33:11 +00:00
testing scripting platform
This commit is contained in:
parent
a9736e18cf
commit
6753d9bf40
@ -376,6 +376,7 @@ div.markdown {
|
|||||||
width:94%;
|
width:94%;
|
||||||
margin:3%;
|
margin:3%;
|
||||||
padding:1em;
|
padding:1em;
|
||||||
|
user-select: auto;
|
||||||
}
|
}
|
||||||
div.markdown table {
|
div.markdown table {
|
||||||
margin:1em;
|
margin:1em;
|
||||||
@ -415,13 +416,11 @@ div.markdown th {
|
|||||||
color:rgba(0,0,0,0);
|
color:rgba(0,0,0,0);
|
||||||
}
|
}
|
||||||
.disable-select {
|
.disable-select {
|
||||||
-webkit-touch-callout: none;
|
|
||||||
-webkit-user-select: none;
|
|
||||||
-khtml-user-select: none;
|
|
||||||
-moz-user-select: none;
|
|
||||||
-ms-user-select: none;
|
|
||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
.enable-select {
|
||||||
|
user-select: auto;
|
||||||
|
}
|
||||||
.alert {
|
.alert {
|
||||||
z-index:2;
|
z-index:2;
|
||||||
}
|
}
|
||||||
|
@ -493,6 +493,7 @@ if (window.location.host.endsWith('8bitworkshop.com')) {
|
|||||||
<script src="codemirror/mode/z80/z80.js"></script>
|
<script src="codemirror/mode/z80/z80.js"></script>
|
||||||
<script src="codemirror/mode/verilog/verilog.js"></script>
|
<script src="codemirror/mode/verilog/verilog.js"></script>
|
||||||
<script src="codemirror/mode/markdown/markdown.js"></script>
|
<script src="codemirror/mode/markdown/markdown.js"></script>
|
||||||
|
<script src="codemirror/mode/javascript/javascript.js"></script>
|
||||||
<script src="src/codemirror/6502.js"></script>
|
<script src="src/codemirror/6502.js"></script>
|
||||||
<script src="src/codemirror/bataribasic.js"></script>
|
<script src="src/codemirror/bataribasic.js"></script>
|
||||||
<link rel="stylesheet" href="css/codemirror.css">
|
<link rel="stylesheet" href="css/codemirror.css">
|
||||||
|
101
src/platform/script.ts
Normal file
101
src/platform/script.ts
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
|
||||||
|
import { PLATFORMS } from "../emu";
|
||||||
|
import { Platform } from "../baseplatform";
|
||||||
|
|
||||||
|
// TODO: scripts run in global context
|
||||||
|
|
||||||
|
class NotebookItem {
|
||||||
|
obj: any;
|
||||||
|
el: JQuery<HTMLElement>;
|
||||||
|
wrap: JQuery<HTMLElement>;
|
||||||
|
|
||||||
|
setData(data: any) {
|
||||||
|
this.obj = data;
|
||||||
|
this.el = $("<div>");
|
||||||
|
this.el.text(JSON.stringify(data, null, ' '));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
delete() {
|
||||||
|
this.wrap && this.wrap.remove();
|
||||||
|
this.wrap = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Notebook {
|
||||||
|
top: HTMLElement;
|
||||||
|
items: {[id:string]:NotebookItem};
|
||||||
|
|
||||||
|
constructor(top: HTMLElement) {
|
||||||
|
this.items = {};
|
||||||
|
this.top = top;
|
||||||
|
$(top).css('overflowY', 'auto');
|
||||||
|
}
|
||||||
|
update(obj: any) {
|
||||||
|
var last = null;
|
||||||
|
var unused = new Set<string>(Object.keys(this.items));
|
||||||
|
for (var entry of Object.entries(obj)) {
|
||||||
|
var id = entry[0];
|
||||||
|
var data = entry[1];
|
||||||
|
var item = this.items[id];
|
||||||
|
//console.log(id,data,item);
|
||||||
|
if (!item) {
|
||||||
|
this.items[id] = item = new NotebookItem();
|
||||||
|
}
|
||||||
|
if (item.setData(data)) {
|
||||||
|
if (!item.wrap) {
|
||||||
|
item.wrap = $('<div class="markdown">');
|
||||||
|
$(this.top).append(item.wrap);
|
||||||
|
}
|
||||||
|
item.wrap.empty().append(item.el);
|
||||||
|
}
|
||||||
|
unused.delete(id);
|
||||||
|
}
|
||||||
|
unused.forEach((id) => { this.items[id].delete(); });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ScriptPlatform implements Platform {
|
||||||
|
mainElement;
|
||||||
|
htmlDiv;
|
||||||
|
notebook: Notebook;
|
||||||
|
|
||||||
|
constructor(mainElement:HTMLElement) {
|
||||||
|
this.mainElement = mainElement;
|
||||||
|
this.notebook = new Notebook(mainElement);
|
||||||
|
}
|
||||||
|
start() {
|
||||||
|
}
|
||||||
|
reset() {
|
||||||
|
}
|
||||||
|
pause() {
|
||||||
|
}
|
||||||
|
resume() {
|
||||||
|
}
|
||||||
|
loadROM(title, data) {
|
||||||
|
this.notebook.update(data);
|
||||||
|
}
|
||||||
|
isRunning() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
isDebugging() : boolean {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
getToolForFilename(fn : string) : string {
|
||||||
|
return "js";
|
||||||
|
}
|
||||||
|
getDefaultExtension() : string {
|
||||||
|
return ".js";
|
||||||
|
}
|
||||||
|
getPresets() {
|
||||||
|
return [
|
||||||
|
{id:'hello.js', name:'Hello'},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
showHelp() {
|
||||||
|
window.open("https://github.com/showdownjs/showdown/wiki/Showdown's-Script-syntax", "_help");
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
PLATFORMS['script'] = ScriptPlatform;
|
@ -72,6 +72,7 @@ var TOOL_TO_SOURCE_STYLE = {
|
|||||||
'zmac': 'z80',
|
'zmac': 'z80',
|
||||||
'bataribasic': 'bataribasic',
|
'bataribasic': 'bataribasic',
|
||||||
'markdown': 'markdown',
|
'markdown': 'markdown',
|
||||||
|
'js': 'javascript',
|
||||||
'xasm6809': 'z80'
|
'xasm6809': 'z80'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ export class ProjectWindows {
|
|||||||
this.activediv = div;
|
this.activediv = div;
|
||||||
this.activewnd = wnd;
|
this.activewnd = wnd;
|
||||||
$(div).show();
|
$(div).show();
|
||||||
this.refresh(moveCursor);
|
this.refresh(true); // needed to tell asset editor 1st time running, but that's bad
|
||||||
this.refreshErrors();
|
this.refreshErrors();
|
||||||
wnd.setVisible && wnd.setVisible(true);
|
wnd.setVisible && wnd.setVisible(true);
|
||||||
this.id2showfn[id] && this.id2showfn[id](id, wnd);
|
this.id2showfn[id] && this.id2showfn[id](id, wnd);
|
||||||
|
@ -2,13 +2,16 @@
|
|||||||
|
|
||||||
import { WorkerResult, WorkerFileUpdate, WorkerBuildStep, WorkerMessage, WorkerError, Dependency, SourceLine } from "../workertypes";
|
import { WorkerResult, WorkerFileUpdate, WorkerBuildStep, WorkerMessage, WorkerError, Dependency, SourceLine } from "../workertypes";
|
||||||
|
|
||||||
const emglobal : any = this['window'] || this['global'] || this;
|
|
||||||
declare var WebAssembly;
|
declare var WebAssembly;
|
||||||
declare function importScripts(path:string);
|
declare function importScripts(path:string);
|
||||||
declare function postMessage(msg);
|
declare function postMessage(msg);
|
||||||
|
|
||||||
var ENVIRONMENT_IS_WEB = typeof window === 'object';
|
const emglobal : any = this['window'] || this['global'] || this;
|
||||||
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
|
const ENVIRONMENT_IS_WEB = typeof window === 'object';
|
||||||
|
const ENVIRONMENT_IS_WORKER = typeof importScripts === 'function';
|
||||||
|
|
||||||
|
//const self = emglobal.self;
|
||||||
|
//const __WORKER__ = function() {
|
||||||
|
|
||||||
// WebAssembly module cache
|
// WebAssembly module cache
|
||||||
// TODO: leaks memory even when disabled...
|
// TODO: leaks memory even when disabled...
|
||||||
@ -1328,7 +1331,6 @@ function linkSDLDZ80(step:BuildStep)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var sdcc;
|
|
||||||
function compileSDCC(step:BuildStep) {
|
function compileSDCC(step:BuildStep) {
|
||||||
|
|
||||||
gatherFiles(step, {
|
gatherFiles(step, {
|
||||||
@ -1339,7 +1341,7 @@ function compileSDCC(step:BuildStep) {
|
|||||||
var errors = [];
|
var errors = [];
|
||||||
var params = step.params;
|
var params = step.params;
|
||||||
loadNative('sdcc');
|
loadNative('sdcc');
|
||||||
var SDCC = sdcc({
|
var SDCC = emglobal.sdcc({
|
||||||
instantiateWasm: moduleInstFn('sdcc'),
|
instantiateWasm: moduleInstFn('sdcc'),
|
||||||
noInitialRun:true,
|
noInitialRun:true,
|
||||||
noFSInit:true,
|
noFSInit:true,
|
||||||
@ -1871,6 +1873,19 @@ function translateShowdown(step:BuildStep) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function runJavascript(step:BuildStep) {
|
||||||
|
var code = getWorkFileAsString(step.path);
|
||||||
|
try {
|
||||||
|
//eval(code);
|
||||||
|
var fn = new Function("'use strict';\n" + code);
|
||||||
|
var obj = {};
|
||||||
|
var out = fn.call(obj);
|
||||||
|
return { output:out||obj };
|
||||||
|
} catch (e) {
|
||||||
|
return { errors:[{line:(e.lineNumber-2)|0, msg:e.message||"Error"}] };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// http://datapipe-blackbeltsystems.com/windows/flex/asm09.html
|
// http://datapipe-blackbeltsystems.com/windows/flex/asm09.html
|
||||||
function assembleXASM6809(step:BuildStep) {
|
function assembleXASM6809(step:BuildStep) {
|
||||||
load("xasm6809");
|
load("xasm6809");
|
||||||
@ -2054,6 +2069,7 @@ var TOOLS = {
|
|||||||
'nesasm': assembleNESASM,
|
'nesasm': assembleNESASM,
|
||||||
'bataribasic': compileBatariBasic,
|
'bataribasic': compileBatariBasic,
|
||||||
'markdown': translateShowdown,
|
'markdown': translateShowdown,
|
||||||
|
'js': runJavascript,
|
||||||
}
|
}
|
||||||
|
|
||||||
var TOOL_PRELOADFS = {
|
var TOOL_PRELOADFS = {
|
||||||
@ -2188,3 +2204,5 @@ if (ENVIRONMENT_IS_WORKER) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//}();
|
||||||
|
Loading…
Reference in New Issue
Block a user