TODO: - NaN in cycle count for macros - debugging of scan line overflow - confuse code/data in listing - show memory locations hovering over lines - don't check against ROM signatures - DASM - macro forward refs - labels start with . omit timing info (isCode) - spaces in filename don't parse code listing (DASM, maybe more) - asm: support macro expansion - multiple breakpoints, expression breakpoints - watchpoints - MAME single step (?) - step over (line, instruction) - slowdown beam for all platforms? - show errors in list (maybe window list?) - click to go to error - what if error in include file you can't edit b/c it never appears? - online help - show self-modifying code insns left of editor - update Javatari version? (and others?) - sound mute? - $error updates source editor - online tools for music etc - text log debugging script - intro/help text for each platform - vscode/atom extension? - click to break on raster position - restructure src/ folders - debug bankswitching for funky formats - 'undefined' for bitmap replacer - requestInterrupt needs to be disabled after breakpoint? - C/asm source formatter - allow download of JSASM output - update bootstrap to 4.0 - batariBasic: proper line numbers, debugging - builds: - compiler flags for final ROM build - workermain: split build functions, better msg types - what if >1 file with same name? (local/nonlocal/directory) - what if .c and .s names collide? - maybe put stuff in examples/ dir? - error msg when #link doesn't work - warning when ROM too big - detect "libcv.h" and include library automagically? - sdcc: - can't link asm files before c files (e.g. acheader.s must be last) - figure out area names ordering - debug inline asm - live coding URL - resize memory browser, other windows when vertical div resize - markdown, verilog: can't share - https://www.crowdsupply.com/tinyfpga/tinyfpga-bx - stego shareable images (http://pico-8.wikia.com/wiki/P8PNGFileFormat) - https://makecode.com/language? - open ROM from URL? - game starts even if switched away before first load - put globals into view/controller objects - autostart audio - chrome: https://github.com/processing/p5.js-sound/issues/249 - firefox: https://support.mozilla.org/en-US/kb/block-autoplay - touch support - better undo/diff for mistakes? - ide bug/feature visualizer for sponsors - global undo/redo at checkpoints (when rom changes) - landscape mode for arcade ports - symmetric load/save state types (like in Machine) - pixel editor - persist palette/tilemap selections - more tools for editing - map editor - arbitrary nametable editing - metasprites - throw errors when bad/no refs - per-View keyboard shortcuts - parse labels - parse .incbin directives? - can't replace in hex directives - should maybe use same single-canvas editor for map + char editor - undo doesn't refresh editor - editing sometimes messes up cursor movement (CURBS) - crt0.s compiled each time? - debug highlight doesn't go away when debugging -> running - show breakpoint of PC or highest address on stack - can we highlight line instead of select? - profiler - profiler restarts emulator when paused - running profiler while replaying? grand unified replay? - click on profiler to step to position - breakpoints stop profiler from running - single-screen profiler - hide labels that aren't available, like BIOS addrs - show interrupts, other events - sometimes interleaves two different PCs? like two profilers running simultaneously? - ah, symbols persist across builds - Verilog - larger scope range, better scrolling - make scope data wrap around range - remove FPS and play controls when Verilog scope paused - when paused scope doesn't work - Safari: scope doesn't show while CRT in use (sometimes Firefox too) - verilog debugging/reloading makes it slow - why loadState() on verilog kill perf? - quantify verilog "graph iterations" - toolbar overlaps scope - CPU debugging - use $readmem for inline asm programs? - can't add control instructions b/c of split - bad error msg if >2 moduels and top module doesn't match filename - separate Scope View - single-stepping vector games makes screen fade - break on stack overflow, illegal op, bad access, BRK, etc - show in scope instead? - nes - replay doesn't work for nes (force background tile redraw, sprites messed up) - nes debug view toolbar - support NES_HEADER_16K? - NES crt should mark raster pos when debugging - OAMDMA in profiler? (haltCycles) - typed arrays don't serialize? - JSNES - doesn't support hiding >8 sprites - doesn't do sprite zero test right - doesn't do clip right - doesn't do b/w tint - vcs - sometimes still plays when paused on FF - vcs: INPTx needs to be added to control state - vcs: break on # of lines changed (maybe using getRasterPosition?) - chrome looks blurry on vcs - VCS asm game library - VCS skips step on lsr/lsr after run to line - better VCS single stepping, maybe also listings - upload multiple files/zip file to subdirectory - allow "include graphics.asm" instead of "include project/graphics.asm" - convert more stuff to Promises - don't have to include firebase always? - squelch error msgs? - test offline? (if window.firebase) - Github - platform_id/repo.platform mismatch (can't leave repository) - handle overwrite logic - what to do about included files? - can published files retain path? - what if import interrupted and partial files? - CORS for some blobs? - don't import useless files - support projects with subdirectories, file list? - switching platform of a repo? - make sure to flatten subdirs - re-publish repo (bug: doesn't put all files in local repo after publishing) - allow text/binary change - importing from subtree commits to root anyway - publishing Markdown file loads default file? - keyboard shortcuts - ctrl+alt+l on ubuntu locks screen - alt-D doesn't work anymore - facade/kbd shortcuts for emulators, focus - cookie - list of stuff for policy - popup - convert binary to hex stmts - "suggestions" (vblank overrun, variable # scanlines, etc) - SMS - can't step back twice? - compiler bug in chase - "shared" in URL doesn't work, leave in URL? (also importURL) - 6502 - KIL stops debugger - TypeError: null is not an object (evaluating 'n.destination') https://8bitworkshop.com/v3.4.1/javatari.js/release/javatari/javatari.js (32:443651) Safari 12.1.2 - Safari: doesn't send good exception reasons ("undefined") - probably XMLHttpRequest.timeout (https://github.com/getsentry/sentry-javascript/issues/2210) - C64 - debugging at reset - gotoxy goes to $EA24 (KIL) from PLOT (kplot.s) missing UPDCRAMPTR - emu doesn't reset properly (after gotoxy() BIOS call) - disk image support - https://github.com/cc65/cc65/issues/946 - sample buffer skips (need to sync w/ vsync) - upgrade to ES2020? - https://github.com/microsoft/TypeScript/issues/16577 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules - need Edge 79+ - no import in workers - copy to gen/ directory (allowJs is weird) - can we debug first frame via replay? - ca65 line numbers are not aligned with source code - segments not read properly - Debug Browser - hex viewer - show 16/32 typed arrays WEB WORKER FORMAT {code,platform,tool,dependencies} {preload} new: {updates,buildsteps} [{filepath,platform,tool}] implicit rules - push/shift build steps - preprocessor, compile, assemble, link - access to intermediate files only build files that have changed build options BUILD PROJECT local/foo.project/*.* build all files in project send update for dependencies at startup (single file version) should be able to change file w/o reloading (Not platform tho) pulldown selects file in project, or goes back to parent gotta preserve editor windows for each one - window list make source/disasm window visible when debugging gutter info/errors in all files UI REFACTOR editor debugger disasm view memory profile errors separate into files window methods: - set - mode - get - changes - cursorActivity (inspect) - gutters (setCompileOutput) - current line / gutter marker (setCurrentLine / clearCurrentLine) - source map - global symbols - pixel editor / find comment (openBitmapEditorAtCursor) - update debug window (200 ms) - inspect variable file store mirrors that on worker worker result: { output: sources:{ :{lines, asmlines, listing} } } add file to errors http://www.playvectrex.com/designit/chrissalo/vectordisplay.htm http://oldies.malban.de/secondvectrex/index.htm PIXEL EDITOR everything is an editor back/forward propogation encoded <-> raw + spec + palette(s) <-> full tilemap <-> selected tile/sprite/metasprite need references panes: source code, metadata tree, graphics panes decoded info: - CHR tiles - palettes - maps/rooms - metasprites - metatiles - sprite data (williams etc) store in intermediate single file or embed in C/ASM? we'd then have to generate C/ASM probably automatically intermediate file could still be edited switch between hex/graphic editor? (palettes should edit via hex) final display types: number, color, sprite, etc CHR editor has palette selector, obj selector individual objects in single file or multiple files? RLE compression Types - byte - RGBA color - structured object - metasprite - metatile - level actor - bitmap - array of stuff, array can have a shape (width,height) like numpy Mappers can refer to multiple objs Slice (window) of array for selections AssetEditorView - scan files for assets - build hierarchical view of assets - expand/collapse - create editor upon expansion - double-click to source file Assets come from: - chr files - bitmap data in files - structured data (palette, sprites, metasprites, levels, etc) - think about new comment format, platform-specific types Programmatic Asset Language - load PNG, draw image, or generate bitmap font - split into images - paletteize - fit into tileset/spriteset - NES: 8x8 or 8x16 tiles - 7800: 256xN slice - VCS: 24xN playfield, 8xN sprite, 32xN big sprite - generate data file (asm/c/bin) - generate char mapping - tile generator (makechr-like) - metasprites too - RLE compression - check constraints --- Github Support Import Export Login Pull Push Git metadata kept in local storage Converting from NESASM to DASM - asl a -> asl - subroutine keyword on labels - [zp],y to (zp),y - LOW(x) and HIGH(x) to <() and >() - .db to .byte, .dw to .word - use NES_HEADER macros - no .bank Cross platform NES/SMS/GG library - use CHR RAM - create flipped tiles/sprites - create alternate palette tiles - metatiles - cross platform music/sound - scrolling - row/column mask - no nametable mirroring in SMS - 256x240 vs 256x192 Emulator Lib - move getPresets() (into presets/ dir?) - CPU interface - execCycle(), execInsn() - fix/unfix PC - interrupt - generic raster scanline platform - PlatformRunner - handles rewind, intra-frame breakpoint, debugging - profiling log, exec/read/write/intr (for each bus?) - expose video, audio, controller interfaces - new debugging info - memory map interface - "About" metadata - auto load/save state? - handle legacy - VCS - NES - MAME Markdown (showdown) interface - add code patches to files - cursor shows current state/errors (must map markdown->src lines) - show preview emulator at each step (play button? run when viewed?) DOCUMENTATION memory map BIOS routines cc65 standard libs cc65 headers example headers (presets/*/*.h) libcv headers (src/worker/lib) ASM includes NETPLAY runs alongside of emulator, doesn't modify controls (just state) when controls change: player sends control inputs + frame# add latency so clients more often are in sync if miss latency window, client syncs state (moves forward a few frames?) state checksum? socket.io X86 https://github.com/freebasic/fbc GW-BASIC http://www.grifo.com/SOFT/Pacific/uk_pacific.html http://www.cpm.z80.de/small_c.html https://github.com/open-watcom Free Pascal https://bellard.org/tcc/ https://wiki.osdev.org/Smaller_C https://yasm.tortall.net/ https://wiki.osdev.org/Tool_Comparison COMPONENT EMULATION Emulate discrete chips - verilog - js - wasm? (overhead?) Block diagram level Buses Insn/cycle timing Pos/neg clock edge Timers Polling vs. callbacks (https://github.com/floooh/chips) - callbacks might only affect devices internally, until next cycle CRT simulator Move leaf nodes to workers (sound chips) CPU opcode-step switch: https://floooh.github.io/2019/12/13/cycle-stepped-6502.html - macros are cool! Inspect bus edges and internal state type Bits = number; interface Clocked { } interface BusListener { recv(value : Bits) : void; } class Bus { listeners : BusListener; send(value : Bits) : void { } } function bus(bits : number) { return function( target: any, propertyKey: string, descriptor: PropertyDescriptor ) { //descriptor.configurable = value; }; } class M6502_T { IR : Bits<16>; /* internal instruction register */ addr : Bus<16>; data : Bus<8>; @bus(16) address : Bus<16>; } STATE REWIND in Platform: advance?(novideo? : boolean) : number; advanceFrameClock?(trap:DebugCondition, step:number) : number; in devices: advanceFrame(trap:TrapCondition) : number; advanceClock() : void; advanceInsn() : number; Should call trap() every cycle or insn of frame, or exit when returns true?