From f18365cf9f2d05a3dc5a51295dc2bf38f8f7c393 Mon Sep 17 00:00:00 2001 From: Steven Hugg Date: Fri, 3 Nov 2023 22:57:16 -0500 Subject: [PATCH] remote: updates for multiple linked files, c64 samples --- README.md | 3 ++- package.json | 2 +- presets/c64/common.c | 6 ++---- presets/c64/common.h | 16 +++++++++++++++- presets/c64/sprite_collision.c | 3 ++- presets/c64/sprites.c | 7 +++---- src/ide/project.ts | 3 ++- src/worker/server/buildenv.ts | 19 ++++++++++++++----- src/worker/server/server.ts | 11 +++++++++++ src/worker/tools/remote.ts | 1 + 10 files changed, 53 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 2431715b..54c80074 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ npm run build To use GitHub integration locally, download the Firebase config file, e.g. https://8bitworkshop.com/v[version]/config.js -### Start Server +### Start Local Web Server Start a web server on http://localhost:8000/ while TypeScript compiles in the background: @@ -69,6 +69,7 @@ The IDE uses custom forks for many of these, found at https://github.com/sehugg? * http://www.twitchasylum.com/jsvecx/ * https://github.com/curiousdannii/ifvms.js/ * https://6502ts.github.io/typedoc/stellerator-embedded/ +* https://github.com/yhzmr442/jspce ### Compilers diff --git a/package.json b/package.json index 308e13ea..1f75d349 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,7 @@ "build": "make prepare", "test": "npm run test-node", "tsbuild": "tsc --build tsconfig.json", - "esbuild": "npm run esbuild-worker && npm run esbuild-ui", + "esbuild": "npm run esbuild-worker && npm run esbuild-ui && npm run esbuild-server", "esbuild-clean": "rm -f ./gen/*.*", "esbuild-server": "esbuild src/worker/server/server.ts --platform=node --bundle --sourcemap --target=es2020 --outfile=./gen/server/server.js", "esbuild-worker": "esbuild src/worker/workermain.ts --bundle --sourcemap --target=es2017 --outfile=./gen/worker/bundle.js", diff --git a/presets/c64/common.c b/presets/c64/common.c index e88504bc..a8810a99 100644 --- a/presets/c64/common.c +++ b/presets/c64/common.c @@ -5,10 +5,6 @@ void raster_wait(byte line) { while (VIC.rasterline < line) ; } -void wait_vblank(void) { - raster_wait(255); -} - static byte VIC_BANK_PAGE[4] = { 0xc0, 0x80, 0x40, 0x00 }; @@ -21,8 +17,10 @@ char* get_screen_memory() { return ((VIC.addr & 0xf0) << 6) + get_vic_bank_start(); } +#ifdef __CC65__ char __fastcall__ poll_keyboard() { asm("jmp $f142"); return __A__; } +#endif diff --git a/presets/c64/common.h b/presets/c64/common.h index f8c3ee26..a0a63e17 100644 --- a/presets/c64/common.h +++ b/presets/c64/common.h @@ -1,14 +1,17 @@ #ifndef _COMMON_H #define _COMMON_H -#include #include #include #include #include #include #include + +#ifdef __CC65__ +#include #include +#endif typedef uint8_t byte; // 8-bit unsigned typedef int8_t sbyte; // 8-bit signed @@ -74,7 +77,18 @@ char* get_vic_bank_start(); // get current screen memory address char* get_screen_memory(); +#ifdef __CC65__ // return key in buffer, or 0 if none (BIOS call) char __fastcall__ poll_keyboard(); +#endif + +#ifndef __CC65__ +inline void clrscr() { + __asm__ volatile ("jsr $E544" : : : "a","x","y"); // regs clobbered +} +inline void waitvsync() { + raster_wait(255); +} +#endif #endif diff --git a/presets/c64/sprite_collision.c b/presets/c64/sprite_collision.c index a0ff5e99..1af2c46b 100644 --- a/presets/c64/sprite_collision.c +++ b/presets/c64/sprite_collision.c @@ -96,7 +96,7 @@ void iterate_game(void) { collide_sprites(spr_coll); } -void main(void) { +int main(void) { clrscr(); VIC.bordercolor = 0; @@ -117,5 +117,6 @@ void main(void) { while (1) { iterate_game(); } + return 0; } diff --git a/presets/c64/sprites.c b/presets/c64/sprites.c index 96c31802..9b16bfa5 100644 --- a/presets/c64/sprites.c +++ b/presets/c64/sprites.c @@ -10,8 +10,8 @@ void sprite_clear(void) { void sprite_update(byte* screenmem) { memcpy(screenmem + 0x3f8, sprshad.spr_shapes, 8); - memcpy(VIC.spr_pos, sprshad.spr_pos, 16); - memcpy(VIC.spr_color, sprshad.spr_color, 8); + memcpy((void*)VIC.spr_pos, sprshad.spr_pos, 16); + memcpy((void*)VIC.spr_color, sprshad.spr_color, 8); VIC.spr_ena = sprshad.spr_ena; VIC.spr_hi_x = sprshad.spr_hi_x; VIC.spr_exp_x = sprshad.spr_exp_x; @@ -63,7 +63,6 @@ byte sprite_get_closest_collision(byte i, byte spr_coll) { } } } - } else { - return 0xff; } + return 0xff; } diff --git a/src/ide/project.ts b/src/ide/project.ts index c9451257..1ad0e5c3 100644 --- a/src/ide/project.ts +++ b/src/ide/project.ts @@ -276,7 +276,8 @@ export class CodeProject { msg.updates.push({path:mainfilename, data:maintext}); this.filename2path[mainfilename] = this.mainPath; for (var dep of depends) { - if (!dep.link) { + // remote tools send both includes and linked files in one build step + if (!dep.link || this.remoteTool) { msg.updates.push({path:dep.filename, data:dep.data}); depfiles.push(dep.filename); } diff --git a/src/worker/server/buildenv.ts b/src/worker/server/buildenv.ts index a94d70fd..9941c248 100644 --- a/src/worker/server/buildenv.ts +++ b/src/worker/server/buildenv.ts @@ -11,9 +11,9 @@ import { parseObjDumpListing, parseObjDumpSymbolTable } from './clang'; const LLVM_MOS_TOOL: ServerBuildTool = { name: 'llvm-mos', version: '', - extensions: ['.c'], + extensions: ['.c', '.cpp', '.s'], archs: ['6502'], - platforms: ['atari8', 'c64', 'nes'], + platforms: ['atari8', 'c64', 'nes', 'pce', 'vcs'], platform_configs: { default: { binpath: 'llvm-mos/bin', @@ -27,13 +27,19 @@ const LLVM_MOS_TOOL: ServerBuildTool = { }, c64: { command: 'mos-c64-clang', + libargs: ['-D', '__C64__'] }, atari8: { command: 'mos-atari8-clang', + libargs: ['-D', '__ATARI__'] }, nes: { command: 'mos-nes-nrom-clang', // TODO - libargs: ['-lneslib'] + libargs: ['-lneslib', '-lfamitone2'] + }, + pce: { + command: 'mos-pce-clang', // TODO + libargs: ['-lpce', '-D', '__PCE__'] }, } } @@ -127,8 +133,11 @@ export class ServerBuildEnv { let infiles = []; for (let i = 0; i < step.files.length; i++) { let f = step.files[i]; - if (f.endsWith(this.tool.extensions[0])) { - infiles.push(path.join(this.sessionDir, f)); + for (let ext of this.tool.extensions) { + if (f.endsWith(ext)) { + infiles.push(path.join(this.sessionDir, f)); + break; + } } } for (let i = 0; i < args.length; i++) { diff --git a/src/worker/server/server.ts b/src/worker/server/server.ts index fd6720b3..ecccc373 100644 --- a/src/worker/server/server.ts +++ b/src/worker/server/server.ts @@ -6,6 +6,17 @@ import cors from 'cors'; import { WorkerBuildStep, WorkerFileUpdate } from '../../common/workertypes'; import { ServerBuildEnv, TOOLS, findBestTool } from './buildenv'; +/* +## Tool Server (not yet used) + +```sh +npm run server +xattr -dr com.apple.quarantine llvm-mos/bin/* # macOS only +curl http://localhost:3009/test +go to: http://localhost:8000/?platform=c64&file=hello.c&tool=llvm-mos +``` +*/ + //////////////////// const app = express(); diff --git a/src/worker/tools/remote.ts b/src/worker/tools/remote.ts index 833f9f48..4e16b774 100644 --- a/src/worker/tools/remote.ts +++ b/src/worker/tools/remote.ts @@ -8,6 +8,7 @@ const REMOTE_URL = "http://localhost:3009/build"; // create random UID const sessionID = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15); +// TODO: #include links but #link doesnt link export async function buildRemote(step: BuildStep): Promise { gatherFiles(step); // TODO? var binpath = "a.out"; // TODO?