8bitworkshop/gen/vcs-6HSX4MBZ.js.map

8 lines
29 KiB
Plaintext

{
"version": 3,
"sources": ["../src/platform/vcs.ts"],
"sourcesContent": ["\nimport { Platform, BasePlatform, cpuStateToLongString_6502, dumpStackToString, DisasmLine, CpuState, Preset } from \"../common/baseplatform\";\nimport { PLATFORMS, dumpRAM, EmuHalt, __createCanvas, drawCrosshair } from \"../common/emu\";\nimport { hex, loadScript, lpad, tobin } from \"../common/util\";\nimport { CodeAnalyzer_vcs } from \"../common/analysis\";\nimport { disassemble6502 } from \"../common/cpu/disasm6502\";\nimport { ProbeRecorder } from \"../common/probe\";\nimport { NullProbe, ProbeAll } from \"../common/devices\";\nimport { BaseMAME6502Platform } from \"../common/mameplatform\";\n\ndeclare var Javatari : any;\ndeclare var jt : any; // 6502\n\nconst VCS_PRESETS : Preset[] = [\n {id:'examples/hello.a', chapter:4, name:'Hello 6502 and TIA'},\n {id:'examples/vsync.a', chapter:5, name:'Painting on the CRT', title:'Color Bars'},\n {id:'examples/playfield.a', chapter:6, name:'Playfield Graphics'},\n {id:'examples/sprite.a', chapter:7, name:'Players and Sprites'},\n {id:'examples/colorsprites.a', chapter:8, name:'Color Sprites'},\n {id:'examples/timing2.a', chapter:9, name:'Fine Positioning', title:'Fine Position'},\n {id:'examples/missiles.a', chapter:10, name:'Player/Missile Graphics', title:'Player/Missile'},\n {id:'examples/sethorizpos.a', chapter:11, name:'SetHorizPos Routine'},\n {id:'examples/piatimer.a', chapter:12, name:'PIA Timer'},\n {id:'examples/controls.a', chapter:13, name:'Joysticks'},\n {id:'examples/complexscene.a', chapter:15, name:'Complex Scene I'},\n {id:'examples/complexscene2.a', chapter:16, name:'Complex Scene II'},\n {id:'examples/scoreboard.a', chapter:18, name:'Scoreboard'},\n {id:'examples/collisions.a', chapter:19, name:'Collisions'},\n {id:'examples/bitmap.a', chapter:20, name:'Async Playfield: Bitmap', title:'Async PF Bitmap'},\n {id:'examples/brickgame.a', chapter:21, name:'Async Playfield: Bricks', title:'Async PF Bricks'},\n// {id:'examples/multisprite1.a', chapter:8, name:'Sprite Kernel'},\n {id:'examples/bigsprite.a', chapter:22, name:'A Big 48-Pixel Sprite', title:'48-Pixel Sprite'},\n {id:'examples/tinyfonts2.a', chapter:23, name:'Tiny Text'},\n {id:'examples/score6.a', chapter:24, name:'6-Digit Score'},\n {id:'examples/retrigger.a', chapter:26, name:'Sprite Formations'},\n// {id:'examples/tinyfonts.a', chapter:23, name:'Tiny Fonts, Slow'},\n {id:'examples/multisprite3.a', chapter:28, name:'Multisprites'},\n {id:'examples/procgen1.a', chapter:30, name:'Procedural Generation'},\n {id:'examples/lines.a', chapter:31, name:'Drawing Lines'},\n// {id:'examples/piatable.a', name:'Timer Table'},\n {id:'examples/musicplayer.a', chapter:32, name:'Music Player'},\n {id:'examples/road.a', chapter:33, name:'Pseudo 3D Road'},\n {id:'examples/bankswitching.a', chapter:35, name:'Bankswitching'},\n {id:'examples/wavetable.a', chapter:36, name:'Wavetable Sound'},\n {id:'examples/pal.a', name:'PAL Video Output'},\n// {id:'examples/testlibrary.a', name:'VCS Library Demo'},\n// {id:'examples/music2.a', name:'Pitch-Accurate Music'},\n// {id:'examples/fullgame.a', name:'Thru Hike: The Game', title:'Thru Hike'},\n {id:'examples/fracpitch.a', name:'Fractional Pitch', category:'BASIC and Other Languages'},\n {id:'bb/helloworld.bas', name:'Hello World (batariBASIC)'},\n {id:'bb/draw.bas', name:'Playfield Draw (batariBASIC)'},\n {id:'bb/sample.bas', name:'Sprite Test (batariBASIC)'},\n {id:'bb/FIFA1977.bas', name:'2P Soccer Game (batariBASIC)'},\n {id:'bb/duck_chase.bas', name:'Duck Chase (batariBASIC)'},\n {id:'wiz/finalduck.wiz', name:'Final Duck (Wiz)'},\n// {id:'bb/rblast106.bas', name:'Road Blasters (batariBASIC)'},\n {id:'vcslib/demo_vcslib.c', name:'VCSLib Demo (C)'},\n];\n\nfunction getToolForFilename_vcs(fn: string) {\n if (fn.endsWith(\"-llvm.c\")) return \"remote:llvm-mos\";\n if (fn.endsWith(\".wiz\")) return \"wiz\";\n if (fn.endsWith(\".bb\") || fn.endsWith(\".bas\")) return \"bataribasic\";\n if (fn.endsWith(\".ca65\")) return \"ca65\";\n if (fn.endsWith(\".acme\")) return \"acme\";\n //if (fn.endsWith(\".inc\")) return \"ca65\";\n if (fn.endsWith(\".c\")) return \"cc65\";\n //if (fn.endsWith(\".h\")) return \"cc65\";\n if (fn.endsWith(\".ecs\")) return \"ecs\";\n return \"dasm\";\n}\n\nclass VCSPlatform extends BasePlatform {\n\n lastBreakState; // last breakpoint state\n canvas : HTMLCanvasElement;\n\n // TODO: super hack for ProbeBitmap view\n machine = {\n cpuCyclesPerLine: 76 // NTSC\n };\n\n getPresets() { return VCS_PRESETS; }\n\n async start() {\n var self : VCSPlatform = this;\n // load Javatari and configure settings\n await loadScript(\"javatari/javatari.js\");\n Javatari.AUTO_START = false;\n Javatari.SHOW_ERRORS = false;\n Javatari.CARTRIDGE_CHANGE_DISABLED = true;\n Javatari.DEBUG_SCANLINE_OVERFLOW = false; // TODO: integrate into probe API\n Javatari.AUDIO_BUFFER_SIZE = 256;\n // show console div and start\n $(\"#javatari-div\").show();\n Javatari.start();\n var jaconsole = Javatari.room.console;\n // intercept clockPulse function\n jaconsole.oldClockPulse = jaconsole.clockPulse;\n jaconsole.clockPulse = function() {\n self.updateRecorder();\n self.probe.logNewFrame();\n this.oldClockPulse();\n // look for KIL instruction\n if (Javatari.room.console.getCPUState().o == 0x02 && Javatari.room.console.onBreakpointHit != null) {\n Javatari.room.console.onBreakpointHit(Javatari.room.console.saveState());\n //throw new EmuHalt(\"CPU STOPPED\"); // TODO: requires browser reload\n }\n }\n // intercept TIA end of line\n var videoSignal = jaconsole.tia.getVideoOutput();\n videoSignal.oldNextLine = videoSignal.nextLine;\n videoSignal.nextLine = function(pixels, vsync) {\n self.probe.logNewScanline();\n return this.oldNextLine(pixels, vsync);\n }\n // resize after added to dom tree\n var jacanvas = $(\"#javatari-screen\").find(\"canvas\")[0];\n const resizeObserver = new ResizeObserver(entries => {\n this.resize();\n });\n resizeObserver.observe(jacanvas);\n this.canvas = jacanvas;\n }\n\n loadROM(title, data) {\n if (data.length == 0 || ((data.length & 0x3ff) != 0))\n throw new EmuHalt(\"Invalid ROM length: \" + data.length);\n // TODO: parse Log messages from Javatari?\n var wasrunning = this.isRunning();\n Javatari.loadROM(title, data);\n if (!this.isRunning()) throw Error(\"Could not load ROM\");\n if (!wasrunning) this.pause();\n }\n\n getOpcodeMetadata(opcode, offset) {\n return Javatari.getOpcodeMetadata(opcode, offset);\n }\n\n getRasterPosition() : {x:number,y:number,clk:number} {\n var clkfs = Javatari.room.console.getClocksFromFrameStart() - 1;\n var row = Math.floor(clkfs/76);\n var col = clkfs - row*76;\n var xpos = col*3;\n var ypos = row;\n return {x:xpos, y:ypos, clk:clkfs%76};\n }\n getRasterScanline() : number {\n return this.getRasterPosition().y;\n }\n getRasterLineClock() : number {\n return this.getRasterPosition().x;\n }\n getRasterCanvasPosition() : {x:number,y:number} {\n let p = Javatari.room.console.tia.getVideoOutput().monitor.getDisplayParameters();\n let {x,y} = this.getRasterPosition();\n let canvasPos = {\n x: (x - p.displayOriginX) * p.displayWidth * p.displayScaleX / (p.signalWidth - p.displayOriginX),\n y: (y - p.displayOriginY) * p.displayHeight * p.displayScaleY / p.displayHeight\n };\n console.log(x,y,canvasPos,p);\n return canvasPos;\n }\n\n // TODO: Clock changes this on event, so it may not be current\n isRunning() {\n //console.log(Javatari.room.console.isRunning(), Javatari.room.console.isPowerOn);\n return Javatari.room && Javatari.room.console.isRunning();\n }\n pause() {\n Javatari.room.console.pause();\n Javatari.room.speaker.mute();\n }\n resume() {\n Javatari.room.console.go();\n // for browser autostart\n Javatari.room.speaker.powerOff();\n Javatari.room.speaker.powerOn();\n }\n advance() : number {\n Javatari.room.console.clockPulse();\n return 0; // TODO: advanceFrameClock() and return 76*262 (or PAL)\n }\n /*\n advanceFrameClock?(trap: DebugCondition, step: number) : number {\n this.runEval( (c) => {\n var clkfs = Javatari.room.console.getClocksFromFrameStart() - 1;\n return clkfs >= step;\n });\n return step;\n }\n */\n // for unit test\n nextFrame() {\n Javatari.room.console.clockPulse();\n }\n\n step() { Javatari.room.console.debugSingleStepCPUClock(); }\n stepBack() { Javatari.room.console.debugStepBackInstruction(); }\n runEval(evalfunc) { Javatari.room.console.debugEval(evalfunc); }\n\n setupDebug(callback) {\n Javatari.room.console.onBreakpointHit = (state) => {\n state.c.PC = (state.c.PC - 1) & 0xffff;\n this.fixState(state);\n Javatari.room.console.pause();\n Javatari.room.speaker.mute();\n this.lastBreakState = state;\n callback(state);\n // TODO: we have to delay because javatari timer is still running\n setTimeout(() => this.updateVideoDebugger(), 100);\n }\n Javatari.room.speaker.mute();\n }\n isDebugging() : boolean {\n // TODO: always true\n return Javatari.room.console.onBreakpointHit != null;\n }\n clearDebug() {\n this.lastBreakState = null;\n Javatari.room.console.disableDebug();\n Javatari.room.console.onBreakpointHit = null;\n if (this.isRunning()) Javatari.room.speaker.play();\n }\n\n reset() {\n Javatari.room.console.powerOff();\n Javatari.room.console.resetDebug();\n Javatari.room.console.powerOn();\n Javatari.room.speaker.play();\n }\n getOriginPC() {\n return (this.readAddress(0xfffc) | (this.readAddress(0xfffd) << 8)) & 0xffff;\n }\n newCodeAnalyzer() {\n return new CodeAnalyzer_vcs(this);\n }\n saveState() {\n var state = Javatari.room.console.saveState();\n this.fixState(state);\n return state;\n }\n fixState(state) {\n // TODO: DASM listing prevents us from using RORG offset\n // TODO: how to handle 1000/3000/etc vs overlapping addresses?\n if (state.ca?.f != '3E' && state.ca?.f != '3F') {\n var ofs = (state.ca?.bo) || 0;\n // TODO: for batari BASIC\n state.c.EPC = state.c.PC + ofs; // EPC = effective PC for ROM\n }\n }\n loadState(state) {\n return Javatari.room.console.loadState(state);\n }\n getCPUState() : CpuState {\n return Javatari.room.console.getCPUState();\n }\n saveControlsState() {\n return Javatari.room.console.saveControlsState();\n }\n loadControlsState(state) {\n Javatari.room.console.loadControlsState(state);\n }\n readAddress(addr) {\n // TODO: shouldn't have to do this when debugging\n // TODO: don't read bank switch addresses\n if (this.lastBreakState && addr >= 0x80 && addr < 0x100)\n return this.getRAMForState(this.lastBreakState)[addr & 0x7f];\n else if ((addr & 0x1280) === 0x280)\n return 0; // don't read PIA\n else\n return Javatari.room.console.readAddress(addr);\n }\n writeAddress(addr,value) {\n Javatari.room.console.writeAddress(addr,value);\n }\n runUntilReturn() {\n var depth = 1;\n this.runEval( (c) => {\n if (depth <= 0 && c.T == 0)\n return true;\n if (c.o == 0x20)\n depth++;\n else if (c.o == 0x60 || c.o == 0x40)\n --depth;\n return false;\n });\n }\n runToVsync() {\n this.advance();\n this.runEval( (c) => { return true; } );\n }\n cpuStateToLongString(c) {\n return cpuStateToLongString_6502(c);\n }\n getRAMForState(state) {\n return jt.Util.byteStringToUInt8Array(atob(state.r.b));\n }\n ramStateToLongString(state) {\n var ram = this.getRAMForState(state);\n return \"\\n\" + dumpRAM(ram, 0x80, 0x80);\n }\n getToolForFilename = getToolForFilename_vcs;\n getDefaultExtension() { return \".dasm\"; }\n getROMExtension() { return \".a26\"; }\n\n getDebugCategories() {\n return ['CPU','Stack','PIA','TIA'];\n }\n getDebugInfo(category, state) {\n switch (category) {\n case 'CPU': return this.cpuStateToLongString(state.c) + this.bankSwitchStateToString(state);\n case 'Stack':\t return dumpStackToString(this, this.getRAMForState(state), 0x100, 0x1ff, 0x100+state.c.SP, 0x20);\n case 'PIA': return this.ramStateToLongString(state) + \"\\n\" + this.piaStateToLongString(state.p);\n case 'TIA': return this.tiaStateToLongString(state.t);\n }\n }\n bankSwitchStateToString(state) {\n if (state.ca?.ro >= 0) return \"RAMOffset \"+hex(state.ca.ro,4)+\"\\n\";\n return (state.ca?.bo >= 0) ? \"BankOffset \"+hex(state.ca.bo,4)+\"\\n\" : \"\";\n }\n piaStateToLongString(p) {\n return \"Timer \" + p.t + \"/\" + p.c + \"\\nINTIM $\" + hex(p.IT,2) + \" (\" + p.IT + \")\\nINSTAT $\" + hex(p.IS,2) + \"\\n\";\n }\n tiaStateToLongString(t) {\n var pos = this.getRasterPosition();\n var s = '';\n s += \"H\" + lpad(pos.x.toString(),5) + \" (clk \" + lpad(pos.clk.toString(),3) + \") V\" + lpad(pos.y.toString(),5) + \" \";\n s += (t.vs?\"VSYNC \":\"- \") + (t.vb?\"VBLANK \":\"- \") + \"\\n\";\n s += \"\\n\";\n s += \"Playfield \" + t.f + \"\\n\";\n s += \" \" + (t.fr?\"REFLECT \":\"- \") + (t.fs?\"SCOREMODE \":\"- \") + (t.ft?\"PRIORITY \":\"- \") + \"\\n\";\n for (var j=0; j<2; j++) {\n var i = \"p\"+j;\n s += \"Player\"+j+ lpad(tobin(t[i]),11) + lpad(tobin(t[i+'d']),11) + \"\\n\";\n }\n s += \"\\n\";\n // TODO? s += \" Color {color:0x\" + hex(t.fc) + \"} {color:0x\" + hex(t.fb) + \"}\\n\";\n s += \" Count Scan Speed\\n\";\n for (var j=0; j<2; j++) {\n var i = \"p\"+j;\n s += \"Player\"+j+ lpad(t[i+'co'],8) + lpad(nonegstr(t[i+'sc']),5) + lpad(t[i+'ss'],6);\n s += \" \" + (t[i+'rr']?\"RESET\":\"\") + \" \" + (t[i+'v']?\"DELAY\":\"\") + \" \" + (t[i+'cc']?\"CLOSECOPY\":\"\") + \" \" + (t[i+'mc']?\"MEDCOPY\":\"\") + \" \" + (t[i+'wc']?\"WIDECOPY\":\"\") + \" \" + (t[i+'r']?\"REFLECT\":\"\") + \"\\n\";\n }\n for (var j=0; j<2; j++) {\n var i = \"m\"+j;\n s += \"Missile\"+j+ lpad(t[i+'co'],7) + lpad(nonegstr(t[i+'sc']),5) + lpad(t[i+'ss'],6);\n s += \" \" + (t[i+'rr']?\"RESET\":\"\") + \" \" + (t[i+'r']?\"RESET2PLAYER\":\"\") + \"\\n\";\n }\n s += \"Ball\"+ lpad(t['bco'],11) + lpad(nonegstr(t['bsc']),5) + lpad(t['bss'],6) + \"\\n\";\n return s;\n }\n\n disassemble(pc:number, read:(addr:number)=>number) : DisasmLine {\n return disassemble6502(pc, read(pc), read(pc+1), read(pc+2));\n }\n\n showHelp() {\n return \"https://8bitworkshop.com/docs/platforms/vcs/\";\n }\n\n getMemoryMap = function() { return {main:[\n {name:'TIA Registers',start:0x00,size:0x80,type:'io'},\n {name:'PIA RAM',start:0x80,size:0x80,type:'ram'},\n {name:'PIA Ports and Timer',start:0x280,size:0x18,type:'io'},\n {name:'Cartridge ROM',start:0xf000,size:0x1000-6,type:'rom'},\n {name:'CPU Vectors',start:0xfffa,size:0x6,type:'rom'},\n ]}};\n\n // probing\n nullProbe = new NullProbe();\n probe : ProbeAll = this.nullProbe;\n\n startProbing?() : ProbeRecorder {\n var self : VCSPlatform = this;\n var rec = new ProbeRecorder(this);\n this.connectProbe(rec);\n var probe = this.probe;\n // intercept CPU clock pulse\n var cpu = Javatari.room.console.cpu;\n if (cpu.oldCPUClockPulse == null) {\n cpu.oldCPUClockPulse = cpu.clockPulse;\n cpu.clockPulse = function() {\n if (cpu.isPCStable())\n probe.logExecute(cpu.getPC(), cpu.getSP());\n this.oldCPUClockPulse();\n probe.logClocks(1);\n }\n }\n // intercept bus read/write\n var bus = Javatari.room.console.bus;\n if (bus.oldRead == null) {\n bus.oldRead = bus.read;\n bus.read = function(a) {\n var v = this.oldRead(a);\n if (a > 0 && a < 0x80) probe.logIORead(a,v); // (00),x reads $00?\n else if (a > 0x280 && a < 0x300) probe.logIORead(a,v);\n else probe.logRead(a,v);\n return v;\n }\n bus.oldWrite = bus.write;\n bus.write = function(a,v) {\n this.oldWrite(a,v);\n if (a == 0x02) probe.logWait(a); // WSYNC\n else if (a < 0x80) probe.logIOWrite(a,v);\n else if (a > 0x280 && a < 0x300) probe.logIOWrite(a,v);\n else probe.logWrite(a,v);\n }\n }\n return rec;\n }\n stopProbing?() : void {\n this.connectProbe(null);\n var cpu = Javatari.room.console.cpu;\n if (cpu.oldCPUClockPulse != null) {\n cpu.clockPulse = cpu.oldCPUClockPulse;\n cpu.oldCPUClockPulse = null;\n }\n var bus = Javatari.room.console.bus;\n if (bus.oldRead) {\n bus.read = bus.oldRead;\n bus.oldRead = null;\n }\n if (bus.oldWrite) {\n bus.write = bus.oldWrite;\n bus.oldWrite = null;\n }\n }\n connectProbe(probe:ProbeAll) {\n this.probe = probe || this.nullProbe;\n }\n\n // resizing\n resize() {\n var scale = Math.min(1, ($('#emulator').width() - 24) / 640);\n var xt = (1 - scale) * 50;\n $('#javatari-div').css('transform', `translateX(-${xt}%) translateY(-${xt}%) scale(${scale})`);\n }\n updateVideoDebugger() {\n const {x,y} = this.getRasterCanvasPosition();\n if (x >= 0 || y >= 0) {\n const ctx = this.canvas?.getContext('2d');\n if (ctx) {\n drawCrosshair(ctx, x, y, 2);\n }\n }\n }\n};\n\n// TODO: mixin for Base6502Platform?\n\nfunction nonegstr(n) {\n return n < 0 ? \"-\" : n.toString();\n}\n\n///////////////\n\nclass VCSMAMEPlatform extends BaseMAME6502Platform implements Platform {\n\n// MCFG_SCREEN_RAW_PARAMS( MASTER_CLOCK_NTSC, 228, 26, 26 + 160 + 16, 262, 24 , 24 + 192 + 31 )\n\n start = function() {\n this.startModule(this.mainElement, {\n jsfile:'mame8bitws.js',\n driver:'a2600',\n width:176*2,\n height:223,\n romfn:'/emulator/cart.rom',\n romsize:0x1000,\n });\n }\n\n loadROM = function(title, data) {\n this.loadROMFile(data);\n this.loadRegion(\":cartslot:cart:rom\", data);\n }\n\n getPresets = function() { return VCS_PRESETS; }\n\n getToolForFilename = getToolForFilename_vcs;\n getDefaultExtension() { return \".dasm\"; }\n getROMExtension() { return \".a26\"; }\n\n getOriginPC = function() {\n return (this.readAddress(0xfffc) | (this.readAddress(0xfffd) << 8)) & 0xffff;\n }\n \n}\n\n////////////////\n\nclass VCSStellaPlatform implements Platform {\n\n mainElement: HTMLElement;\n Stellerator;\n stellerator;\n running: boolean = false;\n\n constructor(mainElement: HTMLElement) {\n this.mainElement = mainElement;\n }\n async start() {\n await loadScript('lib/stellerator/stellerator-embedded.min.js');\n const $6502 : any = window['$6502'];\n this.Stellerator = $6502.Stellerator;\n // create a canvas, stellerator will override width/height but we need CSS aspect ratio\n const canvas = __createCanvas(window.document, this.mainElement, 28, 20);\n // stellerator adds overscan, we don't need as much\n canvas.style.padding = '10px';\n this.stellerator = new this.Stellerator(canvas, 'lib/stellerator/stellerator.min.js',\n {\n gamma: 0.8,\n scalingMode: this.Stellerator.ScalingMode.qis,\n tvEmulation: this.Stellerator.TvEmulation.composite,\n phosphorLevel: 0.25,\n scanlineLevel: 0.2,\n keyboardTarget: this.mainElement\n }\n );\n }\n loadROM(title, data) {\n this.stellerator.run(data, this.Stellerator.TvMode.ntsc);\n }\n reset() {\n this.stellerator.reset();\n }\n pause() {\n this.running = false;\n this.stellerator.pause();\n }\n resume() {\n this.running = true;\n this.stellerator.resume();\n }\n isRunning() {\n return this.running;\n }\n getToolForFilename = getToolForFilename_vcs;\n getDefaultExtension() { return \".dasm\"; }\n getROMExtension() { return \".a26\"; } \n getPresets() { return VCS_PRESETS }\n}\n\n////////////////\n\nPLATFORMS['vcs'] = VCSPlatform;\nPLATFORMS['vcs.mame'] = VCSMAMEPlatform;\nPLATFORMS['vcs.stellerator'] = VCSStellaPlatform;\n"],
"mappings": "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",
"names": []
}