From d4821453199e36816be8e79a07af0a0de89fac45 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Fri, 16 Oct 2020 06:14:40 -0500 Subject: [PATCH] setCompileOutput always called; devel-6502 platform --- doc/notes.txt | 2 ++ src/common/workertypes.ts | 8 ++++---- src/ide/project.ts | 2 +- src/ide/ui.ts | 28 +++++++++++++++---------- src/ide/views.ts | 2 +- src/machine/devel.ts | 43 +++++++++++++++++++++++++++++++++++++++ src/platform/devel.ts | 26 +++++++++++++++++++++++ src/platform/kim1.ts | 4 ---- test/cli/teststore.js | 4 +++- 9 files changed, 97 insertions(+), 22 deletions(-) create mode 100644 src/machine/devel.ts create mode 100644 src/platform/devel.ts diff --git a/doc/notes.txt b/doc/notes.txt index 25b66c4f..2589edcc 100644 --- a/doc/notes.txt +++ b/doc/notes.txt @@ -195,6 +195,8 @@ TODO: - BIOS symbols - show current tool for file +Probing +- probe log doesn't start @ reset WEB WORKER FORMAT diff --git a/src/common/workertypes.ts b/src/common/workertypes.ts index acafd50c..963a2ae8 100644 --- a/src/common/workertypes.ts +++ b/src/common/workertypes.ts @@ -101,11 +101,11 @@ export type WorkerOutput = Uint8Array | VerilogOutput; export type Segment = {name:string, start:number, size:number, last?:number, type?:string}; export interface WorkerResult { - output:WorkerOutput errors:WorkerError[] - listings:CodeListingMap - symbolmap:{[sym:string]:number} - params:{} + output?:WorkerOutput + listings?:CodeListingMap + symbolmap?:{[sym:string]:number} + params?:{} segments?:Segment[] unchanged?:boolean debuginfo?:{} // optional info diff --git a/src/ide/project.ts b/src/ide/project.ts index b97401ae..d14f69b9 100644 --- a/src/ide/project.ts +++ b/src/ide/project.ts @@ -56,8 +56,8 @@ export class CodeProject { } if (data && !data.unchanged) { this.processBuildResult(data); - if (this.callbackBuildResult) this.callbackBuildResult(data); // call with data when changed } + this.callbackBuildResult(data); } preloadWorker(path:string) { diff --git a/src/ide/ui.ts b/src/ide/ui.ts index 1b55224e..828ef9e3 100644 --- a/src/ide/ui.ts +++ b/src/ide/ui.ts @@ -179,21 +179,21 @@ function initProject() { } current_project.callbackBuildResult = (result:WorkerResult) => { setCompileOutput(result); - refreshWindowList(); }; current_project.callbackBuildStatus = (busy:boolean) => { - if (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'); + setBusyStatus(busy); }; } +function setBusyStatus(busy: boolean) { + if (busy) { + toolbar.addClass("is-busy"); + } else { + toolbar.removeClass("is-busy"); + } + $('#compile_spinner').css('visibility', busy ? 'visible' : 'hidden'); +} + function refreshWindowList() { var ul = $("#windowMenuList").empty(); var separate = false; @@ -1129,11 +1129,16 @@ function measureBuildTime() { function setCompileOutput(data: WorkerResult) { // errors? mark them in editor - if (data.errors && data.errors.length > 0) { + if (data && data.errors && data.errors.length > 0) { toolbar.addClass("has-errors"); projectWindows.setErrors(data.errors); showErrorAlert(data.errors); } 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 platform.debugSymbols = new DebugSymbols(data.symbolmap, data.debuginfo); compparams = data.params; @@ -1157,6 +1162,7 @@ function setCompileOutput(data: WorkerResult) { } } // update all windows (listings) + refreshWindowList(); projectWindows.refresh(false); } } diff --git a/src/ide/views.ts b/src/ide/views.ts index df196f54..f5502624 100644 --- a/src/ide/views.ts +++ b/src/ide/views.ts @@ -30,7 +30,7 @@ export interface ProjectView { }; // 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 VirtualList; diff --git a/src/machine/devel.ts b/src/machine/devel.ts new file mode 100644 index 00000000..60b5fc7c --- /dev/null +++ b/src/machine/devel.ts @@ -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; + } +} + diff --git a/src/platform/devel.ts b/src/platform/devel.ts new file mode 100644 index 00000000..1a70a420 --- /dev/null +++ b/src/platform/devel.ts @@ -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 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; diff --git a/src/platform/kim1.ts b/src/platform/kim1.ts index 7160a895..a5bd01e6 100644 --- a/src/platform/kim1.ts +++ b/src/platform/kim1.ts @@ -27,7 +27,3 @@ class KIM1Platform extends Base6502MachinePlatform implements Platform { /// 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`; - diff --git a/test/cli/teststore.js b/test/cli/teststore.js index 60fe786e..e9d4870e 100644 --- a/test/cli/teststore.js +++ b/test/cli/teststore.js @@ -55,6 +55,7 @@ describe('Store', function () { }; var project = new prj.CodeProject(worker, test_platform_id, platform, store); project.callbackBuildStatus = function (b) { msgs.push(b) }; + project.callbackBuildResult = function (b) { msgs.push(1) }; project.updateFile('test.a', ' lda #0'); project.setMainFile('test.a'); setTimeout(() => { @@ -79,6 +80,7 @@ describe('Store', function () { }; var project = new prj.CodeProject(worker, test_platform_id, platform, store); project.callbackBuildStatus = function (b) { msgs.push(b) }; + project.callbackBuildResult = function (b) { msgs.push(1) }; var buildresult = { listings: { test: { @@ -87,7 +89,7 @@ describe('Store', function () { } }; worker.onmessage({ data: buildresult }); - assert.deepEqual([false], msgs); + assert.deepEqual([false, 1], msgs); var lst = buildresult.listings.test; console.log(lst); assert.deepEqual({ line: 3, offset: 61440, insns: 'a9 00', iscode: true },