8bitworkshop/gen/apple2-EBLV7QZ6.js.map

8 lines
87 KiB
Plaintext

{
"version": 3,
"sources": ["../src/machine/apple2.ts", "../src/platform/apple2.ts"],
"sourcesContent": ["\nimport { MOS6502, MOS6502State } from \"../common/cpu/MOS6502\";\nimport { Bus, BasicScanlineMachine, SavesState, AcceptsBIOS } from \"../common/devices\";\nimport { KeyFlags } from \"../common/emu\"; // TODO\nimport { hex, lzgmini, stringToByteArray, RGBA, printFlags, arrayCompare } from \"../common/util\";\n\ninterface AppleIIStateBase {\n ram : Uint8Array;\n soundstate : number;\n auxRAMselected,writeinhibit : boolean;\n auxRAMbank : number;\n}\n\ninterface AppleIIControlsState {\n inputs : Uint8Array; // unused?\n kbdlatch : number;\n}\n\ninterface AppleIIState extends AppleIIStateBase, AppleIIControlsState {\n c : MOS6502State;\n grswitch : number;\n slots: SlotDevice[];\n}\n\ninterface SlotDevice extends Bus {\n readROM(address: number) : number;\n readConst(address: number) : number;\n}\n\nexport class AppleII extends BasicScanlineMachine implements AcceptsBIOS {\n\n // approx: http://www.cs.columbia.edu/~sedwards/apple2fpga/\n cpuFrequency = 1022727;\n sampleRate = this.cpuFrequency;\n cpuCyclesPerLine = 65;\n cpuCyclesPerFrame = this.cpuCyclesPerLine * 262;\n canvasWidth = 280;\n numVisibleScanlines = 192;\n numTotalScanlines = 262;\n defaultROMSize = 0x13000; // we'll never need one that big, but...\n\n // these are set later\n LOAD_BASE = 0;\n HDR_SIZE = 0;\n\n ram = new Uint8Array(0x13000); // 64K + 16K LC RAM - 4K hardware + 12K ROM\n bios : Uint8Array;\n cpu = new MOS6502();\n grdirty = new Array(0xc000 >> 7);\n grparams = {dirty:this.grdirty, grswitch:GR_TXMODE, mem:this.ram};\n ap2disp;\n kbdlatch = 0;\n soundstate = 0;\n // language card switches\n auxRAMselected = false;\n auxRAMbank = 1;\n writeinhibit = true;\n // value to add when reading & writing each of these banks\n // bank 1 is E000-FFFF, bank 2 is D000-DFFF\n bank2rdoffset=0;\n bank2wroffset=0;\n // disk II\n slots : SlotDevice[] = new Array(8);\n // fake disk drive that loads program into RAM\n fakeDrive : SlotDevice = {\n readROM: (a) => {\n var pc = this.cpu.getPC();\n if (pc >= 0xC600 && pc < 0xC700) {\n // We're reading code to EXECUTE.\n // Load the built program directly into memory, and \"read\"\n // a JMP directly to it.\n //console.log(`fakeDrive (EXEC): ${a.toString(16)}`);\n switch (a) {\n // JMP VM_BASE\n case 0:\n // SHOULD load program into RAM here, but have to do it\n // below instead.\n return 0;\n case 1: return this.LOAD_BASE&0xff;\n case 2: return (this.LOAD_BASE>>8)&0xff;\n default: return 0;\n }\n }\n else {\n // We're reading code, but not executing it.\n // This is probably the Monitor routine to identify whether\n // this slot is a Disk ][ drive, so... give it what it wants.\n //console.log(`fakeDrive (NOEX): ${a.toString(16)}`);\n switch (a) {\n case 0:\n // Actually, if we get here, we probably ARE being\n // executed. For some reason, the instruction at $C600\n // gets read for execution, BEFORE the PC gets set to\n // the correct location. So we handle loading the program\n // into RAM and returning the JMP here, instead of above\n // where it would otherwise belong.\n if (this.rom) {\n this.loadRAMWithProgram();\n }\n return 0x4c; // JMP\n case 1: return 0x20;\n case 3: return 0x00;\n case 5: return 0x03;\n case 7: return 0x3c;\n default: return 0;\n }\n }\n },\n readConst: (a) => {\n return 0;\n },\n read: (a) => { return this.floatbus(); },\n write: (a,v) => { }\n };\n\n constructor() {\n super();\n this.loadBIOS(new lzgmini().decode(stringToByteArray(atob(APPLEIIGO_LZG))));\n this.connectCPUMemoryBus(this);\n // This line is inappropriate for real ROMs, but was there for\n // the APPLE][GO ROM, so keeping it only in the constructor, for\n // that special case (in case it really is important for this\n // address to be an RTS).\n this.bios[0xD39A - (0x10000 - this.bios.length)] = 0x60; // $d39a = RTS\n }\n saveState() : AppleIIState {\n // TODO: automagic\n return {\n c: this.cpu.saveState(),\n ram: this.ram.slice(),\n kbdlatch: this.kbdlatch,\n soundstate: this.soundstate,\n grswitch: this.grparams.grswitch,\n auxRAMselected: this.auxRAMselected,\n auxRAMbank: this.auxRAMbank,\n writeinhibit: this.writeinhibit,\n slots: this.slots.map((slot) => { return slot && slot['saveState'] && slot['saveState']() }),\n inputs: null\n };\n }\n loadState(s:AppleIIState) {\n this.cpu.loadState(s.c);\n this.ram.set(s.ram);\n this.kbdlatch = s.kbdlatch;\n this.soundstate = s.soundstate;\n this.grparams.grswitch = s.grswitch;\n this.auxRAMselected = s.auxRAMselected;\n this.auxRAMbank = s.auxRAMbank;\n this.writeinhibit = s.writeinhibit;\n this.setupLanguageCardConstants();\n for (var i=0; i<this.slots.length; i++)\n if (this.slots[i] && this.slots[i]['loadState'])\n this.slots[i]['loadState'](s.slots[i]);\n this.ap2disp.invalidate(); // repaint entire screen\n }\n saveControlsState() : AppleIIControlsState {\n return {inputs:null,kbdlatch:this.kbdlatch};\n }\n loadControlsState(s:AppleIIControlsState) {\n this.kbdlatch = s.kbdlatch;\n }\n loadBIOS(data, title?) {\n if (data.length != 0x3000) {\n console.log(`apple2 loadBIOS !!!WARNING!!!: BIOS wants length 0x3000, but BIOS '${title}' has length 0x${data.length.toString(16)}`);\n console.log(\"will load BIOS to end of memory anyway...\");\n }\n this.bios = Uint8Array.from(data);\n }\n loadROM(data) {\n // is it a 16-sector 35-track disk image?\n if (data.length == 16 * 35 * 256) {\n var diskii = new DiskII(this, data);\n this.slots[6] = diskii;\n this.reset();\n } else { // it's a binary, use a fake drive\n // set this.rom variable\n super.loadROM(data);\n // AppleSingle header? https://github.com/cc65/cc65/blob/master/libsrc/apple2/exehdr.s\n if (arrayCompare(this.rom.slice(0, 4), [0x00, 0x05, 0x16, 0x00])) {\n this.LOAD_BASE = this.rom[0x39] | (this.rom[0x38] << 8); // big endian\n this.HDR_SIZE = 58;\n } else {\n // 4-byte DOS header? (TODO: hacky detection)\n const origin = this.rom[0] | (this.rom[1] << 8);\n const size = this.rom[2] | (this.rom[3] << 8);\n let isPlausible = origin < 0xc000\n && origin + size < 0x13000\n && (origin == 0x803 || (origin & 0xff) == 0);\n if (size == data.length - 4 && isPlausible) {\n this.LOAD_BASE = origin;\n this.HDR_SIZE = 4;\n } else {\n // default = raw binary @ $803\n this.LOAD_BASE = 0x803;\n this.HDR_SIZE = 0;\n }\n }\n this.slots[6] = this.fakeDrive;\n }\n }\n loadRAMWithProgram() {\n console.log(`Loading program into Apple ][ RAM at \\$${this.LOAD_BASE.toString(16)}`);\n // truncate if needed to fit into RAM\n const exedata = this.rom.slice(this.HDR_SIZE, this.HDR_SIZE + this.ram.length - this.LOAD_BASE);\n this.ram.set(exedata, this.LOAD_BASE);\n // fake DOS detect for CC65 (TODO?)\n if (this.HDR_SIZE == 58) {\n this.ram[0xbf00] = 0x4c;\n this.ram[0xbf6f] = 0x01;\n }\n }\n reset() {\n this.auxRAMselected = false;\n this.auxRAMbank = 1;\n this.writeinhibit = true;\n this.ram.fill(0, 0x300, 0x400); // Clear soft-reset vector\n // (force hard reset)\n super.reset();\n this.skipboot();\n }\n skipboot() {\n // execute until $c600 boot\n for (var i=0; i<2000000; i++) {\n this.cpu.advanceClock();\n if ((this.cpu.getPC()>>8) == 0xc6) break;\n }\n // get out of $c600 boot\n for (var i=0; i<2000000; i++) {\n this.cpu.advanceClock();\n if ((this.cpu.getPC()>>8) < 0xc6) break;\n }\n }\n readConst(address: number): number {\n if (address < 0xc000) {\n return this.ram[address];\n } else if (address >= 0xd000) {\n if (!this.auxRAMselected)\n return this.bios[address - (0x10000 - this.bios.length)];\n else if (address >= 0xe000)\n return this.ram[address];\n else\n return this.ram[address + this.bank2rdoffset];\n } else if (address >= 0xc100 && address < 0xc800) {\n var slot = (address >> 8) & 7;\n return (this.slots[slot] && this.slots[slot].readConst(address & 0xff)) | 0;\n } else {\n return 0;\n }\n }\n read(address:number) : number {\n address &= 0xffff;\n if (address < 0xc000 || address >= 0xd000) {\n return this.readConst(address);\n } else if (address < 0xc100) {\n this.probe.logIORead(address, 0); // TODO: value\n var slot = (address >> 4) & 0x0f;\n switch (slot)\n {\n case 0:\n return this.kbdlatch;\n case 1:\n this.kbdlatch &= 0x7f;\n break;\n case 3:\n this.soundstate = this.soundstate ^ 1;\n break;\n case 5:\n if ((address & 0x0f) < 8) {\n // graphics\n if ((address & 1) != 0)\n this.grparams.grswitch |= 1 << ((address >> 1) & 0x07);\n else\n this.grparams.grswitch &= ~(1 << ((address >> 1) & 0x07));\n }\n break;\n case 6:\n // tapein, joystick, buttons\n switch (address & 7) {\n // buttons (off)\n case 1:\n case 2:\n case 3:\n return this.floatbus() & 0x7f;\n // joystick\n case 4:\n case 5:\n return this.floatbus() | 0x80;\n default:\n return this.floatbus();\n }\n case 7:\n // joy reset\n if (address == 0xc070)\n return this.floatbus() | 0x80;\n case 8:\n return this.doLanguageCardIO(address);\n case 9: case 10: case 11: case 12: case 13: case 14: case 15:\n return (this.slots[slot-8] && this.slots[slot-8].read(address & 0xf)) | 0;\n }\n } else if (address >= 0xc100 && address < 0xc800) {\n var slot = (address >> 8) & 7;\n return (this.slots[slot] && this.slots[slot].readROM(address & 0xff)) | 0;\n }\n return this.floatbus();\n }\n write(address:number, val:number) : void {\n address &= 0xffff;\n val &= 0xff;\n if (address < 0xc000) {\n this.ram[address] = val;\n this.grdirty[address>>7] = 1;\n } else if (address < 0xc080) {\n this.read(address); // strobe address, discard result\n } else if (address < 0xc100) {\n var slot = (address >> 4) & 0x0f;\n this.slots[slot-8] && this.slots[slot-8].write(address & 0xf, val);\n this.probe.logIOWrite(address, val);\n } else if (address >= 0xd000 && !this.writeinhibit) {\n if (address >= 0xe000)\n this.ram[address] = val;\n else\n this.ram[address + this.bank2wroffset] = val;\n }\n }\n // http://www.deater.net/weave/vmwprod/megademo/vapor_lock.html\n // https://retrocomputing.stackexchange.com/questions/14012/what-is-dram-refresh-and-why-is-the-weird-apple-ii-video-memory-layout-affected\n // http://www.apple-iigs.info/doc/fichiers/TheappleIIcircuitdescription1.pdf\n // http://rich12345.tripod.com/aiivideo/softalk.html\n // https://github.com/MiSTer-devel/Apple-II_MiSTer/blob/master/rtl/timing_generator.vhd\n floatbus() : number {\n var fcyc = this.frameCycles;\n var yline = Math.floor(fcyc / 65);\n var xcyc = Math.floor(fcyc % 65);\n var addr = this.ap2disp.getAddressForScanline(yline);\n return this.readConst(addr + xcyc);\n }\n\n connectVideo(pixels:Uint32Array) {\n super.connectVideo(pixels);\n this.ap2disp = this.pixels && new Apple2Display(this.pixels, this.grparams);\n }\n startScanline() {\n }\n drawScanline() {\n // TODO: draw scanline via ap2disp\n }\n advanceFrame(trap) : number {\n var clocks = super.advanceFrame(trap);\n this.ap2disp && this.ap2disp.updateScreen();\n return clocks;\n }\n advanceCPU() {\n this.audio.feedSample(this.soundstate, 1);\n return super.advanceCPU();\n }\n\n setKeyInput(key:number, code:number, flags:number) : void {\n //console.log(`setKeyInput: ${key} ${code} ${flags}`);\n if (flags & KeyFlags.KeyDown) {\n code = 0;\n switch (key) {\n case 16: case 17: case 18:\n break; // ignore shift/ctrl/etc\n case 8:\n code=8; // left\n if (flags & KeyFlags.Shift) {\n // (possibly) soft reset\n this.cpu.reset();\n return;\n }\n break;\n case 13: code=13; break; // return\n case 27: code=27; break; // escape\n case 37: code=8; break; // left\n case 39: code=21; break; // right\n case 38: code=11; break; // up\n case 40: code=10; break; // down\n case 48: if (flags & KeyFlags.Shift) code = 0x29; break; // )\n case 49: if (flags & KeyFlags.Shift) code = 0x21; break; // !\n case 50: if (flags & KeyFlags.Shift) code = 0x40; break; // @\n case 51: if (flags & KeyFlags.Shift) code = 0x23; break; // #\n case 52: if (flags & KeyFlags.Shift) code = 0x24; break; // $\n case 53: if (flags & KeyFlags.Shift) code = 0x25; break; // %\n case 54: if (flags & KeyFlags.Shift) code = 0x5e; break; // ^\n case 55: if (flags & KeyFlags.Shift) code = 0x26; break; // &\n case 56: if (flags & KeyFlags.Shift) code = 0x2a; break; // *\n case 57: if (flags & KeyFlags.Shift) code = 0x28; break; // (\n case 61: code = (flags & KeyFlags.Shift) ? 0x2b : 0x3d; break; // +\n case 173: code = (flags & KeyFlags.Shift) ? 0x5f : 0x2d; break; // _\n case 59: code = (flags & KeyFlags.Shift) ? 0x3a : 0x3b; break;\n case 188: code = (flags & KeyFlags.Shift) ? 0x3c : 0x2c; break;\n case 190: code = (flags & KeyFlags.Shift) ? 0x3e : 0x2e; break;\n case 191: code = (flags & KeyFlags.Shift) ? 0x3f : 0x2f; break;\n case 222: code = (flags & KeyFlags.Shift) ? 0x22 : 0x27; break;\n default:\n code = key;\n // convert to uppercase for Apple ][\n if (code >= 0x61 && code <= 0x7a) code -= 32;\n // convert to control codes if Ctrl pressed\n if (code >= 65 && code < 65+26) {\n if (flags & KeyFlags.Ctrl) code -= 64; // ctrl\n }\n }\n if (code) {\n this.kbdlatch = (code | 0x80) & 0xff;\n }\n }\n }\n \n doLanguageCardIO(address:number) {\n switch (address & 0x0f) {\n // Select aux RAM bank 2, write protected.\n case 0x0:\n case 0x4:\n this.auxRAMselected = true;\n this.auxRAMbank = 2;\n this.writeinhibit = true;\n break;\n // Select ROM, write enable aux RAM bank 2.\n case 0x1:\n case 0x5:\n this.auxRAMselected = false;\n this.auxRAMbank = 2;\n this.writeinhibit = false;\n break;\n // Select ROM, write protect aux RAM (either bank).\n case 0x2:\n case 0x6:\n case 0xA:\n case 0xE:\n this.auxRAMselected = false;\n this.writeinhibit = true;\n break;\n // Select aux RAM bank 2, write enabled.\n case 0x3:\n case 0x7:\n this.auxRAMselected = true;\n this.auxRAMbank = 2;\n this.writeinhibit = false;\n break;\n // Select aux RAM bank 1, write protected.\n case 0x8:\n case 0xC:\n this.auxRAMselected = true;\n this.auxRAMbank = 1;\n this.writeinhibit = true;\n break;\n // Select ROM, write enable aux RAM bank 1.\n case 0x9:\n case 0xD:\n this.auxRAMselected = false;\n this.auxRAMbank = 1;\n this.writeinhibit = false;\n break;\n // Select aux RAM bank 1, write enabled.\n case 0xB:\n case 0xF:\n this.auxRAMselected = true;\n this.auxRAMbank = 1;\n this.writeinhibit = false;\n break;\n }\n this.setupLanguageCardConstants();\n return this.floatbus();\n }\n\n setupLanguageCardConstants() {\n // reset language card constants\n if (this.auxRAMbank == 2)\n this.bank2rdoffset = -0x1000; // map 0xd000-0xdfff -> 0xc000-0xcfff\n else\n this.bank2rdoffset = 0x3000; // map 0xd000-0xdfff -> 0x10000-0x10fff\n if (this.auxRAMbank == 2)\n this.bank2wroffset = -0x1000; // map 0xd000-0xdfff -> 0xc000-0xcfff\n else\n this.bank2wroffset = 0x3000; // map 0xd000-0xdfff -> 0x10000-0x10fff\n }\n\n getDebugCategories() {\n return ['CPU','Stack','I/O','Disk'];\n }\n getDebugInfo(category:string, state:AppleIIState) {\n switch (category) {\n case 'I/O': return \"AUX RAM Bank: \" + state.auxRAMbank + \n \"\\nAUX RAM Select: \" + state.auxRAMselected +\n \"\\nAUX RAM Write: \" + !state.writeinhibit +\n \"\\n\\nGR Switches: \" + printFlags(state.grswitch, [\"Graphics\",\"Mixed\",\"Page2\",\"Hires\"], false) +\n \"\\n\";\n case 'Disk': return (this.slots[6] && this.slots[6]['toLongString'] && this.slots[6]['toLongString']()) || \"\\n\";\n }\n }\n}\n\nconst GR_TXMODE = 1;\nconst GR_MIXMODE = 2;\nconst GR_PAGE1 = 4;\nconst GR_HIRES = 8;\n\ntype AppleGRParams = {dirty:boolean[], grswitch:number, mem:Uint8Array};\n\nvar Apple2Display = function(pixels : Uint32Array, apple : AppleGRParams) {\n var XSIZE = 280;\n var YSIZE = 192;\n var PIXELON = 0xffffffff;\n var PIXELOFF = 0xff000000;\n\n var oldgrmode = -1;\n var textbuf = new Array(40*24);\n\n const flashInterval = 250;\n\n // https://mrob.com/pub/xapple2/colors.html\n const loresColor = [\n RGBA(0, 0, 0),\n RGBA(227, 30, 96),\n RGBA(96, 78, 189),\n RGBA(255, 68, 253),\n RGBA(0, 163, 96),\n RGBA(156, 156, 156),\n RGBA(20, 207, 253),\n RGBA(208, 195, 255),\n RGBA(96, 114, 3),\n RGBA(255, 106, 60),\n RGBA(156, 156, 156),\n RGBA(255, 160, 208),\n RGBA(20, 245, 60),\n RGBA(208, 221, 141),\n RGBA(114, 255, 208),\n RGBA(255, 255, 255)\n ];\n\n const text_lut = [\n 0x000, 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380,\n 0x028, 0x0a8, 0x128, 0x1a8, 0x228, 0x2a8, 0x328, 0x3a8,\n 0x050, 0x0d0, 0x150, 0x1d0, 0x250, 0x2d0, 0x350, 0x3d0\n ];\n\n const hires_lut = [\n 0x0000, 0x0400, 0x0800, 0x0c00, 0x1000, 0x1400, 0x1800, 0x1c00,\n 0x0080, 0x0480, 0x0880, 0x0c80, 0x1080, 0x1480, 0x1880, 0x1c80,\n 0x0100, 0x0500, 0x0900, 0x0d00, 0x1100, 0x1500, 0x1900, 0x1d00,\n 0x0180, 0x0580, 0x0980, 0x0d80, 0x1180, 0x1580, 0x1980, 0x1d80,\n 0x0200, 0x0600, 0x0a00, 0x0e00, 0x1200, 0x1600, 0x1a00, 0x1e00,\n 0x0280, 0x0680, 0x0a80, 0x0e80, 0x1280, 0x1680, 0x1a80, 0x1e80,\n 0x0300, 0x0700, 0x0b00, 0x0f00, 0x1300, 0x1700, 0x1b00, 0x1f00,\n 0x0380, 0x0780, 0x0b80, 0x0f80, 0x1380, 0x1780, 0x1b80, 0x1f80,\n 0x0028, 0x0428, 0x0828, 0x0c28, 0x1028, 0x1428, 0x1828, 0x1c28,\n 0x00a8, 0x04a8, 0x08a8, 0x0ca8, 0x10a8, 0x14a8, 0x18a8, 0x1ca8,\n 0x0128, 0x0528, 0x0928, 0x0d28, 0x1128, 0x1528, 0x1928, 0x1d28,\n 0x01a8, 0x05a8, 0x09a8, 0x0da8, 0x11a8, 0x15a8, 0x19a8, 0x1da8,\n 0x0228, 0x0628, 0x0a28, 0x0e28, 0x1228, 0x1628, 0x1a28, 0x1e28,\n 0x02a8, 0x06a8, 0x0aa8, 0x0ea8, 0x12a8, 0x16a8, 0x1aa8, 0x1ea8,\n 0x0328, 0x0728, 0x0b28, 0x0f28, 0x1328, 0x1728, 0x1b28, 0x1f28,\n 0x03a8, 0x07a8, 0x0ba8, 0x0fa8, 0x13a8, 0x17a8, 0x1ba8, 0x1fa8,\n 0x0050, 0x0450, 0x0850, 0x0c50, 0x1050, 0x1450, 0x1850, 0x1c50,\n 0x00d0, 0x04d0, 0x08d0, 0x0cd0, 0x10d0, 0x14d0, 0x18d0, 0x1cd0,\n 0x0150, 0x0550, 0x0950, 0x0d50, 0x1150, 0x1550, 0x1950, 0x1d50,\n 0x01d0, 0x05d0, 0x09d0, 0x0dd0, 0x11d0, 0x15d0, 0x19d0, 0x1dd0,\n 0x0250, 0x0650, 0x0a50, 0x0e50, 0x1250, 0x1650, 0x1a50, 0x1e50,\n 0x02d0, 0x06d0, 0x0ad0, 0x0ed0, 0x12d0, 0x16d0, 0x1ad0, 0x1ed0,\n 0x0350, 0x0750, 0x0b50, 0x0f50, 0x1350, 0x1750, 0x1b50, 0x1f50,\n 0x03d0, 0x07d0, 0x0bd0, 0x0fd0, 0x13d0, 0x17d0, 0x1bd0, 0x1fd0,\n // just for floating bus, y >= 192\n 0x0078, 0x0478, 0x0878, 0x0c78, 0x1078, 0x1478, 0x1878, 0x1c78,\n 0x00f8, 0x04f8, 0x08f8, 0x0cf8, 0x10f8, 0x14f8, 0x18f8, 0x1cf8,\n 0x0178, 0x0578, 0x0978, 0x0d78, 0x1178, 0x1578, 0x1978, 0x1d78, \n 0x01f8, 0x05f8, 0x09f8, 0x0df8, 0x11f8, 0x15f8, 0x19f8, 0x1df8, \n 0x0278, 0x0678, 0x0a78, 0x0e78, 0x1278, 0x1678, 0x1a78, 0x1e78, \n 0x02f8, 0x06f8, 0x0af8, 0x0ef8, 0x12f8, 0x16f8, 0x1af8, 0x1ef8, \n 0x0378, 0x0778, 0x0b78, 0x0f78, 0x1378, 0x1778, 0x1b78, 0x1f78, \n 0x03f8, 0x07f8, 0x0bf8, 0x0ff8, 0x13f8, 0x17f8, 0x1bf8, 0x1ff8, \n 0x0000, 0x0400, 0x0800, 0x0c00, 0x1000, 0x1400,\n ];\n\n var colors_lut;\n\n /**\n * This function makes the color lookup table for hires mode.\n * We make a table of 1024 * 2 * 7 entries.\n * Why? Because we assume each color byte has 10 bits\n * (8 real bits + 1 on each side) and we need different colors\n * for odd and even addresses (2) and each byte displays 7 pixels.\n */\n {\n colors_lut = new Array(256*4*2*7);\n var i,j;\n var c1,c2,c3 = 15;\n var base = 0;\n\n // go thru odd and even\n for (j=0; j<2; j++)\n {\n // go thru 1024 values\n for (var b1=0; b1<1024; b1++)\n {\n // see if the hi bit is set\n if ((b1 & 0x80) == 0)\n {\n c1 = 3; c2 = 12; // purple & green\n } else\n {\n c1 = 6; c2 = 9; // blue & orange\n }\n // make a value consisting of:\n // the 8th bit, then bits 0-7, then the 9th bit\n var b = ((b1 & 0x100) >> 8) | ((b1 & 0x7f) << 1) |\n ((b1 & 0x200) >> 1);\n // go through each pixel\n for (i=0; i<7; i++)\n {\n var c;\n // is this pixel lit?\n if (((2<<i)&b) != 0)\n {\n // are there pixels lit on both sides of this one?\n if (((7<<i)&b) == (7<<i))\n // yes, make it white\n c = 15;\n else\n // no, choose color based on odd/even byte\n // and odd/even pixel column\n c = ((((j ^ i) & 1) == 0) ? c1 : c2);\n } else\n {\n // are there pixels lit in the previous & next\n // column but none in this?\n if (((5<<i)&b) == (5<<i))\n // color this pixel\n c = ((((j ^ i) & 1) != 0) ? c1 : c2);\n else\n c = 0;\n }\n colors_lut[base] = loresColor[c];\n base++;\n }\n }\n }\n }\n\n function drawLoresChar(x, y, b)\n {\n var i,base,adr,c;\n base = (y<<3)*XSIZE + x*7; //(x<<2) + (x<<1) + x\n c = loresColor[b & 0x0f];\n for (i=0; i<4; i++)\n {\n pixels[base] =\n pixels[base+1] =\n pixels[base+2] =\n pixels[base+3] =\n pixels[base+4] =\n pixels[base+5] =\n pixels[base+6] = c;\n base += XSIZE;\n }\n c = loresColor[b >> 4];\n for (i=0; i<4; i++)\n {\n pixels[base] =\n pixels[base+1] =\n pixels[base+2] =\n pixels[base+3] =\n pixels[base+4] =\n pixels[base+5] =\n pixels[base+6] = c;\n base += XSIZE;\n }\n }\n\n function drawTextChar(x, y, b, invert)\n {\n var base = (y<<3)*XSIZE + x*7; // (x<<2) + (x<<1) + x\n var on,off;\n if (invert)\n {\n on = PIXELOFF;\n off = PIXELON;\n } else\n {\n on = PIXELON;\n off = PIXELOFF;\n }\n\n for (var yy=0; yy<8; yy++)\n {\n var chr = apple2_charset[(b<<3)+yy];\n pixels[base] = ((chr & 64) > 0)?on:off;\n pixels[base+1] = ((chr & 32) > 0)?on:off;\n pixels[base+2] = ((chr & 16) > 0)?on:off;\n pixels[base+3] = ((chr & 8) > 0)?on:off;\n pixels[base+4] = ((chr & 4) > 0)?on:off;\n pixels[base+5] = ((chr & 2) > 0)?on:off;\n pixels[base+6] = ((chr & 1) > 0)?on:off;\n base += XSIZE;\n }\n }\n\n this.getAddressForScanline = function(y:number) : number {\n var base = hires_lut[y];\n if ((apple.grswitch & GR_HIRES) && (y < 160 || !(apple.grswitch & GR_MIXMODE)))\n base = base | ((apple.grswitch & GR_PAGE1) ? 0x4000 : 0x2000);\n else\n base = (base & 0x3ff) | ((apple.grswitch & GR_PAGE1) ? 0x800 : 0x400);\n return base;\n }\n\n function drawHiresLines(y, maxy)\n {\n var yb = y*XSIZE;\n for (; y < maxy; y++)\n {\n var base = hires_lut[y] + (((apple.grswitch & GR_PAGE1) != 0) ? 0x4000 : 0x2000);\n if (!apple.dirty[base >> 7])\n {\n yb += XSIZE;\n continue;\n }\n var c1, c2;\n var b = 0;\n var b1 = apple.mem[base] & 0xff;\n for (var x1=0; x1<20; x1++)\n {\n var b2 = apple.mem[base+1] & 0xff;\n var b3 = apple.mem[base+2] & 0xff;\n var d1 = (((b&0x40)<<2) | b1 | b2<<9) & 0x3ff;\n for (var i=0; i<7; i++)\n pixels[yb+i] = colors_lut[d1*7+i];\n var d2 = (((b1&0x40)<<2) | b2 | b3<<9) & 0x3ff;\n for (var i=0; i<7; i++)\n pixels[yb+7+i] = colors_lut[d2*7+7168+i];\n yb += 14;\n base += 2;\n b = b2;\n b1 = b3;\n }\n }\n }\n\n function drawLoresLine(y)\n {\n // get the base address of this line\n var base = text_lut[y] +\n (((apple.grswitch & GR_PAGE1) != 0) ? 0x800 : 0x400);\n //\t\tif (!dirty[base >> 7])\n //\t\t return;\n for (var x=0; x<40; x++)\n {\n var b = apple.mem[base+x] & 0xff;\n // if the char. changed, draw it\n if (b != textbuf[y*40+x])\n {\n drawLoresChar(x, y, b);\n textbuf[y*40+x] = b;\n }\n }\n }\n\n function drawTextLine(y, flash)\n {\n // get the base address of this line\n var base = text_lut[y] +\n (((apple.grswitch & GR_PAGE1) != 0) ? 0x800 : 0x400);\n //\t\tif (!dirty[base >> 7])\n //\t\t return;\n for (var x=0; x<40; x++)\n {\n var b = apple.mem[base+x] & 0xff;\n var invert;\n // invert flash characters 1/2 of the time\n if (b >= 0x80)\n {\n invert = false;\n } else if (b >= 0x40)\n {\n invert = flash;\n if (flash)\n b -= 0x40;\n else\n b += 0x40;\n } else\n invert = true;\n // if the char. changed, draw it\n if (b != textbuf[y*40+x])\n {\n drawTextChar(x, y, b & 0x7f, invert);\n textbuf[y*40+x] = b;\n }\n }\n }\n\n this.updateScreen = function(totalrepaint)\n {\n var y;\n var flash = (new Date().getTime() % (flashInterval<<1)) > flashInterval;\n\n // if graphics mode changed, repaint whole screen\n if (apple.grswitch != oldgrmode)\n {\n oldgrmode = apple.grswitch;\n totalrepaint = true;\n }\n if (totalrepaint)\n {\n // clear textbuf if in text mode\n if ((apple.grswitch & GR_TXMODE) != 0 || (apple.grswitch & GR_MIXMODE) != 0)\n {\n for (y=0; y<24; y++)\n for (var x=0; x<40; x++)\n textbuf[y*40+x] = -1;\n }\n for (var i=0; i<apple.dirty.length; i++)\n apple.dirty[i] = true;\n }\n\n // first, draw top part of window\n if ((apple.grswitch & GR_TXMODE) != 0)\n {\n for (y=0; y<20; y++)\n drawTextLine(y, flash);\n } else\n {\n if ((apple.grswitch & GR_HIRES) != 0)\n drawHiresLines(0, 160);\n else\n for (y=0; y<20; y++)\n drawLoresLine(y);\n }\n\n // now do mixed part of window\n if ((apple.grswitch & GR_TXMODE) != 0 || (apple.grswitch & GR_MIXMODE) != 0)\n {\n for (y=20; y<24; y++)\n drawTextLine(y, flash);\n } else\n {\n if ((apple.grswitch & GR_HIRES) != 0)\n drawHiresLines(160, 192);\n else\n for (y=20; y<24; y++)\n drawLoresLine(y);\n }\n for (var i=0; i<apple.dirty.length; i++)\n apple.dirty[i] = false;\n }\n \n this.invalidate = function() {\n oldgrmode = -1;\n }\n}\n\n/*exported apple2_charset */\n\nconst apple2_charset = [\n 0x00,0x1c,0x22,0x2a,0x2e,0x2c,0x20,0x1e,\n 0x00,0x08,0x14,0x22,0x22,0x3e,0x22,0x22,\n 0x00,0x3c,0x22,0x22,0x3c,0x22,0x22,0x3c,\n 0x00,0x1c,0x22,0x20,0x20,0x20,0x22,0x1c,\n 0x00,0x3c,0x22,0x22,0x22,0x22,0x22,0x3c,\n 0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x3e,\n 0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x20,\n 0x00,0x1e,0x20,0x20,0x20,0x26,0x22,0x1e,\n 0x00,0x22,0x22,0x22,0x3e,0x22,0x22,0x22,\n 0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x1c,\n 0x00,0x02,0x02,0x02,0x02,0x02,0x22,0x1c,\n 0x00,0x22,0x24,0x28,0x30,0x28,0x24,0x22,\n 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3e,\n 0x00,0x22,0x36,0x2a,0x2a,0x22,0x22,0x22,\n 0x00,0x22,0x22,0x32,0x2a,0x26,0x22,0x22,\n 0x00,0x1c,0x22,0x22,0x22,0x22,0x22,0x1c,\n 0x00,0x3c,0x22,0x22,0x3c,0x20,0x20,0x20,\n 0x00,0x1c,0x22,0x22,0x22,0x2a,0x24,0x1a,\n 0x00,0x3c,0x22,0x22,0x3c,0x28,0x24,0x22,\n 0x00,0x1c,0x22,0x20,0x1c,0x02,0x22,0x1c,\n 0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,\n 0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x1c,\n 0x00,0x22,0x22,0x22,0x22,0x22,0x14,0x08,\n 0x00,0x22,0x22,0x22,0x2a,0x2a,0x36,0x22,\n 0x00,0x22,0x22,0x14,0x08,0x14,0x22,0x22,\n 0x00,0x22,0x22,0x14,0x08,0x08,0x08,0x08,\n 0x00,0x3e,0x02,0x04,0x08,0x10,0x20,0x3e,\n 0x00,0x3e,0x30,0x30,0x30,0x30,0x30,0x3e,\n 0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x00,\n 0x00,0x3e,0x06,0x06,0x06,0x06,0x06,0x3e,\n 0x00,0x00,0x00,0x08,0x14,0x22,0x00,0x00,\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n 0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x08,\n 0x00,0x14,0x14,0x14,0x00,0x00,0x00,0x00,\n 0x00,0x14,0x14,0x3e,0x14,0x3e,0x14,0x14,\n 0x00,0x08,0x1e,0x28,0x1c,0x0a,0x3c,0x08,\n 0x00,0x30,0x32,0x04,0x08,0x10,0x26,0x06,\n 0x00,0x10,0x28,0x28,0x10,0x2a,0x24,0x1a,\n 0x00,0x08,0x08,0x08,0x00,0x00,0x00,0x00,\n 0x00,0x08,0x10,0x20,0x20,0x20,0x10,0x08,\n 0x00,0x08,0x04,0x02,0x02,0x02,0x04,0x08,\n 0x00,0x08,0x2a,0x1c,0x08,0x1c,0x2a,0x08,\n 0x00,0x00,0x08,0x08,0x3e,0x08,0x08,0x00,\n 0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,\n 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,\n 0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x00,\n 0x00,0x1c,0x22,0x26,0x2a,0x32,0x22,0x1c,\n 0x00,0x08,0x18,0x08,0x08,0x08,0x08,0x1c,\n 0x00,0x1c,0x22,0x02,0x0c,0x10,0x20,0x3e,\n 0x00,0x3e,0x02,0x04,0x0c,0x02,0x22,0x1c,\n 0x00,0x04,0x0c,0x14,0x24,0x3e,0x04,0x04,\n 0x00,0x3e,0x20,0x3c,0x02,0x02,0x22,0x1c,\n 0x00,0x0e,0x10,0x20,0x3c,0x22,0x22,0x1c,\n 0x00,0x3e,0x02,0x04,0x08,0x10,0x10,0x10,\n 0x00,0x1c,0x22,0x22,0x1c,0x22,0x22,0x1c,\n 0x00,0x1c,0x22,0x22,0x1e,0x02,0x04,0x38,\n 0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,\n 0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x10,\n 0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,\n 0x00,0x00,0x00,0x3e,0x00,0x3e,0x00,0x00,\n 0x00,0x10,0x08,0x04,0x02,0x04,0x08,0x10,\n 0x00,0x1c,0x22,0x04,0x08,0x08,0x00,0x08,\n 0x80,0x9c,0xa2,0xaa,0xae,0xac,0xa0,0x9e,\n 0x80,0x88,0x94,0xa2,0xa2,0xbe,0xa2,0xa2,\n 0x80,0xbc,0xa2,0xa2,0xbc,0xa2,0xa2,0xbc,\n 0x80,0x9c,0xa2,0xa0,0xa0,0xa0,0xa2,0x9c,\n 0x80,0xbc,0xa2,0xa2,0xa2,0xa2,0xa2,0xbc,\n 0x80,0xbe,0xa0,0xa0,0xbc,0xa0,0xa0,0xbe,\n 0x80,0xbe,0xa0,0xa0,0xbc,0xa0,0xa0,0xa0,\n 0x80,0x9e,0xa0,0xa0,0xa0,0xa6,0xa2,0x9e,\n 0x80,0xa2,0xa2,0xa2,0xbe,0xa2,0xa2,0xa2,\n 0x80,0x9c,0x88,0x88,0x88,0x88,0x88,0x9c,\n 0x80,0x82,0x82,0x82,0x82,0x82,0xa2,0x9c,\n 0x80,0xa2,0xa4,0xa8,0xb0,0xa8,0xa4,0xa2,\n 0x80,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xbe,\n 0x80,0xa2,0xb6,0xaa,0xaa,0xa2,0xa2,0xa2,\n 0x80,0xa2,0xa2,0xb2,0xaa,0xa6,0xa2,0xa2,\n 0x80,0x9c,0xa2,0xa2,0xa2,0xa2,0xa2,0x9c,\n 0x80,0xbc,0xa2,0xa2,0xbc,0xa0,0xa0,0xa0,\n 0x80,0x9c,0xa2,0xa2,0xa2,0xaa,0xa4,0x9a,\n 0x80,0xbc,0xa2,0xa2,0xbc,0xa8,0xa4,0xa2,\n 0x80,0x9c,0xa2,0xa0,0x9c,0x82,0xa2,0x9c,\n 0x80,0xbe,0x88,0x88,0x88,0x88,0x88,0x88,\n 0x80,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0x9c,\n 0x80,0xa2,0xa2,0xa2,0xa2,0xa2,0x94,0x88,\n 0x80,0xa2,0xa2,0xa2,0xaa,0xaa,0xb6,0xa2,\n 0x80,0xa2,0xa2,0x94,0x88,0x94,0xa2,0xa2,\n 0x80,0xa2,0xa2,0x94,0x88,0x88,0x88,0x88,\n 0x80,0xbe,0x82,0x84,0x88,0x90,0xa0,0xbe,\n 0x80,0xbe,0xb0,0xb0,0xb0,0xb0,0xb0,0xbe,\n 0x80,0x80,0xa0,0x90,0x88,0x84,0x82,0x80,\n 0x80,0xbe,0x86,0x86,0x86,0x86,0x86,0xbe,\n 0x80,0x80,0x80,0x88,0x94,0xa2,0x80,0x80,\n 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xbe,\n 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\n 0x80,0x88,0x88,0x88,0x88,0x88,0x80,0x88,\n 0x80,0x94,0x94,0x94,0x80,0x80,0x80,0x80,\n 0x80,0x94,0x94,0xbe,0x94,0xbe,0x94,0x94,\n 0x80,0x88,0x9e,0xa8,0x9c,0x8a,0xbc,0x88,\n 0x80,0xb0,0xb2,0x84,0x88,0x90,0xa6,0x86,\n 0x80,0x90,0xa8,0xa8,0x90,0xaa,0xa4,0x9a,\n 0x80,0x88,0x88,0x88,0x80,0x80,0x80,0x80,\n 0x80,0x88,0x90,0xa0,0xa0,0xa0,0x90,0x88,\n 0x80,0x88,0x84,0x82,0x82,0x82,0x84,0x88,\n 0x80,0x88,0xaa,0x9c,0x88,0x9c,0xaa,0x88,\n 0x80,0x80,0x88,0x88,0xbe,0x88,0x88,0x80,\n 0x80,0x80,0x80,0x80,0x80,0x88,0x88,0x90,\n 0x80,0x80,0x80,0x80,0xbe,0x80,0x80,0x80,\n 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x88,\n 0x80,0x80,0x82,0x84,0x88,0x90,0xa0,0x80,\n 0x80,0x9c,0xa2,0xa6,0xaa,0xb2,0xa2,0x9c,\n 0x80,0x88,0x98,0x88,0x88,0x88,0x88,0x9c,\n 0x80,0x9c,0xa2,0x82,0x8c,0x90,0xa0,0xbe,\n 0x80,0xbe,0x82,0x84,0x8c,0x82,0xa2,0x9c,\n 0x80,0x84,0x8c,0x94,0xa4,0xbe,0x84,0x84,\n 0x80,0xbe,0xa0,0xbc,0x82,0x82,0xa2,0x9c,\n 0x80,0x8e,0x90,0xa0,0xbc,0xa2,0xa2,0x9c,\n 0x80,0xbe,0x82,0x84,0x88,0x90,0x90,0x90,\n 0x80,0x9c,0xa2,0xa2,0x9c,0xa2,0xa2,0x9c,\n 0x80,0x9c,0xa2,0xa2,0x9e,0x82,0x84,0xb8,\n 0x80,0x80,0x80,0x88,0x80,0x88,0x80,0x80,\n 0x80,0x80,0x80,0x88,0x80,0x88,0x88,0x90,\n 0x80,0x84,0x88,0x90,0xa0,0x90,0x88,0x84,\n 0x80,0x80,0x80,0xbe,0x80,0xbe,0x80,0x80,\n 0x80,0x90,0x88,0x84,0x82,0x84,0x88,0x90,\n 0x80,0x9c,0xa2,0x84,0x88,0x88,0x80,0x88,\n 0x00,0x1c,0x22,0x2a,0x2e,0x2c,0x20,0x1e,\n 0x00,0x08,0x14,0x22,0x22,0x3e,0x22,0x22,\n 0x00,0x3c,0x22,0x22,0x3c,0x22,0x22,0x3c,\n 0x00,0x1c,0x22,0x20,0x20,0x20,0x22,0x1c,\n 0x00,0x3c,0x22,0x22,0x22,0x22,0x22,0x3c,\n 0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x3e,\n 0x00,0x3e,0x20,0x20,0x3c,0x20,0x20,0x20,\n 0x00,0x1e,0x20,0x20,0x20,0x26,0x22,0x1e,\n 0x00,0x22,0x22,0x22,0x3e,0x22,0x22,0x22,\n 0x00,0x1c,0x08,0x08,0x08,0x08,0x08,0x1c,\n 0x00,0x02,0x02,0x02,0x02,0x02,0x22,0x1c,\n 0x00,0x22,0x24,0x28,0x30,0x28,0x24,0x22,\n 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x3e,\n 0x00,0x22,0x36,0x2a,0x2a,0x22,0x22,0x22,\n 0x00,0x22,0x22,0x32,0x2a,0x26,0x22,0x22,\n 0x00,0x1c,0x22,0x22,0x22,0x22,0x22,0x1c,\n 0x00,0x3c,0x22,0x22,0x3c,0x20,0x20,0x20,\n 0x00,0x1c,0x22,0x22,0x22,0x2a,0x24,0x1a,\n 0x00,0x3c,0x22,0x22,0x3c,0x28,0x24,0x22,\n 0x00,0x1c,0x22,0x20,0x1c,0x02,0x22,0x1c,\n 0x00,0x3e,0x08,0x08,0x08,0x08,0x08,0x08,\n 0x00,0x22,0x22,0x22,0x22,0x22,0x22,0x1c,\n 0x00,0x22,0x22,0x22,0x22,0x22,0x14,0x08,\n 0x00,0x22,0x22,0x22,0x2a,0x2a,0x36,0x22,\n 0x00,0x22,0x22,0x14,0x08,0x14,0x22,0x22,\n 0x00,0x22,0x22,0x14,0x08,0x08,0x08,0x08,\n 0x00,0x3e,0x02,0x04,0x08,0x10,0x20,0x3e,\n 0x00,0x3e,0x30,0x30,0x30,0x30,0x30,0x3e,\n 0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x00,\n 0x00,0x3e,0x06,0x06,0x06,0x06,0x06,0x3e,\n 0x00,0x00,0x00,0x08,0x14,0x22,0x00,0x00,\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\n 0x00,0x08,0x08,0x08,0x08,0x08,0x00,0x08,\n 0x00,0x14,0x14,0x14,0x00,0x00,0x00,0x00,\n 0x00,0x14,0x14,0x3e,0x14,0x3e,0x14,0x14,\n 0x00,0x08,0x1e,0x28,0x1c,0x0a,0x3c,0x08,\n 0x00,0x30,0x32,0x04,0x08,0x10,0x26,0x06,\n 0x00,0x10,0x28,0x28,0x10,0x2a,0x24,0x1a,\n 0x00,0x08,0x08,0x08,0x00,0x00,0x00,0x00,\n 0x00,0x08,0x10,0x20,0x20,0x20,0x10,0x08,\n 0x00,0x08,0x04,0x02,0x02,0x02,0x04,0x08,\n 0x00,0x08,0x2a,0x1c,0x08,0x1c,0x2a,0x08,\n 0x00,0x00,0x08,0x08,0x3e,0x08,0x08,0x00,\n 0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,\n 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,\n 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,\n 0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x00,\n 0x00,0x1c,0x22,0x26,0x2a,0x32,0x22,0x1c,\n 0x00,0x08,0x18,0x08,0x08,0x08,0x08,0x1c,\n 0x00,0x1c,0x22,0x02,0x0c,0x10,0x20,0x3e,\n 0x00,0x3e,0x02,0x04,0x0c,0x02,0x22,0x1c,\n 0x00,0x04,0x0c,0x14,0x24,0x3e,0x04,0x04,\n 0x00,0x3e,0x20,0x3c,0x02,0x02,0x22,0x1c,\n 0x00,0x0e,0x10,0x20,0x3c,0x22,0x22,0x1c,\n 0x00,0x3e,0x02,0x04,0x08,0x10,0x10,0x10,\n 0x00,0x1c,0x22,0x22,0x1c,0x22,0x22,0x1c,\n 0x00,0x1c,0x22,0x22,0x1e,0x02,0x04,0x38,\n 0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,\n 0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x10,\n 0x00,0x04,0x08,0x10,0x20,0x10,0x08,0x04,\n 0x00,0x00,0x00,0x3e,0x00,0x3e,0x00,0x00,\n 0x00,0x10,0x08,0x04,0x02,0x04,0x08,0x10,\n 0x00,0x1c,0x22,0x04,0x08,0x08,0x00,0x08,\n 0x80,0x9c,0xa2,0xaa,0xae,0xac,0xa0,0x9e,\n 0x80,0x88,0x94,0xa2,0xa2,0xbe,0xa2,0xa2,\n 0x80,0xbc,0xa2,0xa2,0xbc,0xa2,0xa2,0xbc,\n 0x80,0x9c,0xa2,0xa0,0xa0,0xa0,0xa2,0x9c,\n 0x80,0xbc,0xa2,0xa2,0xa2,0xa2,0xa2,0xbc,\n 0x80,0xbe,0xa0,0xa0,0xbc,0xa0,0xa0,0xbe,\n 0x80,0xbe,0xa0,0xa0,0xbc,0xa0,0xa0,0xa0,\n 0x80,0x9e,0xa0,0xa0,0xa0,0xa6,0xa2,0x9e,\n 0x80,0xa2,0xa2,0xa2,0xbe,0xa2,0xa2,0xa2,\n 0x80,0x9c,0x88,0x88,0x88,0x88,0x88,0x9c,\n 0x80,0x82,0x82,0x82,0x82,0x82,0xa2,0x9c,\n 0x80,0xa2,0xa4,0xa8,0xb0,0xa8,0xa4,0xa2,\n 0x80,0xa0,0xa0,0xa0,0xa0,0xa0,0xa0,0xbe,\n 0x80,0xa2,0xb6,0xaa,0xaa,0xa2,0xa2,0xa2,\n 0x80,0xa2,0xa2,0xb2,0xaa,0xa6,0xa2,0xa2,\n 0x80,0x9c,0xa2,0xa2,0xa2,0xa2,0xa2,0x9c,\n 0x80,0xbc,0xa2,0xa2,0xbc,0xa0,0xa0,0xa0,\n 0x80,0x9c,0xa2,0xa2,0xa2,0xaa,0xa4,0x9a,\n 0x80,0xbc,0xa2,0xa2,0xbc,0xa8,0xa4,0xa2,\n 0x80,0x9c,0xa2,0xa0,0x9c,0x82,0xa2,0x9c,\n 0x80,0xbe,0x88,0x88,0x88,0x88,0x88,0x88,\n 0x80,0xa2,0xa2,0xa2,0xa2,0xa2,0xa2,0x9c,\n 0x80,0xa2,0xa2,0xa2,0xa2,0xa2,0x94,0x88,\n 0x80,0xa2,0xa2,0xa2,0xaa,0xaa,0xb6,0xa2,\n 0x80,0xa2,0xa2,0x94,0x88,0x94,0xa2,0xa2,\n 0x80,0xa2,0xa2,0x94,0x88,0x88,0x88,0x88,\n 0x80,0xbe,0x82,0x84,0x88,0x90,0xa0,0xbe,\n 0x80,0xbe,0xb0,0xb0,0xb0,0xb0,0xb0,0xbe,\n 0x80,0x80,0xa0,0x90,0x88,0x84,0x82,0x80,\n 0x80,0xbe,0x86,0x86,0x86,0x86,0x86,0xbe,\n 0x80,0x80,0x80,0x88,0x94,0xa2,0x80,0x80,\n 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xbe,\n 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\n 0x80,0x88,0x88,0x88,0x88,0x88,0x80,0x88,\n 0x80,0x94,0x94,0x94,0x80,0x80,0x80,0x80,\n 0x80,0x94,0x94,0xbe,0x94,0xbe,0x94,0x94,\n 0x80,0x88,0x9e,0xa8,0x9c,0x8a,0xbc,0x88,\n 0x80,0xb0,0xb2,0x84,0x88,0x90,0xa6,0x86,\n 0x80,0x90,0xa8,0xa8,0x90,0xaa,0xa4,0x9a,\n 0x80,0x88,0x88,0x88,0x80,0x80,0x80,0x80,\n 0x80,0x88,0x90,0xa0,0xa0,0xa0,0x90,0x88,\n 0x80,0x88,0x84,0x82,0x82,0x82,0x84,0x88,\n 0x80,0x88,0xaa,0x9c,0x88,0x9c,0xaa,0x88,\n 0x80,0x80,0x88,0x88,0xbe,0x88,0x88,0x80,\n 0x80,0x80,0x80,0x80,0x80,0x88,0x88,0x90,\n 0x80,0x80,0x80,0x80,0xbe,0x80,0x80,0x80,\n 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x88,\n 0x80,0x80,0x82,0x84,0x88,0x90,0xa0,0x80,\n 0x80,0x9c,0xa2,0xa6,0xaa,0xb2,0xa2,0x9c,\n 0x80,0x88,0x98,0x88,0x88,0x88,0x88,0x9c,\n 0x80,0x9c,0xa2,0x82,0x8c,0x90,0xa0,0xbe,\n 0x80,0xbe,0x82,0x84,0x8c,0x82,0xa2,0x9c,\n 0x80,0x84,0x8c,0x94,0xa4,0xbe,0x84,0x84,\n 0x80,0xbe,0xa0,0xbc,0x82,0x82,0xa2,0x9c,\n 0x80,0x8e,0x90,0xa0,0xbc,0xa2,0xa2,0x9c,\n 0x80,0xbe,0x82,0x84,0x88,0x90,0x90,0x90,\n 0x80,0x9c,0xa2,0xa2,0x9c,0xa2,0xa2,0x9c,\n 0x80,0x9c,0xa2,0xa2,0x9e,0x82,0x84,0xb8,\n 0x80,0x80,0x80,0x88,0x80,0x88,0x80,0x80,\n 0x80,0x80,0x80,0x88,0x80,0x88,0x88,0x90,\n 0x80,0x84,0x88,0x90,0xa0,0x90,0x88,0x84,\n 0x80,0x80,0x80,0xbe,0x80,0xbe,0x80,0x80,\n 0x80,0x90,0x88,0x84,0x82,0x84,0x88,0x90,\n 0x80,0x9c,0xa2,0x84,0x88,0x88,0x80,0x88\n];\n\n// public domain ROM (http://a2go.applearchives.com/roms/)\nconst APPLEIIGO_LZG = `TFpHAAAwAAAABYxwdy2NARUZHjRBUFBMRUlJR08gUk9NMS4wADQfNB80HzQfNB80HzQfNB80HDQGIADgGR97GR+uNB80Hxk/azQfNB8ZP2UZH4s0HzQfNB80HzQfNB80HzQfNB80HzQfNB80HTQPoCA0HCAgoBkOKAEQEAwFEw8GFCAODxQgARYBCQwBAgwFGRAoxs/SoM3P0sWgyc4eA83B1MnPzqDQzMXB08Wgw8zJw8ugHgigGQgo1MjFoMHQHhnJycfPoMzPNIHCxczP1x4cNAoZHvhMA+AgWPyiJ70A352ABMoQ9x4DMN+dAAUewx5OGQUDYB4DBh7DkB4ZBx4DTEDgNEEZP7s0HzQfNB80HzQfNB80HzQfNB80HzQfNB80HzQfNB80HzQfNB80HzQfNB80HjQYyc6w7snJkOrJzPDm0OjqNAtISikDCQSFKWgpGJACaX+FKAoKBSiFKGAZHnQApSUgwftlIBkdSzQVpSJIICT8pSiFKqUphSukIYhoaQHFI7ANHk6xKJEqiBD5MOGgACCe/LCGpCSpoJEoyMQhkPkZHsc0G6QksShIKT8JQJEoaGw4GRMbIAz9IKX7NKHJm/DzGRyNNAYgjv2lMyDt/aIBivDzyiA1/cmV0AKxKMngkAIp350AAsmN0LIgnPypjdBbpD2mPB4nIED5oACprUzt/RlfdjQfNB80HzQfNB80HzQfNB80HzQfNB80HjQFqQCFHKXmhRugAIQapRyRGiB+9MjQ9uYbpRspH9DuYIXihuCE4UgpwIUmSkoFJoUmaIUnCgoKJic0QmYmpScpHwXmhSeKwADwBaAjaQTI6Qew+4Tlqr259IUwmEql5IUcsBUcACM0BArJwBAGpRxJf4UcGf7aNB80HzQfNB80HzQfNBw0CkoIIEf4KKkPkAJp4IUusSZFMCUuUSaRJmAgAPjELLARyCAO+JD2aQFIHghoxS2Q9WCgL9ACoCeELaAnqQCFMCAo+IgQ9mAVBQR+JxUGBH4mCgoZgjRgpTAYaQMpD4UwCjQBBTCFMBln35AESjQBKQ8Za/CoSpAJarAQyaLwDCmHSqq9YvkgefjQBKCAqQCqvab5hS4pA4UvmCmPqpigA+CK8AtKkAhKSgkgiND6yIjQ8hmfOzQfNB80FNgghP4gL/sgk/4gif6tWMCtWsCtXcCtX8Ct/88sEMDYIDr/IGD7qQCFAKnGhQFsGR5vNB0VAxNs3dvHzxkKDa1wwKAA6uq9ZMAQBMjQ+IhgqQCFSK1WwK1UwK1RwKkA8AutUMCtU8AgNvipFIUiHhYgqSiFIakYhSOpF4UlTCL8IFj8oAm5CPuZDgSI0PdgrfMDSaWN9ANgyY3QGKwAwBATwJPQDywQwB5E+8CD8AMeBEz9+xUdB/gVEAf4yYfQEqlAIKj8oMCpDDTBrTDAiND1YKQkkSjmJKUkxSGwZmDJoLDvqBDsyY3wWsmKNGGI0MnGJBDopSGFJMYkpSLFJbALxiUVHAf4AEggJPwgnvygAGhpAMUjkPCwyqUihSWgAIQk8OSpAIUk5h4+HhC2xiUVHQf4FQYH+DhI6QHQ/Gg0gfZg5kLQAuZDpTzFPqU95T/mPB4GPRl99BUcB/jmTtAC5k8sAMAQ9ZEorQDALBDAYBUKB/j+YKUySKn/hTK9AAIg7f1oHoHJiPAdyZjwCuD4kAMgOv/o0BOp3B4VFQoH+P4VHgf4NBsASBmiWCDl/WgpDwmwybqQAmkGbDYAyaCQAiUyhDVIIHj7aKQ1GTEvQBkKBRkLGLE8kUIgtPyQ9xm+YTQBoD/QAqD/hDIZYlI+ojigG9AIHoI2oPClPikP8AYJwKAA8AKp/ZQAlQFg6upMFR8eQzQHqYdM7f2lSEilRaZGpEcZbhYZ34Q0GzQB9QP7A2L6Yvo=`;\n\n///\n/// Disk II\n///\n\n const NUM_DRIVES = 2;\n const NUM_TRACKS = 35;\n const TRACK_SIZE = 0x1880;\n const SECTOR_SIZE = 383;\n\n const DISKII_PROM = [\n 0xA2,0x20,0xA0,0x00,0xA2,0x03,0x86,0x3C,0x8A,0x0A,0x24,0x3C,0xF0,0x10,0x05,0x3C\n ,0x49,0xFF,0x29,0x7E,0xB0,0x08,0x4A,0xD0,0xFB,0x98,0x9D,0x56,0x03,0xC8,0xE8,0x10\n ,0xE5,0x20,0x58,0xFF,0xBA,0xBD,0x00,0x01,0x0A,0x0A,0x0A,0x0A,0x85,0x2B,0xAA,0xBD\n ,0x8E,0xC0,0xBD,0x8C,0xC0,0xBD,0x8A,0xC0,0xBD,0x89,0xC0,0xA0,0x50,0xBD,0x80,0xC0\n ,0x98,0x29,0x03,0x0A,0x05,0x2B,0xAA,0xBD,0x81,0xC0,0xA9,0x56,\n /*0x20,0xA8,0xFC,*/0xa9,0x00,0xea,0x88\n ,0x10,0xEB,0x85,0x26,0x85,0x3D,0x85,0x41,0xA9,0x08,0x85,0x27,0x18,0x08,0xBD,0x8C\n ,0xC0,0x10,0xFB,0x49,0xD5,0xD0,0xF7,0xBD,0x8C,0xC0,0x10,0xFB,0xC9,0xAA,0xD0,0xF3\n ,0xEA,0xBD,0x8C,0xC0,0x10,0xFB,0xC9,0x96,0xF0,0x09,0x28,0x90,0xDF,0x49,0xAD,0xF0\n ,0x25,0xD0,0xD9,0xA0,0x03,0x85,0x40,0xBD,0x8C,0xC0,0x10,0xFB,0x2A,0x85,0x3C,0xBD\n ,0x8C,0xC0,0x10,0xFB,0x25,0x3C,0x88,0xD0,0xEC,0x28,0xC5,0x3D,0xD0,0xBE,0xA5,0x40\n ,0xC5,0x41,0xD0,0xB8,0xB0,0xB7,0xA0,0x56,0x84,0x3C,0xBC,0x8C,0xC0,0x10,0xFB,0x59\n ,0xD6,0x02,0xA4,0x3C,0x88,0x99,0x00,0x03,0xD0,0xEE,0x84,0x3C,0xBC,0x8C,0xC0,0x10\n ,0xFB,0x59,0xD6,0x02,0xA4,0x3C,0x91,0x26,0xC8,0xD0,0xEF,0xBC,0x8C,0xC0,0x10,0xFB\n ,0x59,0xD6,0x02,0xD0,0x87,0xA0,0x00,0xA2,0x56,0xCA,0x30,0xFB,0xB1,0x26,0x5E,0x00\n ,0x03,0x2A,0x5E,0x00,0x03,0x2A,0x91,0x26,0xC8,0xD0,0xEE,0xE6,0x27,0xE6,0x3D,0xA5\n ,0x3D,0xCD,0x00,0x08,0xA6,0x2B,0x90,0xDB,0x4C,0x01,0x08,0x00,0x00,0x00,0x00,0x00\n ];\n\nclass DiskIIState {\n data : Uint8Array[];\n track : number = 0;\n read_mode : boolean = true;\n write_protect : boolean = false;\n motor : boolean = false;\n track_index : number = 0;\n}\n\nclass DiskII extends DiskIIState implements SlotDevice, SavesState<DiskIIState> {\n emu : AppleII;\n track_data : Uint8Array;\n \n constructor(emu : AppleII, image : Uint8Array) {\n super();\n this.emu = emu;\n this.data = new Array(NUM_TRACKS);\n for (var i=0; i<NUM_TRACKS; i++) {\n var ofs = i*16*256;\n this.data[i] = nibblizeTrack(254, i, image.slice(ofs, ofs+16*256));\n }\n }\n \n saveState() : DiskIIState {\n var s = {\n data: new Array(NUM_TRACKS),\n track: this.track,\n read_mode: this.read_mode,\n write_protect: this.write_protect,\n motor: this.motor,\n track_index: this.track_index\n };\n for (var i=0; i<NUM_TRACKS; i++)\n s.data[i] = this.data[i].slice(0);\n return s;\n }\n \n loadState(s: DiskIIState) {\n for (var i=0; i<NUM_TRACKS; i++)\n this.data[i].set(s.data[i]);\n this.track = s.track;\n this.read_mode = s.read_mode;\n this.write_protect = s.write_protect;\n this.motor = s.motor;\n this.track_index = s.track_index;\n if ((this.track & 1) == 0)\n this.track_data = this.data[this.track>>1];\n else\n this.track_data = null;\n }\n \n toLongString() {\n return \"Track: \" + (this.track / 2) +\n \"\\nOffset: \" + (this.track_index) +\n \"\\nMode: \" + (this.read_mode ? \"READ\" : \"WRITE\") +\n \"\\nMotor: \" + this.motor +\n \"\\nData: \" + (this.track_data ? hex(this.track_data[this.track_index]) : '-') +\n \"\\n\";\n }\n \n read_latch() : number {\n this.track_index = (this.track_index + 1) % TRACK_SIZE;\n if (this.track_data) {\n return (this.track_data[this.track_index] & 0xff);\n } else\n return this.emu.floatbus() | 0x80;\n }\n\n write_latch(value: number) {\n this.track_index = (this.track_index + 1) % TRACK_SIZE;\n if (this.track_data != null)\n this.track_data[this.track_index] = value;\n }\n \n readROM(address) { return DISKII_PROM[address]; }\n readConst(address) { return DISKII_PROM[address]; }\n read(address) { return this.doIO(address, 0); }\n write(address, value) { this.doIO(address, value); }\n\n doIO(address, value) : number \n {\n switch (address & 0x0f)\n {\n /*\n * Turn motor phases 0 to 3 on. Turning on the previous phase + 1\n * increments the track position, turning on the previous phase - 1\n * decrements the track position. In this scheme phase 0 and 3 are\n * considered to be adjacent. The previous phase number can be\n * computed as the track number % 4.\n */\n case 0x1:\n case 0x3:\n case 0x5:\n case 0x7:\n var phase, lastphase, new_track;\n new_track = this.track;\n phase = (address >> 1) & 3;\n\n // if new phase is even and current phase is odd\n if (phase == ((new_track - 1) & 3))\n {\n if (new_track > 0)\n new_track--;\n } else\n if (phase == ((new_track + 1) & 3))\n {\n if (new_track < NUM_TRACKS*2-1)\n new_track++;\n }\n if ((new_track & 1) == 0)\n {\n this.track_data = this.data[new_track>>1];\n console.log('track', new_track/2);\n } else\n this.track_data = null;\n this.track = new_track;\n break;\n /*\n * Turn drive motor off.\n */\n case 0x8:\n this.motor = false;\n break;\n /*\n * Turn drive motor on.\n */\n case 0x9:\n this.motor = true;\n break; \n /*\n * Select drive 1.\n */\n case 0xa:\n //drive = 0;\n break;\n /*\n * Select drive 2.\n */\n case 0xb:\n //drive = 1;\n break;\n /*\n * Select write mode.\n */\n case 0xf:\n this.read_mode = false;\n /*\n * Read a disk byte if read mode is active.\n */\n case 0xC:\n if (this.read_mode)\n return this.read_latch();\n break;\n /*\n * Select read mode and read the write protect status.\n */\n case 0xE:\n this.read_mode = true;\n /*\n * Write a disk byte if write mode is active and the disk is not\n * write protected.\n */\n case 0xD:\n if (value >= 0 && !this.read_mode && !this.write_protect)\n this.write_latch(value);\n /*\n * Read the write protect status only.\n */\n return this.write_protect ? 0x80 : 0x00;\n }\n return this.emu.floatbus();\n }\n\n}\n\n/* --------------- TRACK CONVERSION ROUTINES ---------------------- */\n\n /*\n * Normal byte (lower six bits only) -> disk byte translation table.\n */\n const byte_translation = [\n 0x96, 0x97, 0x9a, 0x9b, 0x9d, 0x9e, 0x9f, 0xa6,\n 0xa7, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb2, 0xb3,\n 0xb4, 0xb5, 0xb6, 0xb7, 0xb9, 0xba, 0xbb, 0xbc,\n 0xbd, 0xbe, 0xbf, 0xcb, 0xcd, 0xce, 0xcf, 0xd3,\n 0xd6, 0xd7, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde,\n 0xdf, 0xe5, 0xe6, 0xe7, 0xe9, 0xea, 0xeb, 0xec,\n 0xed, 0xee, 0xef, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6,\n 0xf7, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff\n ];\n\n /*\n * Sector skewing table.\n */\n\n const skewing_table = [\n 0,7,14,6,13,5,12,4,11,3,10,2,9,1,8,15\n ];\n\n/*\n * Encode a 256-byte sector as SECTOR_SIZE disk bytes as follows:\n *\n * 14 sync bytes\n * 3 address header bytes\n * 8 address block bytes\n * 3 address trailer bytes\n * 6 sync bytes\n * 3 data header bytes\n * 343 data block bytes\n * 3 data trailer bytes\n */\n function nibblizeSector(vol, trk, sector, inn, in_ofs, out, i)\n {\n var loop, checksum, prev_value, value;\n var sector_buffer = new Uint8Array(258);\n value = 0;\n\n /*\n * Step 1: write 6 sync bytes (0xff's). Normally these would be\n * written as 10-bit bytes with two extra zero bits, but for the\n * purpose of emulation normal 8-bit bytes will do, since the\n * emulated drive will always be in sync.\n */\n for (loop = 0; loop < 14; loop++)\n out[i++] = 0xff;\n\n /*\n * Step 2: write the 3-byte address header (0xd5 0xaa 0x96).\n */\n out[i++] = 0xd5;\n out[i++] = 0xaa;\n out[i++] = 0x96;\n\n /*\n * Step 3: write the address block. Use 4-and-4 encoding to convert\n * the volume, track and sector and checksum into 2 disk bytes each.\n * The checksum is a simple exclusive OR of the first three values.\n */\n out[i++] = ((vol >> 1) | 0xaa);\n out[i++] = (vol | 0xaa);\n checksum = vol;\n out[i++] = ((trk >> 1) | 0xaa);\n out[i++] = (trk | 0xaa);\n checksum ^= trk;\n out[i++] = ((sector >> 1) | 0xaa);\n out[i++] = (sector | 0xaa);\n checksum ^= sector;\n out[i++] = ((checksum >> 1) | 0xaa);\n out[i++] = (checksum | 0xaa);\n\n /*\n * Step 4: write the 3-byte address trailer (0xde 0xaa 0xeb).\n */\n out[i++] = (0xde);\n out[i++] = (0xaa);\n out[i++] = (0xeb);\n\n /*\n * Step 5: write another 6 sync bytes.\n */\n for (loop = 0; loop < 6; loop++)\n out[i++] = (0xff);\n\n /*\n * Step 6: write the 3-byte data header.\n */\n out[i++] = (0xd5);\n out[i++] = (0xaa);\n out[i++] = (0xad);\n\n /*\n * Step 7: read the next 256-byte sector from the old disk image file,\n * and add two zero bytes to bring the number of bytes up to a multiple\n * of 3.\n */\n for (loop = 0; loop < 256; loop++)\n sector_buffer[loop] = inn[loop + in_ofs] & 0xff;\n sector_buffer[256] = 0;\n sector_buffer[257] = 0; \n\n /*\n * Step 8: write the first 86 disk bytes of the data block, which\n * encodes the bottom two bits of each sector byte into six-bit\n * values as follows:\n *\n * disk byte n, bit 0 = sector byte n, bit 1\n * disk byte n, bit 1 = sector byte n, bit 0\n * disk byte n, bit 2 = sector byte n + 86, bit 1\n * disk byte n, bit 3 = sector byte n + 86, bit 0\n * disk byte n, bit 4 = sector byte n + 172, bit 1\n * disk byte n, bit 5 = sector byte n + 172, bit 0\n *\n * The scheme allows each pair of bits to be shifted to the right out\n * of the disk byte, then shifted to the left into the sector byte.\n *\n * Before the 6-bit value is translated to a disk byte, it is exclusive\n * ORed with the previous 6-bit value, hence the values written are\n * really a running checksum.\n */\n prev_value = 0;\n for (loop = 0; loop < 86; loop++)\n {\n value = (sector_buffer[loop] & 0x01) << 1;\n value |= (sector_buffer[loop] & 0x02) >> 1;\n value |= (sector_buffer[loop + 86] & 0x01) << 3;\n value |= (sector_buffer[loop + 86] & 0x02) << 1;\n value |= (sector_buffer[loop + 172] & 0x01) << 5;\n value |= (sector_buffer[loop + 172] & 0x02) << 3;\n out[i++] = (byte_translation[value ^ prev_value]);\n prev_value = value;\n } \n\n /*\n * Step 9: write the last 256 disk bytes of the data block, which\n * encodes the top six bits of each sector byte. Again, each value\n * is exclusive ORed with the previous value to create a running\n * checksum (the first value is exclusive ORed with the last value of\n * the previous step).\n */\n\n for (loop = 0; loop < 256; loop++)\n {\n value = (sector_buffer[loop] >> 2);\n out[i++] = (byte_translation[value ^ prev_value]);\n prev_value = value;\n }\n\n /*\n * Step 10: write the last value as the checksum.\n */\n out[i++] = (byte_translation[value]);\n\n /*\n * Step 11: write the 3-byte data trailer.\n */\n out[i++] = (0xde);\n out[i++] = (0xaa);\n out[i++] = (0xeb);\n\n }\n\n function nibblizeTrack(vol, trk, inn)\n {\n var out = new Uint8Array(TRACK_SIZE);\n var out_pos = 0;\n for (var sector = 0; sector < 16; sector++) {\n nibblizeSector(vol, trk, sector,\n inn, skewing_table[sector] << 8,\n out, out_pos);\n out_pos += SECTOR_SIZE;\n }\n while (out_pos < TRACK_SIZE)\n out[out_pos++] = (0xff);\n return out;\n }\n\n\n", "\nimport { Platform, Preset, getOpcodeMetadata_6502, getToolForFilename_6502 } from \"../common/baseplatform\";\nimport { PLATFORMS } from \"../common/emu\";\nimport { AppleII } from \"../machine/apple2\";\nimport { Base6502MachinePlatform } from \"../common/baseplatform\";\nimport { CodeAnalyzer_apple2 } from \"../common/analysis\";\nimport { BaseMAME6502Platform } from \"../common/mameplatform\";\n\nconst APPLE2_PRESETS : Preset[] = [\n {id:'sieve.c', name:'Sieve', category:\"C\"},\n {id:'keyboardtest.c', name:'Keyboard Test'},\n {id:'mandel.c', name:'Mandelbrot'},\n {id:'tgidemo.c', name:'TGI Graphics Demo'},\n {id:'Eliza.c', name:'Eliza'},\n {id:'siegegame.c', name:'Siege Game'},\n {id:'cosmic.c', name:'Cosmic Impalas'},\n {id:'farmhouse.c', name:\"Farmhouse Adventure\"},\n {id:'yum.c', name:\"Yum Dice Game\"},\n {id:'lz4test.c', name:\"LZ4 Decompressor\"},\n {id:'hgrtest.a', name:\"HGR Test\", category:\"Assembly Language\"},\n {id:'conway.a', name:\"Conway's Game of Life\"},\n {id:'lz4fh.a', name:\"LZ4FH Decompressor\"},\n {id:'deltamod.dasm', name:\"Delta Modulation Audio\"},\n// {id:'zap.dasm', name:\"ZAP!\"},\n// {id:'tb_6502.s', name:'Tom Bombem (assembler game)'},\n];\n\n/// MAME support\n\nclass Apple2MAMEPlatform extends BaseMAME6502Platform implements Platform {\n\n start () {\n this.startModule(this.mainElement, {\n jsfile:'mame8bitpc.js',\n biosfile:['apple2e.zip'],\n //cfgfile:'nes.cfg',\n driver:'apple2e',\n width:280*2,\n height:192*2,\n //romfn:'/emulator/cart.nes',\n //romsize:romSize,\n //romdata:new lzgmini().decode(lzgRom).slice(0, romSize),\n preInit:function(_self) {\n },\n });\n }\n\n getOpcodeMetadata = getOpcodeMetadata_6502;\n getDefaultExtension () { return \".c\"; };\n getToolForFilename = getToolForFilename_6502;\n\n getPresets () { return APPLE2_PRESETS; }\n\n loadROM (title, data) {\n this.loadROMFile(data);\n // TODO\n }\n}\n\n///\n\nclass NewApple2Platform extends Base6502MachinePlatform<AppleII> implements Platform {\n\n newMachine() { return new AppleII(); }\n getPresets() { return APPLE2_PRESETS; }\n getDefaultExtension() { return \".c\"; };\n readAddress(a) { return this.machine.readConst(a); }\n // TODO loadBIOS(bios)\t{ this.machine.loadBIOS(a); }\n getMemoryMap = function() { return { main:[\n {name:'Zero Page RAM',start:0x0,size:0x100,type:'ram'},\n {name:'Line Input RAM',start:0x200,size:0x100,type:'ram'},\n {name:'RAM',start:0x300,size:0xc0,type:'ram'},\n {name:'DOS Vectors',start:0x3c0,size:0x40,type:'ram'},\n {name:'Text/Lores Page 1',start:0x400,size:0x400,type:'ram'},\n {name:'RAM',start:0x800,size:0x1800,type:'ram'},\n {name:'Hires Page 1',start:0x2000,size:0x2000,type:'ram'},\n {name:'Hires Page 2',start:0x4000,size:0x2000,type:'ram'},\n {name:'RAM',start:0x6000,size:0x6000,type:'ram'},\n {name:'I/O',start:0xc000,size:0x1000,type:'io'},\n {name:'ROM',start:0xd000,size:0x3000,type:'rom'},\n ] } };\n getROMExtension(rom:Uint8Array) {\n if (rom && rom.length == 35*16*256) return \".dsk\"; // DSK image\n return \".bin\";\n };\n getToolForFilename = (fn:string) : string => {\n if (fn.endsWith(\".lnk\")) return \"merlin32\";\n else return getToolForFilename_6502(fn);\n }\n /*\n newCodeAnalyzer() {\n return new CodeAnalyzer_apple2(this);\n }\n getOriginPC() {\n return 0x803; // TODO?\n }\n */\n}\n\nPLATFORMS['apple2.mame'] = Apple2MAMEPlatform;\nPLATFORMS['apple2'] = NewApple2Platform;\n"],
"mappings": "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D,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,GAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,GAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAExD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,IAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KAAQ,KACxD,KAAQ,KAAQ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AAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,EAAK,GAAK,GACnC,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,EAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,EAAK,EAAK,EAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,EAAK,GAAK,GAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,GAAK,GAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,GAAK,GAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,EACnC,EAAK,GAAK,GAAK,EAAK,EAAK,GAAK,GAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,GAAK,GAAK,EAAK,GAAK,GAAK,EACnC,EAAK,EAAK,EAAK,EAAK,GAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,GAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,GAAK,GAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,GAAK,GAAK,EAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,EAAK,EAAK,GAAK,EAAK,GAAK,GACnC,EAAK,EAAK,GAAK,GAAK,GAAK,GAAK,EAAK,EACnC,EAAK,GAAK,GAAK,GAAK,EAAK,EAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,EAAK,EAAK,EAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,GAAK,GAAK,GAAK,EAAK,EACnC,EAAK,EAAK,EAAK,GAAK,EAAK,GAAK,EAAK,EACnC,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,GAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,EAAK,GAAK,GACnC,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,EAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,EAAK,EAAK,EAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,EAAK,GAAK,GAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,GAAK,GAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,GAAK,GAAK,EAAK,EAAK,EAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,EACnC,EAAK,GAAK,GAAK,EAAK,EAAK,GAAK,GAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,GAAK,GAAK,EAAK,GAAK,GAAK,EACnC,EAAK,EAAK,EAAK,EAAK,GAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,GAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,GAAK,GAAK,EACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,GAAK,GAAK,EAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,EAAK,EAAK,GAAK,EAAK,GAAK,GACnC,EAAK,EAAK,GAAK,GAAK,GAAK,GAAK,EAAK,EACnC,EAAK,GAAK,GAAK,GAAK,EAAK,EAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,EAAK,EAAK,EAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GAAK,GACnC,EAAK,GAAK,GAAK,GAAK,GAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EACnC,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,EAAK,EAAK,GAAK,GAAK,GAAK,EAAK,EACnC,EAAK,EAAK,EAAK,GAAK,EAAK,GAAK,EAAK,EACnC,EAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GACnC,EAAK,GAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAIjC,GAAgB,+3DAOnB,GAAM,GAAa,GACb,EAAa,KACb,GAAc,IAEd,GAAc,CACjB,IAAK,GAAK,IAAK,EAAK,IAAK,EAAK,IAAK,GAAK,IAAK,GAAK,GAAK,GAAK,IAAK,GAAK,EAAK,GAC1E,GAAK,IAAK,GAAK,IAAK,IAAK,EAAK,GAAK,IAAK,IAAK,IAAK,IAAK,GAAK,EAAK,IAAK,IAAK,GAC3E,IAAK,GAAK,GAAK,IAAK,IAAK,IAAK,EAAK,EAAK,GAAK,GAAK,GAAK,GAAK,IAAK,GAAK,IAAK,IAC3E,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAK,IAAK,IAAK,IAC3E,IAAK,GAAK,EAAK,GAAK,EAAK,GAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GACrC,IAAK,EAAK,IAAK,IACjC,GAAK,IAAK,IAAK,GAAK,IAAK,GAAK,IAAK,GAAK,IAAK,EAAK,IAAK,GAAK,GAAK,EAAK,IAAK,IAC3E,IAAK,GAAK,IAAK,GAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAK,IAAK,IAAK,IAAK,IAAK,IAC3E,IAAK,IAAK,IAAK,IAAK,GAAK,IAAK,IAAK,IAAK,IAAK,EAAK,GAAK,IAAK,IAAK,GAAK,IAAK,IAC3E,GAAK,IAAK,IAAK,IAAK,EAAK,IAAK,GAAK,IAAK,IAAK,IAAK,GAAK,IAAK,GAAK,IAAK,GAAK,IAC3E,IAAK,IAAK,GAAK,IAAK,GAAK,GAAK,IAAK,IAAK,IAAK,GAAK,IAAK,GAAK,IAAK,IAAK,IAAK,GAC3E,IAAK,GAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAK,IAAK,GAAK,IAAK,IAAK,IAAK,GAAK,IAAK,GAC3E,IAAK,EAAK,IAAK,GAAK,IAAK,IAAK,EAAK,EAAK,IAAK,IAAK,IAAK,GAAK,IAAK,IAAK,IAAK,GAC3E,IAAK,GAAK,IAAK,EAAK,IAAK,GAAK,IAAK,GAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAK,IAC3E,GAAK,IAAK,EAAK,IAAK,IAAK,IAAK,EAAK,IAAK,GAAK,IAAK,GAAK,IAAK,IAAK,GAAK,GAAK,EAC3E,EAAK,GAAK,GAAK,EAAK,EAAK,GAAK,IAAK,GAAK,IAAK,IAAK,IAAK,IAAK,GAAK,IAAK,GAAK,IAC3E,GAAK,IAAK,EAAK,EAAK,IAAK,GAAK,IAAK,IAAK,GAAK,EAAK,EAAK,EAAK,EAAK,EAAK,EAAK,GAGlF,QAAkB,CAAlB,aAvnCA,CAynCI,WAAiB,EACjB,eAAsB,GACtB,mBAA0B,GAC1B,WAAkB,GAClB,iBAAuB,IAG3B,gBAAqB,GAA2D,CAI5E,YAAY,EAAe,EAAoB,CAC3C,QACA,KAAK,IAAM,EACX,KAAK,KAAO,GAAI,OAAM,GACtB,OAAS,GAAE,EAAG,EAAE,EAAY,IAAK,CAC9B,GAAI,GAAM,EAAE,GAAG,IACf,KAAK,KAAK,GAAK,GAAc,IAAK,EAAG,EAAM,MAAM,EAAK,EAAI,GAAG,OAIpE,WAA0B,CASvB,OARI,GAAI,CACL,KAAM,GAAI,OAAM,GAChB,MAAO,KAAK,MACZ,UAAW,KAAK,UAChB,cAAe,KAAK,cACpB,MAAO,KAAK,MACZ,YAAa,KAAK,aAEZ,EAAE,EAAG,EAAE,EAAY,IACzB,EAAE,KAAK,GAAK,KAAK,KAAK,GAAG,MAAM,GAClC,MAAO,GAGV,UAAU,EAAgB,CACvB,OAAS,GAAE,EAAG,EAAE,EAAY,IACzB,KAAK,KAAK,GAAG,IAAI,EAAE,KAAK,IAC3B,KAAK,MAAQ,EAAE,MACf,KAAK,UAAY,EAAE,UACnB,KAAK,cAAgB,EAAE,cACvB,KAAK,MAAQ,EAAE,MACf,KAAK,YAAc,EAAE,YACrB,AAAK,MAAK,MAAQ,IAAM,EACrB,KAAK,WAAa,KAAK,KAAK,KAAK,OAAO,GAExC,KAAK,WAAa,KAGxB,cAAe,CACZ,MAAO,WAAc,KAAK,MAAQ,EAChC;AAAA,UAAgB,KAAK,YACrB;AAAA,UAAgB,MAAK,UAAY,OAAS,SAC1C;AAAA,UAAe,KAAK,MACpB;AAAA,UAAgB,MAAK,WAAa,EAAI,KAAK,WAAW,KAAK,cAAgB,KAC3E;AAAA,EAGN,YAAsB,CAEnB,MADA,MAAK,YAAe,MAAK,YAAc,GAAK,EACxC,KAAK,WACE,KAAK,WAAW,KAAK,aAAe,IAErC,KAAK,IAAI,WAAa,IAGnC,YAAY,EAAe,CACxB,KAAK,YAAe,MAAK,YAAc,GAAK,EACxC,KAAK,YAAc,MACpB,MAAK,WAAW,KAAK,aAAe,GAG1C,QAAQ,EAAc,CAAE,MAAO,IAAY,GAC3C,UAAU,EAAY,CAAE,MAAO,IAAY,GAC3C,KAAK,EAAiB,CAAE,MAAO,MAAK,KAAK,EAAS,GAClD,MAAM,EAAS,EAAO,CAAE,KAAK,KAAK,EAAS,GAE3C,KAAK,EAAS,EACd,CACG,OAAQ,EAAU,QASV,OACA,OACA,OACA,GACF,GAAI,GAAO,EAAW,EACtB,EAAY,KAAK,MACjB,EAAS,GAAW,EAAK,EAGzB,AAAI,GAAW,GAAY,EAAK,GAEzB,EAAY,GACb,IAEC,GAAW,GAAY,EAAK,IAE5B,EAAY,EAAW,EAAE,GAC1B,IAEN,AAAK,GAAY,IAAM,EAEpB,MAAK,WAAa,KAAK,KAAK,GAAW,GACvC,QAAQ,IAAI,QAAS,EAAU,IAE/B,KAAK,WAAa,KACrB,KAAK,MAAQ,EACb,UAIE,GACF,KAAK,MAAQ,GACb,UAIE,GACF,KAAK,MAAQ,GACb,UAIE,IAEF,UAIE,IAEF,UAIE,IACF,KAAK,UAAY,OAIf,IACF,GAAI,KAAK,UACN,MAAO,MAAK,aACf,UAIE,IACF,KAAK,UAAY,OAKf,IACF,MAAI,IAAS,GAAK,CAAC,KAAK,WAAa,CAAC,KAAK,eACxC,KAAK,YAAY,GAIb,KAAK,cAAgB,IAAO,EAEzC,MAAO,MAAK,IAAI,aAUb,EAAmB,CACtB,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC1C,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC1C,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC1C,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC1C,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC1C,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC1C,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAC1C,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,KAOvC,GAAgB,CACnB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAetC,YAAwB,EAAK,EAAK,EAAQ,EAAK,EAAQ,EAAK,EAC5D,CACG,GAAI,GAAM,EAAU,EAAY,EAC5B,EAAgB,GAAI,YAAW,KASnC,IARA,EAAQ,EAQH,EAAO,EAAG,EAAO,GAAI,IACvB,EAAI,KAAO,IAoCd,IA/BA,EAAI,KAAO,IACX,EAAI,KAAO,IACX,EAAI,KAAO,IAOX,EAAI,KAAS,GAAO,EAAK,IACzB,EAAI,KAAQ,EAAM,IAClB,EAAW,EACX,EAAI,KAAS,GAAO,EAAK,IACzB,EAAI,KAAQ,EAAM,IAClB,GAAY,EACZ,EAAI,KAAS,GAAU,EAAK,IAC5B,EAAI,KAAQ,EAAS,IACrB,GAAY,EACZ,EAAI,KAAS,GAAY,EAAK,IAC9B,EAAI,KAAQ,EAAW,IAKvB,EAAI,KAAQ,IACZ,EAAI,KAAQ,IACZ,EAAI,KAAQ,IAKP,EAAO,EAAG,EAAO,EAAG,IACtB,EAAI,KAAQ,IAcf,IATA,EAAI,KAAQ,IACZ,EAAI,KAAQ,IACZ,EAAI,KAAQ,IAOP,EAAO,EAAG,EAAO,IAAK,IACxB,EAAc,GAAQ,EAAI,EAAO,GAAU,IAwB9C,IAvBA,EAAc,KAAO,EACrB,EAAc,KAAO,EAqBrB,EAAa,EACR,EAAO,EAAG,EAAO,GAAI,IAEvB,EAAU,GAAc,GAAQ,IAAS,EACzC,GAAU,GAAc,GAAQ,IAAS,EACzC,GAAU,GAAc,EAAO,IAAM,IAAS,EAC9C,GAAU,GAAc,EAAO,IAAM,IAAS,EAC9C,GAAU,GAAc,EAAO,KAAO,IAAS,EAC/C,GAAU,GAAc,EAAO,KAAO,IAAS,EAC/C,EAAI,KAAQ,EAAiB,EAAQ,GACrC,EAAa,EAWhB,IAAK,EAAO,EAAG,EAAO,IAAK,IAExB,EAAS,EAAc,IAAS,EAChC,EAAI,KAAQ,EAAiB,EAAQ,GACrC,EAAa,EAMhB,EAAI,KAAQ,EAAiB,GAK7B,EAAI,KAAQ,IACZ,EAAI,KAAQ,IACZ,EAAI,KAAQ,IAIf,YAAuB,EAAK,EAAK,EACjC,CAGG,OAFI,GAAM,GAAI,YAAW,GACrB,EAAU,EACL,EAAS,EAAG,EAAS,GAAI,IAC/B,GAAe,EAAK,EAAK,EACV,EAAK,GAAc,IAAW,EAC9B,EAAK,GACpB,GAAW,GAEd,KAAO,EAAU,GACd,EAAI,KAAc,IACrB,MAAO,GCh9Cb,GAAM,IAA4B,CAChC,CAAC,GAAG,UAAW,KAAK,QAAS,SAAS,KACtC,CAAC,GAAG,iBAAkB,KAAK,iBAC3B,CAAC,GAAG,WAAY,KAAK,cACrB,CAAC,GAAG,YAAa,KAAK,qBACtB,CAAC,GAAG,UAAW,KAAK,SACpB,CAAC,GAAG,cAAe,KAAK,cACxB,CAAC,GAAG,WAAY,KAAK,kBACrB,CAAC,GAAG,cAAe,KAAK,uBACxB,CAAC,GAAG,QAAS,KAAK,iBAClB,CAAC,GAAG,YAAa,KAAK,oBACtB,CAAC,GAAG,YAAa,KAAK,WAAY,SAAS,qBAC3C,CAAC,GAAG,WAAY,KAAK,yBACrB,CAAC,GAAG,UAAW,KAAK,sBACpB,CAAC,GAAG,gBAAiB,KAAK,2BAO5B,gBAAiC,GAAyC,CAA1E,aA7BA,CA6BA,oBAkBE,uBAAoB,GAEpB,wBAAqB,EAlBrB,OAAS,CACP,KAAK,YAAY,KAAK,YAAa,CACjC,OAAO,gBACP,SAAS,CAAC,eAEV,OAAO,UACP,MAAM,IAAI,EACV,OAAO,IAAI,EAIX,QAAQ,SAAS,EAAO,KAM5B,qBAAuB,CAAE,MAAO,KAGhC,YAAc,CAAE,MAAO,IAEvB,QAAS,EAAO,EAAM,CACpB,KAAK,YAAY,KAOrB,gBAAgC,GAAqD,CAArF,aA7DA,CA6DA,oBAOE,kBAAe,UAAW,CAAE,MAAO,CAAE,KAAK,CACtC,CAAC,KAAK,gBAAgB,MAAM,EAAI,KAAK,IAAM,KAAK,OAChD,CAAC,KAAK,iBAAiB,MAAM,IAAM,KAAK,IAAM,KAAK,OACnD,CAAC,KAAK,MAAM,MAAM,IAAM,KAAK,IAAK,KAAK,OACvC,CAAC,KAAK,cAAc,MAAM,IAAM,KAAK,GAAK,KAAK,OAC/C,CAAC,KAAK,oBAAoB,MAAM,KAAM,KAAK,KAAM,KAAK,OACtD,CAAC,KAAK,MAAM,MAAM,KAAM,KAAK,KAAO,KAAK,OACzC,CAAC,KAAK,eAAe,MAAM,KAAO,KAAK,KAAO,KAAK,OACnD,CAAC,KAAK,eAAe,MAAM,MAAO,KAAK,KAAO,KAAK,OACnD,CAAC,KAAK,MAAM,MAAM,MAAO,KAAK,MAAO,KAAK,OAC1C,CAAC,KAAK,MAAM,MAAM,MAAO,KAAK,KAAO,KAAK,MAC1C,CAAC,KAAK,MAAM,MAAM,MAAO,KAAK,MAAO,KAAK,UAM9C,wBAAqB,AAAC,GAChB,EAAG,SAAS,QAAgB,WACpB,EAAwB,GAxBtC,YAAsB,CAAE,MAAO,IAAI,GACnC,YAAsB,CAAE,MAAO,IAC/B,qBAAsB,CAAE,MAAO,KAC/B,YAAY,EAAU,CAAE,MAAO,MAAK,QAAQ,UAAU,GAetD,gBAAgB,EAAgB,CAC9B,MAAI,IAAO,EAAI,QAAU,GAAG,GAAG,IAAY,OACpC,SAgBX,EAAU,eAAiB,GAC3B,EAAU,OAAY",
"names": []
}