setCompileOutput always called; devel-6502 platform
This commit is contained in:
parent
67bf6c7310
commit
d482145319
|
@ -195,6 +195,8 @@ TODO:
|
||||||
- BIOS symbols
|
- BIOS symbols
|
||||||
- show current tool for file
|
- show current tool for file
|
||||||
|
|
||||||
|
Probing
|
||||||
|
- probe log doesn't start @ reset
|
||||||
|
|
||||||
|
|
||||||
WEB WORKER FORMAT
|
WEB WORKER FORMAT
|
||||||
|
|
|
@ -101,11 +101,11 @@ export type WorkerOutput = Uint8Array | VerilogOutput;
|
||||||
export type Segment = {name:string, start:number, size:number, last?:number, type?:string};
|
export type Segment = {name:string, start:number, size:number, last?:number, type?:string};
|
||||||
|
|
||||||
export interface WorkerResult {
|
export interface WorkerResult {
|
||||||
output:WorkerOutput
|
|
||||||
errors:WorkerError[]
|
errors:WorkerError[]
|
||||||
listings:CodeListingMap
|
output?:WorkerOutput
|
||||||
symbolmap:{[sym:string]:number}
|
listings?:CodeListingMap
|
||||||
params:{}
|
symbolmap?:{[sym:string]:number}
|
||||||
|
params?:{}
|
||||||
segments?:Segment[]
|
segments?:Segment[]
|
||||||
unchanged?:boolean
|
unchanged?:boolean
|
||||||
debuginfo?:{} // optional info
|
debuginfo?:{} // optional info
|
||||||
|
|
|
@ -56,8 +56,8 @@ export class CodeProject {
|
||||||
}
|
}
|
||||||
if (data && !data.unchanged) {
|
if (data && !data.unchanged) {
|
||||||
this.processBuildResult(data);
|
this.processBuildResult(data);
|
||||||
if (this.callbackBuildResult) this.callbackBuildResult(data); // call with data when changed
|
|
||||||
}
|
}
|
||||||
|
this.callbackBuildResult(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
preloadWorker(path:string) {
|
preloadWorker(path:string) {
|
||||||
|
|
|
@ -179,21 +179,21 @@ function initProject() {
|
||||||
}
|
}
|
||||||
current_project.callbackBuildResult = (result:WorkerResult) => {
|
current_project.callbackBuildResult = (result:WorkerResult) => {
|
||||||
setCompileOutput(result);
|
setCompileOutput(result);
|
||||||
refreshWindowList();
|
|
||||||
};
|
};
|
||||||
current_project.callbackBuildStatus = (busy:boolean) => {
|
current_project.callbackBuildStatus = (busy:boolean) => {
|
||||||
if (busy) {
|
setBusyStatus(busy);
|
||||||
toolbar.addClass("is-busy");
|
|
||||||
} else {
|
|
||||||
toolbar.removeClass("is-busy");
|
|
||||||
toolbar.removeClass("has-errors"); // may be added in next callback
|
|
||||||
projectWindows.setErrors(null);
|
|
||||||
hideErrorAlerts();
|
|
||||||
}
|
|
||||||
$('#compile_spinner').css('visibility', busy ? 'visible' : 'hidden');
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setBusyStatus(busy: boolean) {
|
||||||
|
if (busy) {
|
||||||
|
toolbar.addClass("is-busy");
|
||||||
|
} else {
|
||||||
|
toolbar.removeClass("is-busy");
|
||||||
|
}
|
||||||
|
$('#compile_spinner').css('visibility', busy ? 'visible' : 'hidden');
|
||||||
|
}
|
||||||
|
|
||||||
function refreshWindowList() {
|
function refreshWindowList() {
|
||||||
var ul = $("#windowMenuList").empty();
|
var ul = $("#windowMenuList").empty();
|
||||||
var separate = false;
|
var separate = false;
|
||||||
|
@ -1129,11 +1129,16 @@ function measureBuildTime() {
|
||||||
|
|
||||||
function setCompileOutput(data: WorkerResult) {
|
function setCompileOutput(data: WorkerResult) {
|
||||||
// errors? mark them in editor
|
// errors? mark them in editor
|
||||||
if (data.errors && data.errors.length > 0) {
|
if (data && data.errors && data.errors.length > 0) {
|
||||||
toolbar.addClass("has-errors");
|
toolbar.addClass("has-errors");
|
||||||
projectWindows.setErrors(data.errors);
|
projectWindows.setErrors(data.errors);
|
||||||
showErrorAlert(data.errors);
|
showErrorAlert(data.errors);
|
||||||
} else {
|
} else {
|
||||||
|
toolbar.removeClass("has-errors"); // may be added in next callback
|
||||||
|
projectWindows.setErrors(null);
|
||||||
|
hideErrorAlerts();
|
||||||
|
// exit if compile output unchanged
|
||||||
|
if (data == null || data.unchanged) return;
|
||||||
// process symbol map
|
// process symbol map
|
||||||
platform.debugSymbols = new DebugSymbols(data.symbolmap, data.debuginfo);
|
platform.debugSymbols = new DebugSymbols(data.symbolmap, data.debuginfo);
|
||||||
compparams = data.params;
|
compparams = data.params;
|
||||||
|
@ -1157,6 +1162,7 @@ function setCompileOutput(data: WorkerResult) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// update all windows (listings)
|
// update all windows (listings)
|
||||||
|
refreshWindowList();
|
||||||
projectWindows.refresh(false);
|
projectWindows.refresh(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ export interface ProjectView {
|
||||||
};
|
};
|
||||||
|
|
||||||
// detect mobile (https://stackoverflow.com/questions/3514784/what-is-the-best-way-to-detect-a-mobile-device)
|
// detect mobile (https://stackoverflow.com/questions/3514784/what-is-the-best-way-to-detect-a-mobile-device)
|
||||||
export var isMobileDevice = 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;
|
declare var VirtualList;
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
|
||||||
|
import { MOS6502 } from "../common/cpu/MOS6502";
|
||||||
|
import { BasicHeadlessMachine } from "../common/devices";
|
||||||
|
import { padBytes, newAddressDecoder } from "../common/emu"; // TODO
|
||||||
|
|
||||||
|
export class Devel6502 extends BasicHeadlessMachine {
|
||||||
|
cpuFrequency = 1000000;
|
||||||
|
defaultROMSize = 0x8000;
|
||||||
|
|
||||||
|
cpu = new MOS6502();
|
||||||
|
ram = new Uint8Array(0x4000);
|
||||||
|
rom : Uint8Array;
|
||||||
|
|
||||||
|
digits = [];
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.connectCPUMemoryBus(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
read = newAddressDecoder([
|
||||||
|
[0x0000, 0x3fff, 0x3fff, (a) => { return this.ram[a]; }],
|
||||||
|
[0x8000, 0xffff, 0x7fff, (a) => { return this.rom && this.rom[a]; }],
|
||||||
|
]);
|
||||||
|
|
||||||
|
write = newAddressDecoder([
|
||||||
|
[0x0000, 0x3fff, 0x3fff, (a,v) => { this.ram[a] = v; }],
|
||||||
|
]);
|
||||||
|
|
||||||
|
readConst(a:number) : number {
|
||||||
|
return this.read(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
advanceFrame(trap) : number {
|
||||||
|
var clock = 0;
|
||||||
|
while (clock < this.cpuFrequency/60) {
|
||||||
|
if (trap && trap()) break;
|
||||||
|
clock += this.advanceCPU();
|
||||||
|
}
|
||||||
|
return clock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
import { Platform, getOpcodeMetadata_6502, getToolForFilename_6502 } from "../common/baseplatform";
|
||||||
|
import { PLATFORMS } from "../common/emu";
|
||||||
|
import { Devel6502 } from "../machine/devel";
|
||||||
|
import { Base6502MachinePlatform } from "../common/baseplatform";
|
||||||
|
|
||||||
|
var DEVEL_6502_PRESETS = [
|
||||||
|
{id:'hello.dasm', name:'Hello World (ASM)'},
|
||||||
|
];
|
||||||
|
|
||||||
|
class Devel6502Platform extends Base6502MachinePlatform<Devel6502> implements Platform {
|
||||||
|
|
||||||
|
newMachine() { return new Devel6502(); }
|
||||||
|
getPresets() { return DEVEL_6502_PRESETS; }
|
||||||
|
getDefaultExtension() { return ".dasm"; };
|
||||||
|
readAddress(a) { return this.machine.readConst(a); }
|
||||||
|
|
||||||
|
getMemoryMap = function() { return { main:[
|
||||||
|
{name:'RAM', start:0x0000,size:0x4000,type:'ram'},
|
||||||
|
{name:'ROM', start:0x8000,size:0x8000,type:'rom'},
|
||||||
|
] } };
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
|
||||||
|
PLATFORMS['devel-6502'] = Devel6502Platform;
|
|
@ -27,7 +27,3 @@ class KIM1Platform extends Base6502MachinePlatform<KIM1> implements Platform {
|
||||||
///
|
///
|
||||||
|
|
||||||
PLATFORMS['kim1'] = KIM1Platform;
|
PLATFORMS['kim1'] = KIM1Platform;
|
||||||
|
|
||||||
// https://github.com/jefftranter/6502/blob/master/asm/KIM-1/ROMs/kim.s
|
|
||||||
const KIM1_BIOS_LZG = `TFpHAAAIAAAABY3ivWkoAQsOJSiprY3sFyAyGaknjUIXqb+NQxeiZKkWIHoZytD4qSoo4a35FyBhGa31FyBeGa32KKPtF833F63uF+34F5AkqS8lXeclnegooqICqQQOBTgAhfqF+0xPHCDsJXAg6hlMMxgPGamNDgVrTI3vF61xGI3wF61yGI3xF6kHDgJ8/43pFyBBGk7pFw3pFyUErekXyRbQ7aIKICQaJQHfytD2JUIq8AYlBtHw8yDzGc35F/ANrfkXyQAlDf/wF9CcJQ0gTBmN7RcOBQHuF0z4GCXEKKSiAiV9L/AUIAAa0CPK0PElDEzsFw4CnCWhzecX0Awo4ugX0ASpAPACqf8OBcWt9ReN7Ret9heN7hepYI3vF6kAjecXjegXYKgYbSUB5xet6BdpACUJmGAgTBmoSigBIG8ZmChiYCkPyQoYMAJpB2kwjukXjOoXoAggnhlKsAYooUyRGSDEKEKI0Ouu6Res6hdgoglILEcXEPupfo1EF6mnjUIXDgkHDiKqytDfaGCiBg4FHsMODB4lhw4HHu7tF9AD7u4XYCAkGiAAGiikYMkwMB7JRxAayUAwAxhpCSooAaQEKi7pF4jQ+a3pF6AAYMhgjusXoggOIovqFw3qF43qF8rQ8a3qFypKrusXYCxCFxD7rUYXoP+MKIEUiND9JQow+zjtDgYLByULSf8pgGAOSFsOBJeaDgymJYclW0x1Gv8oHygfKB4oGWsaKCKF82iF8WiF74X6aIXwhfuE9Ib1uobyIIgeTE8cbPoXbP4Xov+aJYmp/43zF6kBLEAX0Bkw+an8GGkBkAPu8xesQBcQ843yDkIbah4gjB4l2x4gLx6iCiAxHkyvHakAhfiF+SBaHskB8AYgrB9M2x0gGR/Q0yWi8MwlBPD0KILvIGofyRUQu8kU8ETJEPAsyREoYRLwL8kT8DEKKAGF/KIEpP/QCrH6BvwqkfpMwxwKJvom+8rQ6vAIqQHQAqkAhf8OgmZjHyihTMgdpe+F+qXwDoR6Wh7JO9D5JRr3hfYgnR+qIJEfKMGF+yjl+ijhivAPJQORJUMlO8rQ8uglB8X20BcowvfQE4rQuaIMDkOaDgLPTxwlD6IR0O4OBNYoofaF9yAvHqk7IKAepfrN9xel+w6iGRipACA7HiDMHyAeHqX2JQOl9yiBTGQcqRiqJVGRJVGgALH6DgUFDgJy8A4IIeb40ALm+UxIHSV6Lx4lJCCeDgcnng4CQCUqTKwdpvKapftIpfpIpfFIpvWk9KXzQMkg8MrJf/AbyQ3w28kK8BzJLvAmyUfw1clR8ArJTPAJTGocDiIgQh1M5xw4pfrpAYX6sALG+0ysHaAApfiR+kzCHaX7DgSOpQ4FlmCiB73VHyCgHsoQ92CF/A6D00wepfwogw6K1UygHob9oggORAQiMPkg1B4g6x6tQBcpgEb+Bf6F/iUJytDvJQym/aX+KkpgogGG/6IAjkEXoj+OQxeiB45CF9h4YKkghf6G/SUkrUIXKf4OInLUHqIIJYVG/mkAJcnK0O4lCgkBJcam/WCt8xeN9Bet8hc46QGwA870F6z0FxDzDggPSk70F5DjCYCw4KADogGp/45CF+joLUAXiND1oAeMQhcJgEn/YA4iXIX5qX+NQReiCaADufgADgPmSB8lAikPKOGI0OslMakAJRlM/h6E/Ki55x+gAIxAFyUOjUAXoH+I0P3o6KT8YOb60ALm+2CiIaABIAIf0AfgJ9D1qRVgoP8KsAPIEPqKKQ9KqpgQAxhpB8rQ+mAYZfeF96X2aQCF9mAgWh4grB8opKX4DqKkG8lHEBcOqaSgBCom+Cb5iA7iZWCl+IX6pfmF+2AAKAMKDU1JSyATUlJFIBO/htvP5u39h//v9/y53vnx////HBwiHB8c`;
|
|
||||||
|
|
||||||
|
|
|
@ -55,6 +55,7 @@ describe('Store', function () {
|
||||||
};
|
};
|
||||||
var project = new prj.CodeProject(worker, test_platform_id, platform, store);
|
var project = new prj.CodeProject(worker, test_platform_id, platform, store);
|
||||||
project.callbackBuildStatus = function (b) { msgs.push(b) };
|
project.callbackBuildStatus = function (b) { msgs.push(b) };
|
||||||
|
project.callbackBuildResult = function (b) { msgs.push(1) };
|
||||||
project.updateFile('test.a', ' lda #0');
|
project.updateFile('test.a', ' lda #0');
|
||||||
project.setMainFile('test.a');
|
project.setMainFile('test.a');
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
@ -79,6 +80,7 @@ describe('Store', function () {
|
||||||
};
|
};
|
||||||
var project = new prj.CodeProject(worker, test_platform_id, platform, store);
|
var project = new prj.CodeProject(worker, test_platform_id, platform, store);
|
||||||
project.callbackBuildStatus = function (b) { msgs.push(b) };
|
project.callbackBuildStatus = function (b) { msgs.push(b) };
|
||||||
|
project.callbackBuildResult = function (b) { msgs.push(1) };
|
||||||
var buildresult = {
|
var buildresult = {
|
||||||
listings: {
|
listings: {
|
||||||
test: {
|
test: {
|
||||||
|
@ -87,7 +89,7 @@ describe('Store', function () {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
worker.onmessage({ data: buildresult });
|
worker.onmessage({ data: buildresult });
|
||||||
assert.deepEqual([false], msgs);
|
assert.deepEqual([false, 1], msgs);
|
||||||
var lst = buildresult.listings.test;
|
var lst = buildresult.listings.test;
|
||||||
console.log(lst);
|
console.log(lst);
|
||||||
assert.deepEqual({ line: 3, offset: 61440, insns: 'a9 00', iscode: true },
|
assert.deepEqual({ line: 3, offset: 61440, insns: 'a9 00', iscode: true },
|
||||||
|
|
Loading…
Reference in New Issue