1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-06-28 03:29:35 +00:00

moved SourceFile/CodeProject into own js file

This commit is contained in:
Steven Hugg 2018-06-29 17:52:09 -06:00
parent 952dc1b312
commit 3cd04bf5df
4 changed files with 185 additions and 182 deletions

View File

@ -33,6 +33,13 @@ osXdk - A fork of the Oric SDK. The C compiler has a weird design which
emits bytecode and then uses a C preprocessor to expand the macros emits bytecode and then uses a C preprocessor to expand the macros
into 6502 assembler. into 6502 assembler.
gcc6809 - need to check this out
SmallerC - https://github.com/alexfru/SmallerC
OTHER COMPILERS
PLASMA - Language + VM, sort of like SWEET16 meets PLASMA - Language + VM, sort of like SWEET16 meets
Java. Simple, concise code base. Pretty fast too, in the same ballpark as Java. Simple, concise code base. Pretty fast too, in the same ballpark as
CC65. Focused on the Apple I/II/III family. CC65. Focused on the Apple I/II/III family.
@ -55,13 +62,6 @@ machines.
https://github.com/EtchedPixels/FUZIX/wiki https://github.com/EtchedPixels/FUZIX/wiki
gcc6809 - need to check this out
SmallerC - https://github.com/alexfru/SmallerC
OTHER COMPILERS
Java Grinder - Compile Java bytecode to microcontroller assembly. Currently Java Grinder - Compile Java bytecode to microcontroller assembly. Currently
supporting MSP430, dsPIC, 6502/6510, 68000, MIPS, TMS9900, and Z80 with supporting MSP430, dsPIC, 6502/6510, 68000, MIPS, TMS9900, and Z80 with
platforms that include Commodore 64, Sega Genesis, Atari 2600, Apple IIgs, platforms that include Commodore 64, Sega Genesis, Atari 2600, Apple IIgs,

View File

@ -234,6 +234,7 @@ ga('send', 'pageview');
<script src="src/audio.js"></script> <script src="src/audio.js"></script>
<script src="src/util.js"></script> <script src="src/util.js"></script>
<script src="src/cpu/disasm6502.js"></script> <script src="src/cpu/disasm6502.js"></script>
<script src="src/project.js"></script>
<script src="src/ui.js"></script> <script src="src/ui.js"></script>
<!-- <script src="src/audio/votrax.js"></script> --> <!-- <script src="src/audio/votrax.js"></script> -->

171
src/project.js Normal file
View File

@ -0,0 +1,171 @@
"use strict";
function SourceFile(lines, text) {
lines = lines || [];
this.lines = lines;
this.text = text;
this.offset2line = {};
this.line2offset = {};
for (var info of lines) {
if (info.offset >= 0) {
this.offset2line[info.offset] = info.line;
this.line2offset[info.line] = info.offset;
}
}
this.findLineForOffset = function(PC) {
if (this.offset2line) {
for (var i=0; i<16; i++) {
var line = this.offset2line[PC];
if (line >= 0) {
return line;
}
PC--;
}
}
return 0;
}
this.lineCount = function() { return this.line2offset.length; }
}
function CodeProject(worker, platform_id, platform, store) {
var self = this;
self.callbackResendFiles = function() { }; // TODO?
self.callbackBuildResult = function(result) { };
self.callbackBuildStatus = function(busy) { };
var pendingWorkerMessages = 0;
var tools_preloaded = {};
function preloadWorker(path) {
var tool = platform.getToolForFilename(path);
if (tool && !tools_preloaded[tool]) {
worker.postMessage({preload:tool, platform:platform_id});
tools_preloaded[tool] = true;
}
}
self.loadFiles = function(filenames, callback) {
var result = [];
function loadNext() {
var fn = filenames.shift();
if (!fn) {
callback(null, result); // TODO?
} else {
store.getItem(fn, function(err, value) {
if (err) {
callback(err);
} else if (value) {
result.push({
path:fn,
data:value
});
loadNext();
} else {
var webpath = "presets/" + platform_id + "/" + fn;
if (platform_id == 'vcs' && webpath.indexOf('.') <= 0)
webpath += ".a"; // legacy stuff
$.get( webpath, function( text ) {
console.log("GET",webpath,text.length,'bytes');
result.push({
path:fn,
data:text
});
loadNext();
}, 'text')
.fail(function() {
callback("Could not load preset " + fn);
});
}
});
}
}
loadNext(); // load first file
}
// TODO: merge with loadFiles()
function loadFileDependencies(text, callback) {
var filenames = [];
if (platform_id == 'verilog') {
var re = /^(`include|[.]include)\s+"(.+?)"/gm;
var m;
while (m = re.exec(text)) {
filenames.push(m[2]);
}
}
var result = [];
function loadNextDependency() {
var fn = filenames.shift();
if (!fn) {
callback(result);
} else {
store.getItem(fn, function(err, value) {
result.push({
filename:fn,
prefix:platform_id,
text:value // might be null, that's ok
});
loadNextDependency();
});
}
}
loadNextDependency(); // load first dependency
}
function okToSend() {
return pendingWorkerMessages++ == 0;
}
function updateFileInStore(path, text) {
// protect against accidential whole-file deletion
if (text.trim().length) {
// TODO? (originalFileID != path || text != originalText)) {
store.setItem(path, text);
}
}
self.updateFile = function(path, text, isBinary) {
updateFileInStore(path, text); // TODO: isBinary
preloadWorker(path);
if (okToSend()) {
self.callbackBuildStatus(true);
loadFileDependencies(text, function(depends) {
worker.postMessage({
code:text,
dependencies:depends,
platform:platform_id,
tool:platform.getToolForFilename(path)
});
});
}
};
function processBuildResult(data) {
if (data.listings) {
for (var lstname in data.listings) {
var lst = data.listings[lstname];
if (lst.lines)
lst.sourcefile = new SourceFile(lst.lines);
if (lst.asmlines)
lst.assemblyfile = new SourceFile(lst.asmlines, lst.text);
}
}
}
worker.onmessage = function(e) {
if (pendingWorkerMessages > 1) {
self.callbackResendFiles(); // TODO: we should handle this internally
pendingWorkerMessages = 0;
} else {
pendingWorkerMessages = 0;
}
self.callbackBuildStatus(false);
if (e.data && !e.data.unchanged) {
processBuildResult(e.data);
self.callbackBuildResult(e.data);
}
};
// TODO: parse output, listings, files, etc
}

181
src/ui.js
View File

@ -37,177 +37,9 @@ var platform; // platform object
var toolbar = $("#controls_top"); var toolbar = $("#controls_top");
var SourceFile = function(lines, text) {
lines = lines || [];
this.lines = lines;
this.text = text;
this.offset2line = {};
this.line2offset = {};
for (var info of lines) {
if (info.offset >= 0) {
this.offset2line[info.offset] = info.line;
this.line2offset[info.line] = info.offset;
}
}
this.findLineForOffset = function(PC) {
if (this.offset2line) {
for (var i=0; i<16; i++) {
var line = this.offset2line[PC];
if (line >= 0) {
return line;
}
PC--;
}
}
return 0;
}
this.lineCount = function() { return this.line2offset.length; }
}
var CodeProject = function(worker, platform_id, platform, store) {
var self = this;
self.callbackResendFiles = function() { }; // TODO?
self.callbackBuildResult = function(result) { };
self.callbackBuildStatus = function(busy) { };
var pendingWorkerMessages = 0;
var tools_preloaded = {};
function preloadWorker(path) {
var tool = platform.getToolForFilename(path);
if (tool && !tools_preloaded[tool]) {
worker.postMessage({preload:tool, platform:platform_id});
tools_preloaded[tool] = true;
}
}
self.loadFiles = function(filenames, callback) {
var result = [];
function loadNext() {
var fn = filenames.shift();
if (!fn) {
callback(null, result); // TODO?
} else {
store.getItem(fn, function(err, value) {
if (err) {
callback(err);
} else if (value) {
result.push({
path:fn,
data:value
});
loadNext();
} else {
var webpath = "presets/" + platform_id + "/" + fn;
if (platform_id == 'vcs' && webpath.indexOf('.') <= 0)
webpath += ".a"; // legacy stuff
$.get( webpath, function( text ) {
console.log("GET",webpath,text.length,'bytes');
result.push({
path:fn,
data:text
});
loadNext();
}, 'text')
.fail(function() {
callback("Could not load preset " + fn);
});
}
});
}
}
loadNext(); // load first file
}
// TODO: merge with loadFiles()
function loadFileDependencies(text, callback) {
var filenames = [];
if (platform_id == 'verilog') {
var re = /^(`include|[.]include)\s+"(.+?)"/gm;
var m;
while (m = re.exec(text)) {
filenames.push(m[2]);
}
}
var result = [];
function loadNextDependency() {
var fn = filenames.shift();
if (!fn) {
callback(result);
} else {
store.getItem(fn, function(err, value) {
result.push({
filename:fn,
prefix:platform_id,
text:value // might be null, that's ok
});
loadNextDependency();
});
}
}
loadNextDependency(); // load first dependency
}
function okToSend() {
return pendingWorkerMessages++ == 0;
}
function updateFileInStore(path, text) {
// protect against accidential whole-file deletion
if (text.trim().length) {
// TODO? (originalFileID != path || text != originalText)) {
store.setItem(path, text);
}
}
self.updateFile = function(path, text, isBinary) {
updateFileInStore(path, text); // TODO: isBinary
preloadWorker(path);
if (okToSend()) {
self.callbackBuildStatus(true);
loadFileDependencies(text, function(depends) {
worker.postMessage({
code:text,
dependencies:depends,
platform:platform_id,
tool:platform.getToolForFilename(path)
});
});
}
};
function processBuildResult(data) {
if (data.listings) {
for (var lstname in data.listings) {
var lst = data.listings[lstname];
if (lst.lines)
lst.sourcefile = new SourceFile(lst.lines);
if (lst.asmlines)
lst.assemblyfile = new SourceFile(lst.asmlines, lst.text);
}
}
}
worker.onmessage = function(e) {
if (pendingWorkerMessages > 1) {
self.callbackResendFiles(); // TODO: we should handle this internally
pendingWorkerMessages = 0;
} else {
pendingWorkerMessages = 0;
}
self.callbackBuildStatus(false);
if (e.data && !e.data.unchanged) {
processBuildResult(e.data);
self.callbackBuildResult(e.data);
}
};
// TODO: parse output, listings, files, etc
}
var current_project; var current_project;
// TODO: codemirror multiplex support?
var TOOL_TO_SOURCE_STYLE = { var TOOL_TO_SOURCE_STYLE = {
'dasm': '6502', 'dasm': '6502',
'acme': '6502', 'acme': '6502',
@ -353,13 +185,14 @@ function loadProject(preset_id) {
current_preset_entry = PRESETS[index]; current_preset_entry = PRESETS[index];
preset_id = current_preset_entry.id; preset_id = current_preset_entry.id;
} }
// load files from storage or web URLs // set current file ID
current_file_id = preset_id; current_file_id = preset_id;
// load files from storage or web URLs
current_project.loadFiles([preset_id], function(err, result) { current_project.loadFiles([preset_id], function(err, result) {
if (err) { if (err) {
alert(err); alert(err);
} else if (result && result.length) { } else if (result && result.length) {
loadCode(result[0].data); loadCode(result[0].data, preset_id); // TODO
} }
}); });
} }
@ -393,8 +226,7 @@ function _createNewFile(e) {
store.setItem(path, result, function(err, result) { store.setItem(path, result, function(err, result) {
if (err) alert(err+""); if (err) alert(err+"");
if (result) { if (result) {
qs['file'] = "local/" + filename; reloadPresetNamed("local/" + filename);
gotoNewLocation();
} }
}); });
} }
@ -1416,8 +1248,7 @@ function loadSharedFile(sharekey) {
platform_id = json['platform']; platform_id = json['platform'];
initPlatform(); initPlatform();
current_project.updateFile(newid, val.files[filename].content); current_project.updateFile(newid, val.files[filename].content);
qs['file'] = newid; reloadPresetNamed(newid);
qs['platform'] = platform_id;
delete qs['sharekey']; delete qs['sharekey'];
gotoNewLocation(); gotoNewLocation();
}).fail(function(err) { }).fail(function(err) {