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 - step over (line, instruction) - slowdown beam for all platforms? - intro/help text for each platform - 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 - vscode/atom extension? - click to break on raster position - 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 - Audio doesn't work if clock != default - 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 - upgrade to 4.1 for Supercharger format - 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? - better text/binary detection (e.g. 0xa9 copyright) - going into repo chooses wrong file if republished with different main - keyboard shortcuts - ctrl+alt+l on ubuntu locks screen - alt-D doesn't work anymore - facade/kbd shortcuts for emulators, focus - maybe eat key events? ("'" messes things up) - 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 - disk image support - https://github.com/cc65/cc65/issues/946 - player 2 joystick and keyboard conflict - problems with cgetc() - 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) - ca65 line numbers are not aligned with source code - segments not read properly - Debug Browser - more stuff like 7800 display lists - don't include start/end line on platforms w/o raster timing - BIOS symbols - show current tool for file 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 - MAME - debugging? - kbd instructions don't work 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>; } Optimizations - ordered/delayed assignments - skip unused exprs - opcode -> fn table - bus protocols -> functions - state -> lookup tables or switch statements - vec[] -> bitmask - multiclock execution? 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? BETTER DEBUGGING Need to mark start/end columns, not just line number Know if we are actively debugging or trap occurred isRunning() = stopped, running, waiting, debugging... Showing running PC may be distracting, maybe lines visited? Don't grab cursor focus when trap occurs (how do we know?) Use tick() and refresh(), not callbacks Show current datum when using READ Use https://codemirror.net/doc/manual.html#markText Reset doesn't break @ start unless debugging tools expanded