mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2024-11-29 14:51:17 +00:00
520 lines
14 KiB
Plaintext
520 lines
14 KiB
Plaintext
|
|
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:<rom>
|
|
sources:{
|
|
<path>:{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<N> = number;
|
|
interface Clocked { }
|
|
interface BusListener<N> {
|
|
recv(value : Bits<N>) : void;
|
|
}
|
|
class Bus<N> {
|
|
listeners : BusListener<N>;
|
|
send(value : Bits<N>) : 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
|