1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-05-28 23:41:32 +00:00
8bitworkshop/gen/williams-IVXZLH67.js.map

8 lines
47 KiB
Plaintext

{
"version": 3,
"sources": ["../src/machine/williams.ts", "../src/platform/williams.ts"],
"sourcesContent": ["import { hex } from \"chroma-js\";\nimport { MasterAudio, WorkerSoundChannel } from \"../common/audio\";\nimport { MemoryBus } from \"../common/baseplatform\";\nimport { CPU6809 } from \"../common/cpu/6809\";\nimport { BasicScanlineMachine } from \"../common/devices\";\nimport { Keys, makeKeycodeMap, newAddressDecoder, newKeyboardHandler, padBytes } from \"../common/emu\";\n\nconst INITIAL_WATCHDOG = 8;\nconst SCREEN_HEIGHT = 304;\n\nexport class WilliamsMachine extends BasicScanlineMachine {\n\n xtal = 12000000;\n cpuFrequency = this.xtal / 3 / 4;\n //cpuCyclesPerLine = 64;\n cpuCyclesPerLine = 54; // TODO: becuse we swapped width and height\n canvasWidth = 256;\n numTotalScanlines = 304;\n numVisibleScanlines = 304;\n defaultROMSize = 0xc000;\n rotate = -90;\n sampleRate = 1;\n\n cpu;\n membus: MemoryBus;\n ram = new Uint8Array(0xc000);\n nvram = new Uint8Array(0x400);\n rom = new Uint8Array(0xc000);\n portsel = 0;\n banksel = 0;\n watchdog_counter = 0;\n watchdog_enabled = false;\n pia6821 = new Uint8Array(8);\n blitregs = new Uint8Array(8);\n\n worker: Worker;\n master;\n audioadapter;\n\n palette = new Uint32Array(16);\n screenNeedsRefresh = false;\n displayPCs;\n cpuScale = 1;\n waitCycles = 0;\n\n constructor(public isDefender: boolean) {\n super();\n this.palette.fill(0xff000000);\n this.initBus(isDefender);\n this.initInputs(isDefender);\n this.initAudio();\n this.initCPU();\n }\n\n initInputs(isDefender: boolean) {\n var DEFENDER_KEYCODE_MAP = makeKeycodeMap([\n [Keys.A, 4, 0x1],\n [Keys.RIGHT, 4, 0x2],\n [Keys.B, 4, 0x4],\n [Keys.VK_X, 4, 0x8],\n [Keys.P2_START, 4, 0x10],\n [Keys.START, 4, 0x20],\n [Keys.LEFT, 4, 0x40],\n [Keys.DOWN, 4, 0x80],\n [Keys.UP, 6, 0x1],\n [Keys.SELECT, 0, 0x4],\n [Keys.VK_7, 0, 0x1],\n [Keys.VK_8, 0, 0x2],\n [Keys.VK_9, 0, 0x8],\n ]);\n\n var ROBOTRON_KEYCODE_MAP = makeKeycodeMap([\n [Keys.P2_UP, 0, 0x1],\n [Keys.P2_DOWN, 0, 0x2],\n [Keys.P2_LEFT, 0, 0x4],\n [Keys.P2_RIGHT, 0, 0x8],\n [Keys.START, 0, 0x10],\n [Keys.P2_START, 0, 0x20],\n [Keys.UP, 0, 0x40],\n [Keys.DOWN, 0, 0x80],\n [Keys.LEFT, 2, 0x1],\n [Keys.RIGHT, 2, 0x2],\n [Keys.VK_7, 4, 0x1],\n [Keys.VK_8, 4, 0x2],\n [Keys.VK_6, 4, 0x4],\n [Keys.VK_9, 4, 0x8],\n [Keys.SELECT, 4, 0x10],\n ]);\n\n var KEYCODE_MAP = isDefender ? DEFENDER_KEYCODE_MAP : ROBOTRON_KEYCODE_MAP;\n //this.inputs.set(this.pia6821);\n this.handler = newKeyboardHandler(this.pia6821, KEYCODE_MAP);\n }\n\n initBus(isDefender: boolean) {\n var ioread_defender = newAddressDecoder([\n [0x400, 0x5ff, 0x1ff, (a) => { return this.nvram[a]; }],\n [0x800, 0x800, 0, (a) => { return this.scanline; }],\n [0xc00, 0xc07, 0x7, (a) => { return this.pia6821[a]; }],\n [0x0, 0xfff, 0, (a) => { /*console.log('ioread',hex(a));*/ }],\n ]);\n\n var iowrite_defender = newAddressDecoder([\n [0x0, 0xf, 0xf, this.setPalette.bind(this)],\n [0x3fc, 0x3ff, 0, (a, v) => { if (v == 0x38) this.watchdog_counter = INITIAL_WATCHDOG; this.watchdog_enabled = true; }],\n [0x400, 0x5ff, 0x1ff, (a, v) => { this.nvram[a] = v; }],\n [0xc02, 0xc02, 0x1, (a, v) => { if (this.worker) this.worker.postMessage({ command: v & 0x3f }); }],\n [0xc00, 0xc07, 0x7, (a, v) => { this.pia6821[a] = v; }],\n [0x0, 0xfff, 0, (a, v) => { /* console.log('iowrite', hex(a), hex(v)); */ }],\n ]);\n\n var memread_defender = newAddressDecoder([\n [0x0000, 0xbfff, 0xffff, (a) => { return this.ram[a]; }],\n [0xc000, 0xcfff, 0x0fff, (a) => {\n switch (this.banksel) {\n case 0: return ioread_defender(a);\n case 1: return this.rom[a + 0x3000];\n case 2: return this.rom[a + 0x4000];\n case 3: return this.rom[a + 0x5000];\n case 7: return this.rom[a + 0x6000];\n default: return 0; // TODO: error light\n }\n }],\n [0xd000, 0xffff, 0xffff, (a) => { return this.rom ? this.rom[a - 0xd000] : 0; }],\n ]);\n\n var memwrite_defender = newAddressDecoder([\n [0x0000, 0x97ff, 0, this.write_display_byte.bind(this)],\n [0x9800, 0xbfff, 0, (a, v) => { this.ram[a] = v; }],\n [0xc000, 0xcfff, 0x0fff, iowrite_defender.bind(this)],\n [0xd000, 0xdfff, 0, (a, v) => { this.banksel = v & 0x7; }],\n [0, 0xffff, 0, (a, v) => { /* console.log(hex(a), hex(v)); */ }],\n ]);\n\n // Robotron, Joust, Bubbles, Stargate\n\n var ioread_robotron = newAddressDecoder([\n [0x804, 0x807, 0x3, (a) => { return this.pia6821[a]; }],\n [0x80c, 0x80f, 0x3, (a) => { return this.pia6821[a + 4]; }],\n [0xb00, 0xbff, 0, (a) => { return this.scanline; }],\n [0xc00, 0xfff, 0x3ff, (a) => { return this.nvram[a]; }],\n [0x0, 0xfff, 0, (a) => { /* console.log('ioread',hex(a)); */ }],\n ]);\n\n var iowrite_robotron = newAddressDecoder([\n [0x0, 0xf, 0xf, this.setPalette.bind(this)],\n [0x80c, 0x80c, 0xf, (a, v) => { if (this.worker) this.worker.postMessage({ command: v }); }],\n //[0x804, 0x807, 0x3, function(a,v) { console.log('iowrite',a); }], // TODO: sound\n //[0x80c, 0x80f, 0x3, function(a,v) { console.log('iowrite',a+4); }], // TODO: sound\n [0x900, 0x9ff, 0, (a, v) => { this.banksel = v & 0x1; }],\n [0xa00, 0xa07, 0x7, this.setBlitter.bind(this)],\n [0xbff, 0xbff, 0, (a, v) => { if (v == 0x39) { this.watchdog_counter = INITIAL_WATCHDOG; this.watchdog_enabled = true; } }],\n [0xc00, 0xfff, 0x3ff, (a, v) => { this.nvram[a] = v; }],\n //[0x0, 0xfff, 0, function(a,v) { console.log('iowrite',hex(a),hex(v)); }],\n ]);\n\n var memread_robotron = newAddressDecoder([\n [0x0000, 0x8fff, 0xffff, (a) => { return this.banksel ? this.rom[a] : this.ram[a]; }],\n [0x9000, 0xbfff, 0xffff, (a) => { return this.ram[a]; }],\n [0xc000, 0xcfff, 0x0fff, ioread_robotron],\n [0xd000, 0xffff, 0xffff, (a) => { return this.rom ? this.rom[a - 0x4000] : 0; }],\n ]);\n\n var memwrite_robotron = newAddressDecoder([\n [0x0000, 0x97ff, 0, this.write_display_byte.bind(this)],\n [0x9800, 0xbfff, 0, (a, v) => { this.ram[a] = v; }],\n [0xc000, 0xcfff, 0x0fff, iowrite_robotron.bind(this)],\n //[0x0000, 0xffff, 0, function(a,v) { console.log(hex(a), hex(v)); }],\n ]);\n\n var memread_williams = isDefender ? memread_defender : memread_robotron;\n var memwrite_williams = isDefender ? memwrite_defender : memwrite_robotron;\n this.membus = {\n read: memread_williams,\n write: memwrite_williams,\n };\n this.membus = this.probeMemoryBus(this.membus);\n this.readAddress = this.membus.read;\n }\n\n initAudio() {\n this.master = new MasterAudio();\n this.worker = new Worker(\"./src/common/audio/z80worker.js\");\n let workerchannel = new WorkerSoundChannel(this.worker);\n this.master.master.addChannel(workerchannel);\n }\n\n initCPU() {\n this.rom = new Uint8Array(this.defaultROMSize);\n this.cpu = this.newCPU(this.membus);\n //this.connectCPUMemoryBus(this);\n }\n\n newCPU(membus: MemoryBus) {\n var cpu = Object.create(CPU6809());\n cpu.init(membus.write, membus.read, 0);\n return cpu;\n }\n\n readAddress;\n\n // d1d6 ldu $11 / beq $d1ed\n\n setPalette(a, v) {\n // RRRGGGBB\n var color = 0xff000000 | ((v & 7) << 5) | (((v >> 3) & 7) << 13) | (((v >> 6) << 22));\n if (color != this.palette[a]) {\n this.palette[a] = color;\n this.screenNeedsRefresh = true;\n }\n }\n\n write_display_byte(a: number, v: number) {\n this.ram[a] = v;\n this.drawDisplayByte(a, v);\n if (this.displayPCs) this.displayPCs[a] = this.cpu.getPC(); // save program counter\n }\n\n drawDisplayByte(a, v) {\n var ofs = ((a & 0xff00) << 1) | ((a & 0xff) ^ 0xff);\n this.pixels[ofs] = this.palette[v >> 4];\n this.pixels[ofs + 256] = this.palette[v & 0xf];\n }\n\n setBlitter(a, v) {\n if (a) {\n this.blitregs[a] = v;\n } else {\n var cycles = this.doBlit(v);\n this.waitCycles -= cycles * this.cpuScale; // wait CPU cycles\n }\n }\n\n doBlit(flags) {\n //console.log(hex(flags), blitregs);\n flags &= 0xff;\n var offs = SCREEN_HEIGHT - this.blitregs[7];\n var sstart = (this.blitregs[2] << 8) + this.blitregs[3];\n var dstart = (this.blitregs[4] << 8) + this.blitregs[5];\n var w = this.blitregs[6] ^ 4; // blitter bug fix\n var h = this.blitregs[7] ^ 4;\n if (w == 0) w++;\n if (h == 0) h++;\n if (h == 255) h++;\n var sxinc = (flags & 0x1) ? 256 : 1;\n var syinc = (flags & 0x1) ? 1 : w;\n var dxinc = (flags & 0x2) ? 256 : 1;\n var dyinc = (flags & 0x2) ? 1 : w;\n var pixdata = 0;\n for (var y = 0; y < h; y++) {\n var source = sstart & 0xffff;\n var dest = dstart & 0xffff;\n for (var x = 0; x < w; x++) {\n var data = this.membus.read(source);\n if (flags & 0x20) {\n pixdata = (pixdata << 8) | data;\n this.blit_pixel(dest, (pixdata >> 4) & 0xff, flags);\n } else {\n this.blit_pixel(dest, data, flags);\n }\n source += sxinc;\n source &= 0xffff;\n dest += dxinc;\n dest &= 0xffff;\n }\n if (flags & 0x2)\n dstart = (dstart & 0xff00) | ((dstart + dyinc) & 0xff);\n else\n dstart += dyinc;\n if (flags & 0x1)\n sstart = (sstart & 0xff00) | ((sstart + syinc) & 0xff);\n else\n sstart += syinc;\n }\n return w * h * (2 + ((flags & 0x4) >> 2)); // # of memory accesses\n }\n\n blit_pixel(dstaddr, srcdata, flags) {\n var curpix = dstaddr < 0xc000 ? this.ram[dstaddr] : this.membus.read(dstaddr);\n var solid = this.blitregs[1];\n var keepmask = 0xff; //what part of original dst byte should be kept, based on NO_EVEN and NO_ODD flags\n //even pixel (D7-D4)\n if ((flags & 0x8) && !(srcdata & 0xf0)) { //FG only and src even pixel=0\n if (flags & 0x80) keepmask &= 0x0f; // no even\n } else {\n if (!(flags & 0x80)) keepmask &= 0x0f; // not no even\n }\n //odd pixel (D3-D0)\n if ((flags & 0x8) && !(srcdata & 0x0f)) { //FG only and src odd pixel=0\n if (flags & 0x40) keepmask &= 0xf0; // no odd\n } else {\n if (!(flags & 0x40)) keepmask &= 0xf0; // not no odd\n }\n curpix &= keepmask;\n if (flags & 0x10) // solid bit\n curpix |= (solid & ~keepmask);\n else\n curpix |= (srcdata & ~keepmask);\n if (dstaddr < 0x9800) // can cause recursion otherwise\n this.membus.write(dstaddr, curpix);\n }\n\n startScanline(): void {\n this.audio && this.audioadapter && this.audioadapter.generate(this.audio);\n // TODO: line-by-line\n if (this.screenNeedsRefresh && this.scanline == 0) {\n for (var i = 0; i < 0x9800; i++)\n this.drawDisplayByte(i, this.ram[i]);\n this.screenNeedsRefresh = false;\n }\n if (this.scanline == 0 && this.watchdog_enabled && this.watchdog_counter-- <= 0) {\n console.log(\"WATCHDOG FIRED, PC =\", this.cpu.getPC().toString(16)); // TODO: alert on video\n // TODO: this.breakpointHit(cpu.T());\n this.reset();\n }\n }\n drawScanline(): void {\n // interrupts happen every 1/4 of the screen\n let sl = this.scanline;\n if (sl == 0 || sl == 0x3c || sl == 0xbc || sl == 0xfc) {\n if (!this.isDefender || this.pia6821[7] == 0x3c) { // TODO?\n if (this.cpu.interrupt)\n this.cpu.interrupt();\n if (this.cpu.requestInterrupt)\n this.cpu.requestInterrupt();\n }\n }\n }\n read(a: number): number {\n return this.membus.read(a);\n }\n write(a: number, v: number): void {\n this.membus.write(a, v);\n }\n readConst(a: number): number {\n if (a >= 0xc000 && a <= 0xcbff) return 0xff;\n else return this.membus.read(a); // TODO\n }\n reset() {\n super.reset();\n this.watchdog_counter = INITIAL_WATCHDOG;\n this.watchdog_enabled = false;\n this.banksel = 1;\n }\n\n loadSoundROM(data) {\n console.log(\"loading sound ROM \" + data.length + \" bytes\");\n var soundrom = padBytes(data, 0x4000);\n this.worker.postMessage({ rom: soundrom });\n }\n\n loadROM(data) {\n if (data.length > 2) {\n if (this.isDefender) {\n this.loadSoundROM(data.slice(0x6800));\n data = this.rom.slice(0, 0x6800);\n } else if (data.length > 0xc000) {\n this.loadSoundROM(data.slice(0xc000));\n data = this.rom.slice(0, 0xc000);\n } else if (data.length > 0x9000 && data[0x9000]) {\n this.loadSoundROM(data.slice(0x9000));\n }\n data = padBytes(data, 0xc000);\n }\n super.loadROM(data);\n }\n\n loadState(state) {\n this.cpu.loadState(state.c);\n this.ram.set(state.ram);\n this.nvram.set(state.nvram);\n this.pia6821.set(state.inputs);\n this.blitregs.set(state.blt);\n this.watchdog_counter = state.wdc;\n this.banksel = state.bs;\n this.portsel = state.ps;\n }\n saveState() {\n return {\n c: this.cpu.saveState(),\n ram: this.ram.slice(0),\n nvram: this.nvram.slice(0),\n inputs: this.pia6821.slice(0),\n blt: this.blitregs.slice(0),\n wdc: this.watchdog_counter,\n bs: this.banksel,\n ps: this.portsel,\n };\n }\n loadControlsState(state) {\n this.pia6821.set(state.inputs);\n }\n saveControlsState() {\n return {\n inputs: this.pia6821.slice(0),\n };\n }\n}\n", "\nimport { Platform, BaseZ80Platform, Base6809Platform, Base6809MachinePlatform } from \"../common/baseplatform\";\nimport { PLATFORMS, RAM, newAddressDecoder, padBytes, noise, setKeyboardFromMap, AnimationTimer, RasterVideo, Keys, makeKeycodeMap } from \"../common/emu\";\nimport { hex } from \"../common/util\";\nimport { MasterAudio, WorkerSoundChannel } from \"../common/audio\";\nimport { WilliamsMachine } from \"../machine/williams\";\n\n// https://www.arcade-museum.com/manuals-videogames/D/Defender.pdf\n\nvar WILLIAMS_PRESETS = [\n { id: 'gfxtest.c', name: 'Graphics Test' },\n { id: 'sprites.c', name: 'Sprite Test' },\n { id: 'game1.c', name: 'Raster Paranoia Game' },\n { id: 'bitmap_rle.c', name: 'RLE Bitmap' },\n];\n\nvar WilliamsPlatform = function(mainElement, proto, options) {\n var self = this;\n this.__proto__ = new (proto ? proto : Base6809Platform)();\n\n options = options || {};\n var isDefender = options?.isDefender;\n var SCREEN_HEIGHT = 304;\n var SCREEN_WIDTH = 256;\n\n var cpu, ram, rom, nvram;\n var portsel = 0;\n var banksel = 0;\n var watchdog_counter;\n var watchdog_enabled = false;\n var pia6821 = new RAM(8).mem;\n var blitregs = new RAM(8).mem;\n\n var video, timer, pixels, displayPCs;\n var screenNeedsRefresh = false;\n var membus;\n var video_counter;\n\n var audio, worker, workerchannel;\n\n var xtal = 12000000;\n var cpuFrequency = xtal / 3 / 4;\n var cpuCyclesPerFrame = cpuFrequency / 60; // TODO\n var cpuScale = 1;\n var INITIAL_WATCHDOG = 8;\n var PIXEL_ON = 0xffeeeeee;\n var PIXEL_OFF = 0xff000000;\n\n var DEFENDER_KEYCODE_MAP = makeKeycodeMap([\n [Keys.A, 4, 0x1],\n [Keys.RIGHT, 4, 0x2],\n [Keys.B, 4, 0x4],\n [Keys.VK_X, 4, 0x8],\n [Keys.P2_START, 4, 0x10],\n [Keys.START, 4, 0x20],\n [Keys.LEFT, 4, 0x40],\n [Keys.DOWN, 4, 0x80],\n [Keys.UP, 6, 0x1],\n [Keys.SELECT, 0, 0x4],\n [Keys.VK_7, 0, 0x1],\n [Keys.VK_8, 0, 0x2],\n [Keys.VK_9, 0, 0x8],\n ]);\n\n var ROBOTRON_KEYCODE_MAP = makeKeycodeMap([\n [Keys.P2_UP, 0, 0x1],\n [Keys.P2_DOWN, 0, 0x2],\n [Keys.P2_LEFT, 0, 0x4],\n [Keys.P2_RIGHT, 0, 0x8],\n [Keys.START, 0, 0x10],\n [Keys.P2_START, 0, 0x20],\n [Keys.UP, 0, 0x40],\n [Keys.DOWN, 0, 0x80],\n [Keys.LEFT, 2, 0x1],\n [Keys.RIGHT, 2, 0x2],\n [Keys.VK_7, 4, 0x1],\n [Keys.VK_8, 4, 0x2],\n [Keys.VK_6, 4, 0x4],\n [Keys.VK_9, 4, 0x8],\n [Keys.SELECT, 4, 0x10],\n ]);\n\n var KEYCODE_MAP = isDefender ? DEFENDER_KEYCODE_MAP : ROBOTRON_KEYCODE_MAP;\n\n // TODO: sound board handshake\n\n var palette = [];\n for (var ii = 0; ii < 16; ii++)\n palette[ii] = 0xff000000;\n\n this.getPresets = function() {\n return WILLIAMS_PRESETS;\n }\n\n // Defender\n\n var ioread_defender = newAddressDecoder([\n [0x400, 0x5ff, 0x1ff, function(a) { return nvram.mem[a]; }],\n [0x800, 0x800, 0, function(a) { return video_counter; }],\n [0xc00, 0xc07, 0x7, function(a) { return pia6821[a]; }],\n [0x0, 0xfff, 0, function(a) { /*console.log('ioread',hex(a));*/ }],\n ]);\n\n var iowrite_defender = newAddressDecoder([\n [0x0, 0xf, 0xf, setPalette],\n [0x3fc, 0x3ff, 0, function(a, v) { if (v == 0x38) watchdog_counter = INITIAL_WATCHDOG; watchdog_enabled=true; }],\n [0x400, 0x5ff, 0x1ff, function(a, v) { nvram.mem[a] = v; }],\n [0xc02, 0xc02, 0x1, function(a, v) { if (worker) worker.postMessage({ command: v & 0x3f }); }],\n [0xc00, 0xc07, 0x7, function(a, v) { pia6821[a] = v; }],\n [0x0, 0xfff, 0, function(a, v) { console.log('iowrite', hex(a), hex(v)); }],\n ]);\n\n var memread_defender = newAddressDecoder([\n [0x0000, 0xbfff, 0xffff, function(a) { return ram.mem[a]; }],\n [0xc000, 0xcfff, 0x0fff, function(a) {\n switch (banksel) {\n case 0: return ioread_defender(a);\n case 1: return rom[a + 0x3000];\n case 2: return rom[a + 0x4000];\n case 3: return rom[a + 0x5000];\n case 7: return rom[a + 0x6000];\n default: return 0; // TODO: error light\n }\n }],\n [0xd000, 0xffff, 0xffff, function(a) { return rom ? rom[a - 0xd000] : 0; }],\n ]);\n\n var memwrite_defender = newAddressDecoder([\n [0x0000, 0x97ff, 0, write_display_byte],\n [0x9800, 0xbfff, 0, function(a, v) { ram.mem[a] = v; }],\n [0xc000, 0xcfff, 0x0fff, iowrite_defender],\n [0xd000, 0xdfff, 0, function(a, v) { banksel = v & 0x7; }],\n [0, 0xffff, 0, function(a, v) { console.log(hex(a), hex(v)); }],\n ]);\n\n // Robotron, Joust, Bubbles, Stargate\n\n var ioread_robotron = newAddressDecoder([\n [0x804, 0x807, 0x3, function(a) { return pia6821[a]; }],\n [0x80c, 0x80f, 0x3, function(a) { return pia6821[a + 4]; }],\n [0xb00, 0xbff, 0, function(a) { return video_counter; }],\n [0xc00, 0xfff, 0x3ff, function(a) { return nvram.mem[a]; }],\n [0x0, 0xfff, 0, function(a) { /* console.log('ioread',hex(a)); */ }],\n ]);\n\n var iowrite_robotron = newAddressDecoder([\n [0x0, 0xf, 0xf, setPalette],\n [0x80c, 0x80c, 0xf, function(a, v) { if (worker) worker.postMessage({ command: v }); }],\n //[0x804, 0x807, 0x3, function(a,v) { console.log('iowrite',a); }], // TODO: sound\n //[0x80c, 0x80f, 0x3, function(a,v) { console.log('iowrite',a+4); }], // TODO: sound\n [0x900, 0x9ff, 0, function(a, v) { banksel = v & 0x1; }],\n [0xa00, 0xa07, 0x7, setBlitter],\n [0xbff, 0xbff, 0, function(a, v) { if (v == 0x39) { watchdog_counter = INITIAL_WATCHDOG; watchdog_enabled=true; } }],\n [0xc00, 0xfff, 0x3ff, function(a, v) { nvram.mem[a] = v; }],\n //[0x0, 0xfff, 0, function(a,v) { console.log('iowrite',hex(a),hex(v)); }],\n ]);\n\n var memread_robotron = newAddressDecoder([\n [0x0000, 0x8fff, 0xffff, function(a) { return banksel ? rom[a] : ram.mem[a]; }],\n [0x9000, 0xbfff, 0xffff, function(a) { return ram.mem[a]; }],\n [0xc000, 0xcfff, 0x0fff, ioread_robotron],\n [0xd000, 0xffff, 0xffff, function(a) { return rom ? rom[a - 0x4000] : 0; }],\n ]);\n\n var memwrite_robotron = newAddressDecoder([\n [0x0000, 0x97ff, 0, write_display_byte],\n [0x9800, 0xbfff, 0, function(a, v) { ram.mem[a] = v; }],\n [0xc000, 0xcfff, 0x0fff, iowrite_robotron],\n //[0x0000, 0xffff, 0, function(a,v) { console.log(hex(a), hex(v)); }],\n ]);\n\n var memread_williams = isDefender ? memread_defender : memread_robotron;\n var memwrite_williams = isDefender ? memwrite_defender : memwrite_robotron;\n\n // d1d6 ldu $11 / beq $d1ed\n\n function setPalette(a, v) {\n // RRRGGGBB\n var color = 0xff000000 | ((v & 7) << 5) | (((v >> 3) & 7) << 13) | (((v >> 6) << 22));\n if (color != palette[a]) {\n palette[a] = color;\n screenNeedsRefresh = true;\n }\n }\n\n function write_display_byte(a: number, v: number) {\n ram.mem[a] = v;\n drawDisplayByte(a, v);\n if (displayPCs) displayPCs[a] = cpu.getPC(); // save program counter\n }\n\n function drawDisplayByte(a, v) {\n var ofs = ((a & 0xff00) << 1) | ((a & 0xff) ^ 0xff);\n pixels[ofs] = palette[v >> 4];\n pixels[ofs + 256] = palette[v & 0xf];\n }\n\n function setBlitter(a, v) {\n if (a) {\n blitregs[a] = v;\n } else {\n var cycles = doBlit(v);\n this.waitCycles -= cycles * cpuScale; // wait CPU cycles\n }\n }\n\n function doBlit(flags) {\n //console.log(hex(flags), blitregs);\n flags &= 0xff;\n var offs = SCREEN_HEIGHT - blitregs[7];\n var sstart = (blitregs[2] << 8) + blitregs[3];\n var dstart = (blitregs[4] << 8) + blitregs[5];\n var w = blitregs[6] ^ 4; // blitter bug fix\n var h = blitregs[7] ^ 4;\n if (w == 0) w++;\n if (h == 0) h++;\n if (h == 255) h++;\n var sxinc = (flags & 0x1) ? 256 : 1;\n var syinc = (flags & 0x1) ? 1 : w;\n var dxinc = (flags & 0x2) ? 256 : 1;\n var dyinc = (flags & 0x2) ? 1 : w;\n var pixdata = 0;\n for (var y = 0; y < h; y++) {\n var source = sstart & 0xffff;\n var dest = dstart & 0xffff;\n for (var x = 0; x < w; x++) {\n var data = memread_williams(source);\n if (flags & 0x20) {\n pixdata = (pixdata << 8) | data;\n blit_pixel(dest, (pixdata >> 4) & 0xff, flags);\n } else {\n blit_pixel(dest, data, flags);\n }\n source += sxinc;\n source &= 0xffff;\n dest += dxinc;\n dest &= 0xffff;\n }\n if (flags & 0x2)\n dstart = (dstart & 0xff00) | ((dstart + dyinc) & 0xff);\n else\n dstart += dyinc;\n if (flags & 0x1)\n sstart = (sstart & 0xff00) | ((sstart + syinc) & 0xff);\n else\n sstart += syinc;\n }\n return w * h * (2 + ((flags & 0x4) >> 2)); // # of memory accesses\n }\n\n function blit_pixel(dstaddr, srcdata, flags) {\n var curpix = dstaddr < 0xc000 ? ram.mem[dstaddr] : memread_williams(dstaddr);\n var solid = blitregs[1];\n var keepmask = 0xff; //what part of original dst byte should be kept, based on NO_EVEN and NO_ODD flags\n //even pixel (D7-D4)\n if ((flags & 0x8) && !(srcdata & 0xf0)) { //FG only and src even pixel=0\n if (flags & 0x80) keepmask &= 0x0f; // no even\n } else {\n if (!(flags & 0x80)) keepmask &= 0x0f; // not no even\n }\n //odd pixel (D3-D0)\n if ((flags & 0x8) && !(srcdata & 0x0f)) { //FG only and src odd pixel=0\n if (flags & 0x40) keepmask &= 0xf0; // no odd\n } else {\n if (!(flags & 0x40)) keepmask &= 0xf0; // not no odd\n }\n curpix &= keepmask;\n if (flags & 0x10) // solid bit\n curpix |= (solid & ~keepmask);\n else\n curpix |= (srcdata & ~keepmask);\n if (dstaddr < 0x9800) // can cause recursion otherwise\n memwrite_williams(dstaddr, curpix);\n }\n\n // TODO\n /*\n var trace = false;\n var _traceinsns = {};\n function _trace() {\n var pc = cpu.getPC();\n if (!_traceinsns[pc]) {\n _traceinsns[pc] = 1;\n console.log(hex(pc), cpu.getTstates());\n }\n }\n */\n this.start = function() {\n ram = new RAM(0xc000);\n nvram = new RAM(0x400);\n rom = new Uint8Array(0xc000);\n // TODO: save in browser storage?\n //displayPCs = new Uint16Array(new ArrayBuffer(0x9800*2));\n membus = {\n read: memread_williams,\n write: memwrite_williams,\n };\n this.readAddress = membus.read;\n var iobus = {\n read: function(a) { return 0; },\n write: function(a, v) { console.log(hex(a), hex(v)); }\n }\n cpu = self.newCPU(membus, iobus);\n\n audio = new MasterAudio();\n worker = new Worker(\"./src/common/audio/z80worker.js\");\n workerchannel = new WorkerSoundChannel(worker);\n audio.master.addChannel(workerchannel);\n\n let rotate = options?.rotate == null ? -90 : parseFloat(options.rotate);\n video = new RasterVideo(mainElement, SCREEN_WIDTH, SCREEN_HEIGHT, { rotate });\n video.create();\n $(video.canvas).click(function(e) {\n var x = Math.floor(e.offsetX * video.canvas.width / $(video.canvas).width());\n var y = Math.floor(e.offsetY * video.canvas.height / $(video.canvas).height());\n var addr = (x >> 3) + (y * 32) + 0x400;\n if (displayPCs) console.log(x, y, hex(addr, 4), \"PC\", hex(displayPCs[addr], 4));\n });\n var idata = video.getFrameData();\n setKeyboardFromMap(video, pia6821, KEYCODE_MAP);\n pixels = video.getFrameData();\n timer = new AnimationTimer(60, this.nextFrame.bind(this));\n }\n\n this.getRasterScanline = function() { return video_counter; }\n\n this.advance = function(novideo: boolean) {\n var cpuCyclesPerSection = Math.round(cpuCyclesPerFrame / 65);\n for (var sl = 0; sl < 256; sl += 4) {\n video_counter = sl;\n // interrupts happen every 1/4 of the screen\n if (sl == 0 || sl == 0x3c || sl == 0xbc || sl == 0xfc) {\n if (membus.read != memread_defender || pia6821[7] == 0x3c) { // TODO?\n if (cpu.interrupt)\n cpu.interrupt();\n if (cpu.requestInterrupt)\n cpu.requestInterrupt();\n }\n }\n this.runCPU(cpu, cpuCyclesPerSection);\n if (sl < 256) video.updateFrame(0, 0, 256 - 4 - sl, 0, 4, 304);\n }\n // last 6 lines\n this.runCPU(cpu, cpuCyclesPerSection * 2);\n if (screenNeedsRefresh && !novideo) {\n for (var i = 0; i < 0x9800; i++)\n drawDisplayByte(i, ram.mem[i]);\n screenNeedsRefresh = false;\n }\n if (watchdog_enabled && watchdog_counter-- <= 0) {\n console.log(\"WATCHDOG FIRED, PC =\", cpu.getPC().toString(16)); // TODO: alert on video\n // TODO: this.breakpointHit(cpu.T());\n this.reset();\n }\n }\n\n this.loadSoundROM = function(data) {\n console.log(\"loading sound ROM \" + data.length + \" bytes\");\n var soundrom = padBytes(data, 0x4000);\n worker.postMessage({ rom: soundrom });\n }\n\n this.loadROM = function(title, data) {\n if (data.length > 2) {\n if (isDefender) {\n self.loadSoundROM(data.slice(0x6800));\n rom = rom.slice(0, 0x6800);\n } else if (data.length > 0xc000) {\n self.loadSoundROM(data.slice(0xc000));\n rom = rom.slice(0, 0xc000);\n } else if (data.length > 0x9000 && data[0x9000]) {\n self.loadSoundROM(data.slice(0x9000));\n }\n rom = padBytes(data, 0xc000);\n }\n self.reset();\n }\n\n this.loadState = function(state) {\n cpu.loadState(state.c);\n ram.mem.set(state.b);\n nvram.mem.set(state.nvram);\n pia6821.set(state.pia);\n blitregs.set(state.blt);\n watchdog_counter = state.wdc;\n banksel = state.bs;\n portsel = state.ps;\n }\n this.saveState = function() {\n return {\n c: self.getCPUState(),\n b: ram.mem.slice(0),\n nvram: nvram.mem.slice(0),\n pia: pia6821.slice(0),\n blt: blitregs.slice(0),\n wdc: watchdog_counter,\n bs: banksel,\n ps: portsel,\n };\n }\n this.loadControlsState = function(state) {\n pia6821.set(state.pia);\n }\n this.saveControlsState = function() {\n return {\n pia: pia6821.slice(0),\n };\n }\n this.getCPUState = function() {\n return cpu.saveState();\n }\n\n this.isRunning = function() {\n return timer && timer.isRunning();\n }\n this.pause = function() {\n timer.stop();\n audio.stop();\n }\n this.resume = function() {\n timer.start();\n audio.start();\n }\n this.reset = function() {\n cpu.reset();\n watchdog_counter = INITIAL_WATCHDOG;\n watchdog_enabled = false;\n banksel = 1;\n }\n this.scaleCPUFrequency = function(scale) {\n cpuScale = scale;\n cpuFrequency *= scale;\n cpuCyclesPerFrame *= scale;\n }\n this.getMemoryMap = function() { return { main:[\n {name:'Video RAM',start:0x0000,size:0xc000,type:'ram'},\n {name:'I/O Registers',start:0xc000,size:0x1000,type:'io'},\n ] } };\n this.showHelp = function() {\n return \"https://8bitworkshop.com/docs/platforms/arcade/#williams-hardware\"\n }\n}\n\nvar Williams6809Platform = function(mainElement, options) {\n this.__proto__ = new WilliamsPlatform(mainElement, null, options);\n}\n\nvar WilliamsZ80Platform = function(mainElement, options) {\n this.__proto__ = new WilliamsPlatform(mainElement, BaseZ80Platform, options);\n\n // Z80 @ 4 MHz\n // also scale bitblt clocks\n this.scaleCPUFrequency(4);\n\n this.ramStateToLongString = function(state) {\n var blt = state.blt;\n var sstart = (blt[2] << 8) + blt[3];\n var dstart = (blt[4] << 8) + blt[5];\n var w = blt[6] ^ 4; // blitter bug fix\n var h = blt[7] ^ 4;\n return \"\\nBLIT\"\n + \" \" + hex(sstart, 4) + \" \" + hex(dstart, 4)\n + \" w:\" + hex(w) + \" h:\" + hex(h)\n + \" f:\" + hex(blt[0]) + \" s:\" + hex(blt[1]);\n }\n}\n\nvar WilliamsDefenderPlatform = function(mainElement, options) {\n this.__proto__ = new WilliamsPlatform(mainElement, null, {isDefender:true});\n this.getMemoryMap = function() { return { main:[\n {name:'NVRAM',start:0x400,size:0x200,type:'ram'},\n {name:'Video RAM',start:0x0000,size:0xc000,type:'ram'},\n {name:'I/O Registers',start:0xc000,size:0x1000,type:'io'},\n {name:'ROM',start:0xd000,size:0x3000,type:'rom'},\n] } };\n}\n\nclass NewWilliamsPlatform extends Base6809MachinePlatform<WilliamsMachine> implements Platform {\n\n newMachine() { return new WilliamsMachine(false); }\n getPresets() { return WILLIAMS_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n readAddress(a) { return this.machine.readConst(a); }\n getMemoryMap() { \n return { main:[\n {name:'Video RAM',start:0x0000,size:0xc000,type:'ram'},\n {name:'I/O Registers',start:0xc000,size:0xc00,type:'io'},\n {name:'NVRAM',start:0xcc00,size:0x400,type:'ram'},\n {name:'ROM',start:0xd000,size:0x3000,type:'rom'},\n ] } };\n}\n\nPLATFORMS['williams'] = NewWilliamsPlatform;\nPLATFORMS['williams.old'] = Williams6809Platform;\nPLATFORMS['williams-defender'] = WilliamsDefenderPlatform;\nPLATFORMS['williams-z80'] = WilliamsZ80Platform;\n\n// http://seanriddle.com/willhard.html\n"],
"mappings": "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",
"names": []
}