8bitworkshop/gen/vectrex-ZT6XLARM.js.map

8 lines
47 KiB
Plaintext

{
"version": 3,
"sources": ["../src/platform/vectrex.ts"],
"sourcesContent": ["\nimport { Platform, BaseZ80Platform, Base6502Platform, Base6809Platform } from \"../common/baseplatform\";\nimport { PLATFORMS, newAddressDecoder, padBytes, noise, setKeyboardFromMap, AnimationTimer, VectorVideo, Keys, makeKeycodeMap } from \"../common/emu\";\nimport { hex, lzgmini, stringToByteArray, safe_extend } from \"../common/util\";\nimport { MasterAudio, AY38910_Audio } from \"../common/audio\";\nimport { ProbeRecorder } from \"../common/probe\";\nimport { NullProbe, Probeable, ProbeAll } from \"../common/devices\";\n\n// emulator from https://github.com/raz0red/jsvecx\n// https://roadsidethoughts.com/vectrex/vectrex-memory-map.htm\n// http://www.playvectrex.com/designit/chrissalo/memorymap.htm\n// http://vectrexmuseum.com/share/coder/other/TEXT/VECTREX/INTERNAL.TXT\n// http://vide.malban.de/help/vectrex-tutorial-ii-starting-with-bios\n// http://www.playvectrex.com/designit/chrissalo/bios.asm\n// https://www.6809.org.uk/asm6809/doc/asm6809.shtml\n// http://www.playvectrex.com/\n// http://vectrexmuseum.com/vectrexhistory.php\n\nvar VECTREX_PRESETS = [\n { id: 'hello.xasm', name: 'Hello World (ASM)' },\n { id: 'hello.c', name: 'Hello World (CMOC)' },\n { id: 'joystick.c', name: 'Joystick Test (CMOC)' },\n { id: 'threed.c', name: '3D Transformations (CMOC)' },\n]\n\n// TODO: player 2\nvar VECTREX_KEYCODE_MAP = makeKeycodeMap([\n [Keys.LEFT, 0, 0x01],\n [Keys.RIGHT, 0, 0x02],\n [Keys.DOWN, 0, 0x04],\n [Keys.UP, 0, 0x08],\n [Keys.GP_B, 2, 0x01],\n [Keys.GP_A, 2, 0x02],\n [Keys.GP_D, 2, 0x04],\n [Keys.GP_C, 2, 0x08],\n\n [Keys.P2_LEFT, 1, 0x01],\n [Keys.P2_RIGHT, 1, 0x02],\n [Keys.P2_DOWN, 1, 0x04],\n [Keys.P2_UP, 1, 0x08],\n [Keys.P2_GP_B, 2, 0x10],\n [Keys.P2_GP_A, 2, 0x20],\n [Keys.P2_GP_D, 2, 0x40],\n [Keys.P2_GP_C, 2, 0x80],\n]);\n\n//\n\nclass VIA6522 {\n vectrex: VectrexPlatform;\n constructor(vectrex) {\n this.vectrex = vectrex;\n }\n\n //static unsigned via_ora;\n ora = 0;\n //static unsigned via_orb;\n orb = 0;\n //static unsigned via_ddra;\n ddra = 0;\n //static unsigned via_ddrb;\n ddrb = 0;\n //static unsigned via_t1on; /* is timer 1 on? */\n t1on = 0;\n //static unsigned via_t1int; /* are timer 1 interrupts allowed? */\n t1int = 0;\n //static unsigned via_t1c;\n t1c = 0;\n //static unsigned via_t1ll;\n t1ll = 0;\n //static unsigned via_t1lh;\n t1lh = 0;\n //static unsigned via_t1pb7; /* timer 1 controlled version of pb7 */\n t1pb7 = 0;\n //static unsigned via_t2on; /* is timer 2 on? */\n t2on = 0;\n //static unsigned via_t2int; /* are timer 2 interrupts allowed? */\n t2int = 0;\n //static unsigned via_t2c;\n t2c = 0;\n //static unsigned via_t2ll;\n t2ll = 0;\n //static unsigned via_sr;\n sr = 0;\n //static unsigned via_srb; /* number of bits shifted so far */\n srb = 0;\n //static unsigned via_src; /* shift counter */\n src = 0;\n //static unsigned via_srclk;\n srclk = 0;\n //static unsigned via_acr;\n acr = 0;\n //static unsigned via_pcr;\n pcr = 0;\n //static unsigned via_ifr;\n ifr = 0;\n //static unsigned via_ier;\n ier = 0;\n //static unsigned via_ca2;\n ca2 = 0;\n //static unsigned via_cb2h; /* basic handshake version of cb2 */\n cb2h = 0;\n //static unsigned via_cb2s; /* version of cb2 controlled by the shift register */\n cb2s = 0;\n\n reset() {\n // http://archive.6502.org/datasheets/mos_6522_preliminary_nov_1977.pdf\n // \"Reset sets all registers to zero except t1 t2 and sr\"\n this.ora = 0;\n this.orb = 0;\n this.ddra = 0;\n this.ddrb = 0;\n this.t1on = 0;\n this.t1int = 0;\n this.t1c = 0;\n this.t1ll = 0;\n this.t1lh = 0;\n this.t1pb7 = 0x80;\n this.t2on = 0;\n this.t2int = 0;\n this.t2c = 0;\n this.t2ll = 0;\n this.sr = 0;\n this.srb = 8;\n this.src = 0;\n this.srclk = 0;\n this.acr = 0;\n this.pcr = 0;\n this.ifr = 0;\n this.ier = 0;\n this.ca2 = 1;\n this.cb2h = 1;\n this.cb2s = 0;\n };\n\n int_update() {\n if ((this.ifr & 0x7f) & (this.ier & 0x7f)) {\n this.ifr |= 0x80;\n }\n else {\n this.ifr &= 0x7f;\n }\n }\n\n step0() {\n var t2shift = 0;\n if (this.t1on) {\n this.t1c = (this.t1c > 0 ? this.t1c - 1 : 0xffff);\n if ((this.t1c & 0xffff) == 0xffff) {\n /* counter just rolled over */\n if (this.acr & 0x40) {\n /* continuous interrupt mode */\n this.ifr |= 0x40;\n this.int_update();\n this.t1pb7 ^= 0x80;\n /* reload counter */\n this.t1c = (this.t1lh << 8) | this.t1ll;\n }\n else {\n /* one shot mode */\n if (this.t1int) {\n this.ifr |= 0x40;\n this.int_update();\n this.t1pb7 = 0x80;\n this.t1int = 0;\n }\n }\n }\n }\n\n if (this.t2on && (this.acr & 0x20) == 0x00) {\n this.t2c = (this.t2c > 0 ? this.t2c - 1 : 0xffff);\n if ((this.t2c & 0xffff) == 0xffff) {\n /* one shot mode */\n if (this.t2int) {\n this.ifr |= 0x20;\n this.int_update();\n this.t2int = 0;\n }\n }\n }\n\n /* shift counter */\n this.src = (this.src > 0 ? this.src - 1 : 0xff); // raz was 0xffffffff\n if ((this.src & 0xff) == 0xff) {\n this.src = this.t2ll;\n if (this.srclk) {\n t2shift = 1;\n this.srclk = 0;\n }\n else {\n t2shift = 0;\n this.srclk = 1;\n }\n }\n else {\n t2shift = 0;\n }\n\n if (this.srb < 8) {\n switch (this.acr & 0x1c) {\n case 0x00:\n /* disabled */\n break;\n case 0x04:\n /* shift in under control of t2 */\n if (t2shift) {\n /* shifting in 0s since cb2 is always an output */\n this.sr <<= 1;\n this.srb++;\n }\n break;\n case 0x08:\n /* shift in under system clk control */\n this.sr <<= 1;\n this.srb++;\n break;\n case 0x0c:\n /* shift in under cb1 control */\n break;\n case 0x10:\n /* shift out under t2 control (free run) */\n if (t2shift) {\n this.cb2s = (this.sr >> 7) & 1;\n this.sr <<= 1;\n this.sr |= this.cb2s;\n }\n break;\n case 0x14:\n /* shift out under t2 control */\n if (t2shift) {\n this.cb2s = (this.sr >> 7) & 1;\n this.sr <<= 1;\n this.sr |= this.cb2s;\n this.srb++;\n }\n break;\n case 0x18:\n /* shift out under system clock control */\n this.cb2s = (this.sr >> 7) & 1;\n this.sr <<= 1;\n this.sr |= this.cb2s;\n this.srb++;\n break;\n case 0x1c:\n /* shift out under cb1 control */\n break;\n }\n\n if (this.srb == 8) {\n this.ifr |= 0x04;\n this.int_update();\n }\n }\n }\n\n step1() {\n if ((this.pcr & 0x0e) == 0x0a) {\n /* if ca2 is in pulse mode, then make sure\n * it gets restored to '1' after the pulse.\n */\n this.ca2 = 1;\n }\n if ((this.pcr & 0xe0) == 0xa0) {\n /* if cb2 is in pulse mode, then make sure\n * it gets restored to '1' after the pulse.\n */\n this.cb2h = 1;\n }\n }\n\n read(address) {\n var data;\n /* io */\n switch (address & 0xf) {\n case 0x0:\n /* compare signal is an input so the value does not come from\n * orb.\n */\n if (this.acr & 0x80) {\n /* timer 1 has control of bit 7 */\n data = ((this.orb & 0x5f) | this.t1pb7 | this.vectrex.alg.compare);\n }\n else {\n /* bit 7 is being driven by orb */\n data = ((this.orb & 0xdf) | this.vectrex.alg.compare);\n }\n return data & 0xff;\n case 0x1:\n /* register 1 also performs handshakes if necessary */\n if ((this.pcr & 0x0e) == 0x08) {\n /* if ca2 is in pulse mode or handshake mode, then it\n * goes low whenever ira is read.\n */\n this.ca2 = 0;\n }\n /* fall through */\n case 0xf:\n if ((this.orb & 0x18) == 0x08) {\n /* the snd chip is driving port a */\n data = this.vectrex.psg.readData();\n //console.log(this.vectrex.psg.currentRegister(), data);\n }\n else {\n data = this.ora;\n }\n return data & 0xff;\n case 0x2:\n return this.ddrb & 0xff;\n case 0x3:\n return this.ddra & 0xff;\n case 0x4:\n /* T1 low order counter */\n data = this.t1c;\n this.ifr &= 0xbf; /* remove timer 1 interrupt flag */\n this.t1on = 0; /* timer 1 is stopped */\n this.t1int = 0;\n this.t1pb7 = 0x80;\n this.int_update();\n return data & 0xff;\n case 0x5:\n /* T1 high order counter */\n return (this.t1c >> 8) & 0xff;\n case 0x6:\n /* T1 low order latch */\n return this.t1ll & 0xff;\n case 0x7:\n /* T1 high order latch */\n return this.t1lh & 0xff;\n case 0x8:\n /* T2 low order counter */\n data = this.t2c;\n this.ifr &= 0xdf; /* remove timer 2 interrupt flag */\n this.t2on = 0; /* timer 2 is stopped */\n this.t2int = 0;\n this.int_update();\n return data & 0xff;\n case 0x9:\n /* T2 high order counter */\n return (this.t2c >> 8);\n case 0xa:\n data = this.sr;\n this.ifr &= 0xfb; /* remove shift register interrupt flag */\n this.srb = 0;\n this.srclk = 1;\n this.int_update();\n return data & 0xff;\n case 0xb:\n return this.acr & 0xff;\n case 0xc:\n return this.pcr & 0xff;\n case 0xd:\n /* interrupt flag register */\n return this.ifr & 0xff;\n case 0xe:\n /* interrupt enable register */\n return (this.ier | 0x80) & 0xff;\n }\n }\n\n write(address, data) {\n switch (address & 0xf) {\n case 0x0:\n this.orb = data;\n this.vectrex.snd_update();\n this.vectrex.alg.update();\n if ((this.pcr & 0xe0) == 0x80) {\n /* if cb2 is in pulse mode or handshake mode, then it\n * goes low whenever orb is written.\n */\n this.cb2h = 0;\n }\n break;\n case 0x1:\n /* register 1 also performs handshakes if necessary */\n if ((this.pcr & 0x0e) == 0x08) {\n /* if ca2 is in pulse mode or handshake mode, then it\n * goes low whenever ora is written.\n */\n this.ca2 = 0;\n }\n /* fall through */\n case 0xf:\n this.ora = data;\n this.vectrex.snd_update();\n /* output of port a feeds directly into the dac which then\n * feeds the x axis sample and hold.\n */\n this.vectrex.alg.xsh = data ^ 0x80;\n this.vectrex.alg.update();\n break;\n case 0x2:\n this.ddrb = data;\n break;\n case 0x3:\n this.ddra = data;\n break;\n case 0x4:\n /* T1 low order counter */\n this.t1ll = data;\n break;\n case 0x5:\n /* T1 high order counter */\n this.t1lh = data;\n this.t1c = (this.t1lh << 8) | this.t1ll;\n this.ifr &= 0xbf; /* remove timer 1 interrupt flag */\n this.t1on = 1; /* timer 1 starts running */\n this.t1int = 1;\n this.t1pb7 = 0;\n this.int_update();\n break;\n case 0x6:\n /* T1 low order latch */\n this.t1ll = data;\n break;\n case 0x7:\n /* T1 high order latch */\n this.t1lh = data;\n break;\n case 0x8:\n /* T2 low order latch */\n this.t2ll = data;\n break;\n case 0x9:\n /* T2 high order latch/counter */\n this.t2c = (data << 8) | this.t2ll;\n this.ifr &= 0xdf;\n this.t2on = 1; /* timer 2 starts running */\n this.t2int = 1;\n this.int_update();\n break;\n case 0xa:\n this.sr = data;\n this.ifr &= 0xfb; /* remove shift register interrupt flag */\n this.srb = 0;\n this.srclk = 1;\n this.int_update();\n break;\n case 0xb:\n this.acr = data;\n break;\n case 0xc:\n this.pcr = data;\n if ((this.pcr & 0x0e) == 0x0c) {\n /* ca2 is outputting low */\n this.ca2 = 0;\n }\n else {\n /* ca2 is disabled or in pulse mode or is\n * outputting high.\n */\n this.ca2 = 1;\n }\n if ((this.pcr & 0xe0) == 0xc0) {\n /* cb2 is outputting low */\n this.cb2h = 0;\n }\n else {\n /* cb2 is disabled or is in pulse mode or is\n * outputting high.\n */\n this.cb2h = 1;\n }\n break;\n case 0xd:\n /* interrupt flag register */\n this.ifr &= (~(data & 0x7f)); // & 0xffff ); // raz\n this.int_update();\n break;\n case 0xe:\n /* interrupt enable register */\n if (data & 0x80) {\n this.ier |= data & 0x7f;\n }\n else {\n this.ier &= (~(data & 0x7f)); // & 0xffff ); // raz\n }\n this.int_update();\n break;\n }\n }\n saveState() {\n return safe_extend(null, {}, this);\n }\n loadState(state) {\n safe_extend(null, this, state);\n }\n toLongString(state) {\n var s = \"\";\n for (var key in state) {\n s += key + \": \" + hex(state[key]) + \"\\n\";\n }\n return s;\n }\n};\n\nconst Globals =\n{\n VECTREX_MHZ: 1500000, /* speed of the vectrex being emulated */\n VECTREX_COLORS: 128, /* number of possible colors ... grayscale */\n ALG_MAX_X: 33000,\n ALG_MAX_Y: 41000,\n //VECTREX_PDECAY: 30, /* phosphor decay rate */\n //VECTOR_HASH: 65521,\n SCREEN_X_DEFAULT: 900,\n SCREEN_Y_DEFAULT: 1100,\n BOUNDS_MIN_X: 0,\n BOUNDS_MAX_X: 30000,\n BOUNDS_MIN_Y: 41000,\n BOUNDS_MAX_Y: 0,\n};\n\nclass VectrexAnalog {\n vectrex: VectrexPlatform;\n constructor(vectrex) {\n this.vectrex = vectrex;\n }\n videoEnabled = true;\n //static unsigned rsh; /* zero ref sample and hold */\n rsh = 0;\n //static unsigned xsh; /* x sample and hold */\n xsh = 0;\n //static unsigned ysh; /* y sample and hold */\n ysh = 0;\n //static unsigned zsh; /* z sample and hold */\n zsh = 0;\n //unsigned jch0;\t\t /* joystick direction channel 0 */\n jch0 = 0;\n //unsigned jch1;\t\t /* joystick direction channel 1 */\n jch1 = 0;\n //unsigned jch2;\t\t /* joystick direction channel 2 */\n jch2 = 0;\n //unsigned jch3;\t\t /* joystick direction channel 3 */\n jch3 = 0;\n //static unsigned jsh; /* joystick sample and hold */\n jsh = 0;\n //static unsigned compare;\n compare = 0;\n //static long dx; /* delta x */\n dx = 0;\n //static long dy; /* delta y */\n dy = 0;\n //static long curr_x; /* current x position */\n curr_x = 0;\n //static long curr_y; /* current y position */\n curr_y = 0;\n\n max_x = Globals.ALG_MAX_X >> 1;\n max_y = Globals.ALG_MAX_Y >> 1;\n\n //static unsigned vectoring; /* are we drawing a vector right now? */\n vectoring = false;\n //static long vector_x0;\n vector_x0 = 0;\n //static long vector_y0;\n vector_y0 = 0;\n //static long vector_x1;\n vector_x1 = 0;\n //static long vector_y1;\n vector_y1 = 0;\n //static long vector_dx;\n vector_dx = 0;\n //static long vector_dy;\n vector_dy = 0;\n //static unsigned char vector_color;\n vector_color = 0;\n\n reset() {\n this.rsh = 128;\n this.xsh = 128;\n this.ysh = 128;\n this.zsh = 0;\n this.jch0 = 128;\n this.jch1 = 128;\n this.jch2 = 128;\n this.jch3 = 128;\n this.jsh = 128;\n this.compare = 0;\n /* check this */\n this.dx = 0;\n this.dy = 0;\n this.curr_x = Globals.ALG_MAX_X >> 1;\n this.curr_y = Globals.ALG_MAX_Y >> 1;\n this.vectoring = false;\n }\n\n update() {\n var via = this.vectrex.via;\n switch (via.orb & 0x06) {\n case 0x00:\n this.jsh = this.jch0;\n if ((via.orb & 0x01) == 0x00) {\n /* demultiplexor is on */\n this.ysh = this.xsh;\n }\n break;\n case 0x02:\n this.jsh = this.jch1;\n if ((via.orb & 0x01) == 0x00) {\n /* demultiplexor is on */\n this.rsh = this.xsh;\n }\n break;\n case 0x04:\n this.jsh = this.jch2;\n if ((via.orb & 0x01) == 0x00) {\n /* demultiplexor is on */\n if (this.xsh > 0x80) {\n this.zsh = this.xsh - 0x80;\n } else {\n this.zsh = 0;\n }\n }\n break;\n case 0x06:\n /* sound output line */\n this.jsh = this.jch3;\n break;\n }\n\n /* compare the current joystick direction with a reference */\n if (this.jsh > this.xsh) {\n this.compare = 0x20;\n } else {\n this.compare = 0;\n }\n\n /* compute the new \"deltas\" */\n this.dx = this.xsh - this.rsh;\n this.dy = this.rsh - this.ysh;\n }\n\n step() {\n var via = this.vectrex.via;\n var sig_dx = 0;\n var sig_dy = 0;\n var sig_ramp = 0;\n var sig_blank = 0;\n\n if (via.acr & 0x10) {\n sig_blank = via.cb2s;\n }\n else {\n sig_blank = via.cb2h;\n }\n\n if (via.ca2 == 0)\n {\n /* need to force the current point to the 'orgin' so just\n * calculate distance to origin and use that as dx,dy.\n */\n sig_dx = this.max_x - this.curr_x;\n sig_dy = this.max_y - this.curr_y;\n }\n else {\n if (via.acr & 0x80) {\n sig_ramp = via.t1pb7;\n }\n else {\n sig_ramp = via.orb & 0x80;\n }\n\n if (sig_ramp == 0) {\n sig_dx = this.dx;\n sig_dy = this.dy;\n }\n else {\n sig_dx = 0;\n sig_dy = 0;\n }\n }\n //if (sig_dx || sig_dy) console.log(via.ca2, this.curr_x, this.curr_y, this.dx, this.dy, sig_dx, sig_dy, sig_ramp, sig_blank);\n\n if (!this.vectoring) {\n if (sig_blank == 1 &&\n this.curr_x >= 0 && this.curr_x < Globals.ALG_MAX_X &&\n this.curr_y >= 0 && this.curr_y < Globals.ALG_MAX_Y) {\n /* start a new vector */\n this.vectoring = true;\n this.vector_x0 = this.curr_x;\n this.vector_y0 = this.curr_y;\n this.vector_x1 = this.curr_x;\n this.vector_y1 = this.curr_y;\n this.vector_dx = sig_dx;\n this.vector_dy = sig_dy;\n this.vector_color = this.zsh & 0xff;\n }\n }\n else {\n /* already drawing a vector ... check if we need to turn it off */\n if (sig_blank == 0) {\n /* blank just went on, vectoring turns off, and we've got a\n * new line.\n */\n this.vectoring = false;\n\n this.addline(this.vector_x0, this.vector_y0,\n this.vector_x1, this.vector_y1,\n this.vector_color);\n }\n else if (sig_dx != this.vector_dx ||\n sig_dy != this.vector_dy ||\n (this.zsh & 0xff) != this.vector_color) {\n\n /* the parameters of the vectoring processing has changed.\n * so end the current line.\n */\n this.addline(this.vector_x0, this.vector_y0,\n this.vector_x1, this.vector_y1,\n this.vector_color);\n\n /* we continue vectoring with a new set of parameters if the\n * current point is not out of limits.\n */\n\n if (this.curr_x >= 0 && this.curr_x < Globals.ALG_MAX_X &&\n this.curr_y >= 0 && this.curr_y < Globals.ALG_MAX_Y) {\n this.vector_x0 = this.curr_x;\n this.vector_y0 = this.curr_y;\n this.vector_x1 = this.curr_x;\n this.vector_y1 = this.curr_y;\n this.vector_dx = sig_dx;\n this.vector_dy = sig_dy;\n this.vector_color = this.zsh & 0xff;\n }\n else {\n this.vectoring = false;\n }\n }\n }\n\n this.curr_x += sig_dx;\n this.curr_y += sig_dy;\n\n if (this.vectoring &&\n this.curr_x >= 0 && this.curr_x < Globals.ALG_MAX_X &&\n this.curr_y >= 0 && this.curr_y < Globals.ALG_MAX_Y) {\n /* we're vectoring ... current point is still within limits so\n * extend the current vector.\n */\n this.vector_x1 = this.curr_x;\n this.vector_y1 = this.curr_y;\n }\n }\n\n addline(x0, y0, x1, y1, color) {\n if (!this.videoEnabled) return;\n // TODO\n //console.log(x0, y0, x1, y1, color);\n x0 = (x0 - Globals.BOUNDS_MIN_X) / (Globals.BOUNDS_MAX_X - Globals.BOUNDS_MIN_X) * Globals.SCREEN_X_DEFAULT;\n x1 = (x1 - Globals.BOUNDS_MIN_X) / (Globals.BOUNDS_MAX_X - Globals.BOUNDS_MIN_X) * Globals.SCREEN_X_DEFAULT;\n y0 = (y0 - Globals.BOUNDS_MIN_Y) / (Globals.BOUNDS_MAX_Y - Globals.BOUNDS_MIN_Y) * Globals.SCREEN_Y_DEFAULT;\n y1 = (y1 - Globals.BOUNDS_MIN_Y) / (Globals.BOUNDS_MAX_Y - Globals.BOUNDS_MIN_Y) * Globals.SCREEN_Y_DEFAULT;\n this.vectrex.video.drawLine(x0, y0, x1, y1, color, 7);\n }\n\n saveState() {\n return safe_extend(null, {}, this);\n }\n loadState(state) {\n safe_extend(null, this, state);\n }\n toLongString(state) {\n var s = \"\";\n for (var key in state) {\n s += key + \": \" + state[key] + \"\\n\";\n }\n return s;\n }\n}\n\n//\n\nclass VectrexPlatform extends Base6809Platform {\n\n mainElement;\n via: VIA6522;\n alg: VectrexAnalog;\n ram: Uint8Array;\n rom: Uint8Array;\n bios: Uint8Array;\n inputs: Uint8Array;\n bus;\n video: VectorVideo;\n psg: AY38910_Audio;\n audio;\n timer: AnimationTimer;\n\n constructor(mainElement) {\n super();\n this.mainElement = mainElement;\n }\n\n getPresets() {\n return VECTREX_PRESETS;\n }\n\n start() {\n this.via = new VIA6522(this);\n this.alg = new VectrexAnalog(this);\n this.bios = padBytes(new lzgmini().decode(stringToByteArray(atob(VECTREX_FASTROM_LZG))), 0x2000);\n this.ram = new Uint8Array(0x400);\n this.inputs = new Uint8Array(4);\n var mbus = {\n read: newAddressDecoder([\n [0x0000, 0x7fff, 0, (a) => { return this.rom && this.rom[a]; }],\n [0xc800, 0xcfff, 0x3ff, (a) => { return this.ram[a]; }],\n [0xd000, 0xdfff, 0xf, (a) => { return this.via.read(a); }],\n [0xe000, 0xffff, 0x1fff, (a) => { return this.bios && this.bios[a]; }],\n ]),\n\n write: newAddressDecoder([\n [0xc800, 0xcfff, 0x3ff, (a, v) => { this.ram[a] = v; }],\n [0xd000, 0xd7ff, 0x3ff, (a, v) => { this.via.write(a & 0xf, v); }],\n [0xd800, 0xdfff, 0x3ff, (a, v) => { this.ram[a] = v; this.via.write(a & 0xf, v); }],\n ])\n };\n this.bus = {\n read: (a) => { var v = mbus.read(a); this.probe.logRead(a,v); return v; },\n write: (a,v) => { this.probe.logWrite(a,v); mbus.write(a,v); }\n };\n this._cpu = this.newCPU(this.bus);\n // create video/audio\n this.video = new VectorVideo(this.mainElement, Globals.SCREEN_X_DEFAULT, Globals.SCREEN_Y_DEFAULT);\n this.video.persistenceAlpha = 0.2;\n this.audio = new MasterAudio();\n this.psg = new AY38910_Audio(this.audio);\n this.video.create();\n this.timer = new AnimationTimer(60, this.nextFrame.bind(this));\n setKeyboardFromMap(this.video, this.inputs, VECTREX_KEYCODE_MAP); // true = always send function);\n }\n\n // TODO: loadControlsState\n updateControls() {\n // joystick (analog simulation)\n this.alg.jch0 = (this.inputs[0] & 0x1) ? 0x00 : (this.inputs[0] & 0x2) ? 0xff : 0x80;\n this.alg.jch1 = (this.inputs[0] & 0x4) ? 0x00 : (this.inputs[0] & 0x8) ? 0xff : 0x80;\n this.alg.jch2 = (this.inputs[1] & 0x1) ? 0x00 : (this.inputs[1] & 0x2) ? 0xff : 0x80;\n this.alg.jch3 = (this.inputs[1] & 0x4) ? 0x00 : (this.inputs[1] & 0x8) ? 0xff : 0x80;\n // buttons (digital)\n this.psg.psg.register[14] = ~this.inputs[2];\n }\n\n advance(novideo:boolean) : number {\n if (!novideo) this.video.clear();\n this.alg.videoEnabled = !novideo;\n this.updateControls();\n this.probe.logNewFrame();\n var frameCycles = 1500000 / 60;\n var cycles = 0;\n while (cycles < frameCycles) {\n cycles += this.nextCycle();\n }\n return cycles;\n }\n\n nextCycle() {\n this.probe.logExecute(this.getPC(), this.getSP());\n if (this.via.ifr & 0x80) {\n this._cpu.interrupt();\n }\n var n = this.runCPU(this._cpu, 1);\n if (n == 0) n = 1; // TODO?\n this.probe.logClocks(n);\n for (var i=0; i<n; i++) {\n this.via.step0();\n this.alg.step();\n this.via.step1();\n }\n return n;\n }\n\n snd_update() {\n switch (this.via.orb & 0x18) {\n case 0x00:\n /* the sound chip is disabled */\n break;\n case 0x08:\n /* the sound chip is sending data */\n break;\n case 0x10:\n /* the sound chip is recieving data */\n if (this.psg.curreg != 14) {\n this.psg.setData(this.via.ora);\n }\n break;\n case 0x18:\n /* the sound chip is latching an address */\n if ((this.via.ora & 0xf0) == 0x00) {\n this.psg.selectRegister(this.via.ora & 0x0f);\n }\n break;\n }\n }\n\n getCPUState() {\n return this._cpu.saveState();\n }\n\n loadROM(title, data) {\n this.rom = padBytes(data, 0x8000);\n this.reset();\n }\n\n loadBIOS(title, data) {\n this.bios = padBytes(data, 0x2000);\n this.reset();\n }\n\n isRunning() {\n return this.timer.isRunning();\n }\n pause() {\n this.timer.stop();\n this.audio.stop();\n }\n resume() {\n this.timer.start();\n this.audio.start();\n }\n reset() {\n this._cpu.reset();\n this.via.reset();\n this.alg.reset();\n }\n readAddress(addr: number) {\n return ((addr & 0xf000) != 0xd000) ? this.bus.read(addr) : null; // ignore I/O space\n }\n\n loadState(state) {\n this._cpu.loadState(state.c);\n this.ram.set(state.b);\n this.via.loadState(state.via);\n this.alg.loadState(state.alg);\n this.loadControlsState(state);\n }\n saveState() {\n return {\n c: this.getCPUState(),\n b: this.ram.slice(0),\n via: this.via.saveState(),\n alg: this.alg.saveState(),\n in: this.inputs.slice(0)\n };\n }\n loadControlsState(state) {\n this.inputs.set(state.in);\n }\n saveControlsState() {\n return {\n in: this.inputs.slice(0)\n };\n }\n\n getMemoryMap() {\n return {\n main: [\n { name: 'Cartridge ROM', start: 0x0000, size: 0x8000, type: 'rom' },\n { name: 'RAM', start: 0xc800, size: 0x400, type: 'ram' },\n { name: 'I/O Registers', start: 0xd000, size: 0x80, type: 'io' },\n { name: 'BIOS', start: 0xe000, size: 0x2000, type: 'rom' },\n ]\n }\n };\n\n getDebugCategories() {\n return super.getDebugCategories().concat(['VIA6522','ANALOG']);\n }\n getDebugInfo(category, state) {\n switch (category) {\n case 'VIA6522': return this.via.toLongString(state.via);\n case 'ANALOG': return this.alg.toLongString(state.alg);\n default: return super.getDebugInfo(category, state);\n }\n }\n\n // probing\n nullProbe = new NullProbe();\n probe : ProbeAll = this.nullProbe;\n\n startProbing?() : ProbeRecorder {\n var rec = new ProbeRecorder(this);\n this.connectProbe(rec);\n return rec;\n }\n stopProbing?() : void {\n this.connectProbe(null);\n }\n connectProbe(probe:ProbeAll) {\n this.probe = probe || this.nullProbe;\n }\n}\n\n//\n\nPLATFORMS['vectrex'] = VectrexPlatform;\n\nvar VECTREX_FASTROM_LZG = `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`;\n"],
"mappings": "sNAkBA,GAAI,GAAkB,CACpB,CAAE,GAAI,aAAc,KAAM,qBAC1B,CAAE,GAAI,UAAW,KAAM,sBACvB,CAAE,GAAI,aAAc,KAAM,wBAC1B,CAAE,GAAI,WAAY,KAAM,8BAItB,EAAsB,EAAe,CACvC,CAAC,EAAK,KAAO,EAAG,GAChB,CAAC,EAAK,MAAO,EAAG,GAChB,CAAC,EAAK,KAAO,EAAG,GAChB,CAAC,EAAK,GAAO,EAAG,GAChB,CAAC,EAAK,KAAO,EAAG,GAChB,CAAC,EAAK,KAAO,EAAG,GAChB,CAAC,EAAK,KAAO,EAAG,GAChB,CAAC,EAAK,KAAO,EAAG,GAEhB,CAAC,EAAK,QAAU,EAAG,GACnB,CAAC,EAAK,SAAU,EAAG,GACnB,CAAC,EAAK,QAAU,EAAG,GACnB,CAAC,EAAK,MAAU,EAAG,GACnB,CAAC,EAAK,QAAU,EAAG,IACnB,CAAC,EAAK,QAAU,EAAG,IACnB,CAAC,EAAK,QAAU,EAAG,IACnB,CAAC,EAAK,QAAU,EAAG,OAKrB,OAAc,CAEZ,YAAY,EAAS,CAKrB,SAAM,EAEN,SAAM,EAEN,UAAO,EAEP,UAAO,EAEP,UAAO,EAEP,WAAQ,EAER,SAAM,EAEN,UAAO,EAEP,UAAO,EAEP,WAAQ,EAER,UAAO,EAEP,WAAQ,EAER,SAAM,EAEN,UAAO,EAEP,QAAK,EAEL,SAAM,EAEN,SAAM,EAEN,WAAQ,EAER,SAAM,EAEN,SAAM,EAEN,SAAM,EAEN,SAAM,EAEN,SAAM,EAEN,UAAO,EAEP,UAAO,EApDL,KAAK,QAAU,EAsDjB,OAAQ,CAGN,KAAK,IAAM,EACX,KAAK,IAAM,EACX,KAAK,KAAO,EACZ,KAAK,KAAO,EACZ,KAAK,KAAO,EACZ,KAAK,MAAQ,EACb,KAAK,IAAM,EACX,KAAK,KAAO,EACZ,KAAK,KAAO,EACZ,KAAK,MAAQ,IACb,KAAK,KAAO,EACZ,KAAK,MAAQ,EACb,KAAK,IAAM,EACX,KAAK,KAAO,EACZ,KAAK,GAAK,EACV,KAAK,IAAM,EACX,KAAK,IAAM,EACX,KAAK,MAAQ,EACb,KAAK,IAAM,EACX,KAAK,IAAM,EACX,KAAK,IAAM,EACX,KAAK,IAAM,EACX,KAAK,IAAM,EACX,KAAK,KAAO,EACZ,KAAK,KAAO,EAGd,YAAa,CACX,AAAK,KAAK,IAAM,IAAS,MAAK,IAAM,KAClC,KAAK,KAAO,IAGZ,KAAK,KAAO,IAIhB,OAAQ,CACN,GAAI,GAAU,EAsDd,GArDI,KAAK,MACP,MAAK,IAAO,KAAK,IAAM,EAAI,KAAK,IAAM,EAAI,MACrC,MAAK,IAAM,QAAW,OAEzB,CAAI,KAAK,IAAM,GAEb,MAAK,KAAO,GACZ,KAAK,aACL,KAAK,OAAS,IAEd,KAAK,IAAO,KAAK,MAAQ,EAAK,KAAK,MAI/B,KAAK,OACP,MAAK,KAAO,GACZ,KAAK,aACL,KAAK,MAAQ,IACb,KAAK,MAAQ,KAMjB,KAAK,MAAS,MAAK,IAAM,KAAS,GACpC,MAAK,IAAO,KAAK,IAAM,EAAI,KAAK,IAAM,EAAI,MACrC,MAAK,IAAM,QAAW,OAErB,KAAK,OACP,MAAK,KAAO,GACZ,KAAK,aACL,KAAK,MAAQ,IAMnB,KAAK,IAAO,KAAK,IAAM,EAAI,KAAK,IAAM,EAAI,IAC1C,AAAK,MAAK,IAAM,MAAS,IACvB,MAAK,IAAM,KAAK,KAChB,AAAI,KAAK,MACP,GAAU,EACV,KAAK,MAAQ,GAGb,GAAU,EACV,KAAK,MAAQ,IAIf,EAAU,EAGR,KAAK,IAAM,EAAG,CAChB,OAAQ,KAAK,IAAM,QACZ,GAEH,UACG,GAEH,AAAI,GAEF,MAAK,KAAO,EACZ,KAAK,OAEP,UACG,GAEH,KAAK,KAAO,EACZ,KAAK,MACL,UACG,IAEH,UACG,IAEH,AAAI,GACF,MAAK,KAAQ,KAAK,IAAM,EAAK,EAC7B,KAAK,KAAO,EACZ,KAAK,IAAM,KAAK,MAElB,UACG,IAEH,AAAI,GACF,MAAK,KAAQ,KAAK,IAAM,EAAK,EAC7B,KAAK,KAAO,EACZ,KAAK,IAAM,KAAK,KAChB,KAAK,OAEP,UACG,IAEH,KAAK,KAAQ,KAAK,IAAM,EAAK,EAC7B,KAAK,KAAO,EACZ,KAAK,IAAM,KAAK,KAChB,KAAK,MACL,UACG,IAEH,MAGJ,AAAI,KAAK,KAAO,GACd,MAAK,KAAO,EACZ,KAAK,eAKX,OAAQ,CACN,AAAK,MAAK,IAAM,KAAS,IAIvB,MAAK,IAAM,GAER,MAAK,IAAM,MAAS,KAIvB,MAAK,KAAO,GAIhB,KAAK,EAAS,CACZ,GAAI,GAEJ,OAAQ,EAAU,QACX,GAIH,MAAI,MAAK,IAAM,IAEb,EAAS,KAAK,IAAM,GAAQ,KAAK,MAAQ,KAAK,QAAQ,IAAI,QAI1D,EAAS,KAAK,IAAM,IAAQ,KAAK,QAAQ,IAAI,QAExC,EAAO,QACX,GAEH,AAAK,MAAK,IAAM,KAAS,GAIvB,MAAK,IAAM,OAGV,IACH,MAAK,MAAK,IAAM,KAAS,EAEvB,EAAO,KAAK,QAAQ,IAAI,WAIxB,EAAO,KAAK,IAEP,EAAO,QACX,GACH,MAAO,MAAK,KAAO,QAChB,GACH,MAAO,MAAK,KAAO,QAChB,GAEH,SAAO,KAAK,IACZ,KAAK,KAAO,IACZ,KAAK,KAAO,EACZ,KAAK,MAAQ,EACb,KAAK,MAAQ,IACb,KAAK,aACE,EAAO,QACX,GAEH,MAAQ,MAAK,KAAO,EAAK,QACtB,GAEH,MAAO,MAAK,KAAO,QAChB,GAEH,MAAO,MAAK,KAAO,QAChB,GAEH,SAAO,KAAK,IACZ,KAAK,KAAO,IACZ,KAAK,KAAO,EACZ,KAAK,MAAQ,EACb,KAAK,aACE,EAAO,QACX,GAEH,MAAQ,MAAK,KAAO,MACjB,IACH,SAAO,KAAK,GACZ,KAAK,KAAO,IACZ,KAAK,IAAM,EACX,KAAK,MAAQ,EACb,KAAK,aACE,EAAO,QACX,IACH,MAAO,MAAK,IAAM,QACf,IACH,MAAO,MAAK,IAAM,QACf,IAEH,MAAO,MAAK,IAAM,QACf,IAEH,MAAQ,MAAK,IAAM,KAAQ,KAIjC,MAAM,EAAS,EAAM,CACnB,OAAQ,EAAU,QACX,GACH,KAAK,IAAM,EACX,KAAK,QAAQ,aACb,KAAK,QAAQ,IAAI,SACZ,MAAK,IAAM,MAAS,KAIvB,MAAK,KAAO,GAEd,UACG,GAEH,AAAK,MAAK,IAAM,KAAS,GAIvB,MAAK,IAAM,OAGV,IACH,KAAK,IAAM,EACX,KAAK,QAAQ,aAIb,KAAK,QAAQ,IAAI,IAAM,EAAO,IAC9B,KAAK,QAAQ,IAAI,SACjB,UACG,GACH,KAAK,KAAO,EACZ,UACG,GACH,KAAK,KAAO,EACZ,UACG,GAEH,KAAK,KAAO,EACZ,UACG,GAEH,KAAK,KAAO,EACZ,KAAK,IAAO,KAAK,MAAQ,EAAK,KAAK,KACnC,KAAK,KAAO,IACZ,KAAK,KAAO,EACZ,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,aACL,UACG,GAEH,KAAK,KAAO,EACZ,UACG,GAEH,KAAK,KAAO,EACZ,UACG,GAEH,KAAK,KAAO,EACZ,UACG,GAEH,KAAK,IAAO,GAAQ,EAAK,KAAK,KAC9B,KAAK,KAAO,IACZ,KAAK,KAAO,EACZ,KAAK,MAAQ,EACb,KAAK,aACL,UACG,IACH,KAAK,GAAK,EACV,KAAK,KAAO,IACZ,KAAK,IAAM,EACX,KAAK,MAAQ,EACb,KAAK,aACL,UACG,IACH,KAAK,IAAM,EACX,UACG,IACH,KAAK,IAAM,EACX,AAAK,MAAK,IAAM,KAAS,GAEvB,KAAK,IAAM,EAMX,KAAK,IAAM,EAEb,AAAK,MAAK,IAAM,MAAS,IAEvB,KAAK,KAAO,EAMZ,KAAK,KAAO,EAEd,UACG,IAEH,KAAK,KAAQ,CAAE,GAAO,KACtB,KAAK,aACL,UACG,IAEH,AAAI,EAAO,IACT,KAAK,KAAO,EAAO,IAGnB,KAAK,KAAQ,CAAE,GAAO,KAExB,KAAK,aACL,OAGN,WAAY,CACV,MAAO,GAAY,KAAM,GAAI,MAE/B,UAAU,EAAO,CACf,EAAY,KAAM,KAAM,GAE1B,aAAa,EAAO,CAClB,GAAI,GAAI,GACR,OAAS,KAAO,GACd,GAAK,EAAM,KAAO,EAAI,EAAM,IAAQ;AAAA,EAEtC,MAAO,KAIL,EACN,CACE,YAAa,KACb,eAAgB,IAChB,UAAW,KACX,UAAW,KAGX,iBAAkB,IAClB,iBAAkB,KAClB,aAAc,EACd,aAAc,IACd,aAAc,KACd,aAAc,GAGhB,OAAoB,CAElB,YAAY,EAAS,CAGrB,kBAAe,GAEf,SAAM,EAEN,SAAM,EAEN,SAAM,EAEN,SAAM,EAEN,UAAO,EAEP,UAAO,EAEP,UAAO,EAEP,UAAO,EAEP,SAAM,EAEN,aAAU,EAEV,QAAK,EAEL,QAAK,EAEL,YAAS,EAET,YAAS,EAET,WAAQ,EAAQ,WAAa,EAC7B,WAAQ,EAAQ,WAAa,EAG7B,eAAY,GAEZ,eAAY,EAEZ,eAAY,EAEZ,eAAY,EAEZ,eAAY,EAEZ,eAAY,EAEZ,eAAY,EAEZ,kBAAe,EAlDb,KAAK,QAAU,EAoDjB,OAAQ,CACN,KAAK,IAAM,IACX,KAAK,IAAM,IACX,KAAK,IAAM,IACX,KAAK,IAAM,EACX,KAAK,KAAO,IACZ,KAAK,KAAO,IACZ,KAAK,KAAO,IACZ,KAAK,KAAO,IACZ,KAAK,IAAM,IACX,KAAK,QAAU,EAEf,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,OAAS,EAAQ,WAAa,EACnC,KAAK,OAAS,EAAQ,WAAa,EACnC,KAAK,UAAY,GAGnB,QAAS,CACP,GAAI,GAAM,KAAK,QAAQ,IACvB,OAAQ,EAAI,IAAM,OACX,GACH,KAAK,IAAM,KAAK,KACX,GAAI,IAAM,IAAS,GAEtB,MAAK,IAAM,KAAK,KAElB,UACG,GACH,KAAK,IAAM,KAAK,KACX,GAAI,IAAM,IAAS,GAEtB,MAAK,IAAM,KAAK,KAElB,UACG,GACH,KAAK,IAAM,KAAK,KACX,GAAI,IAAM,IAAS,GAEtB,CAAI,KAAK,IAAM,IACb,KAAK,IAAM,KAAK,IAAM,IAEtB,KAAK,IAAM,GAGf,UACG,GAEH,KAAK,IAAM,KAAK,KAChB,MAIJ,AAAI,KAAK,IAAM,KAAK,IAClB,KAAK,QAAU,GAEf,KAAK,QAAU,EAIjB,KAAK,GAAK,KAAK,IAAM,KAAK,IAC1B,KAAK,GAAK,KAAK,IAAM,KAAK,IAG5B,MAAO,CACL,GAAI,GAAM,KAAK,QAAQ,IACnB,EAAS,EACT,EAAS,EACT,EAAW,EACX,EAAY,EAEhB,AAAI,EAAI,IAAM,GACZ,EAAY,EAAI,KAGhB,EAAY,EAAI,KAGlB,AAAI,EAAI,KAAO,EAKb,GAAS,KAAK,MAAQ,KAAK,OAC3B,EAAS,KAAK,MAAQ,KAAK,QAG3B,CAAI,EAAI,IAAM,IACZ,EAAW,EAAI,MAGf,EAAW,EAAI,IAAM,IAGvB,AAAI,GAAY,EACd,GAAS,KAAK,GACd,EAAS,KAAK,IAGd,GAAS,EACT,EAAS,IAKb,AAAK,KAAK,UAiBR,AAAI,GAAa,EAIf,MAAK,UAAY,GAEjB,KAAK,QAAQ,KAAK,UAAW,KAAK,UAChC,KAAK,UAAW,KAAK,UACrB,KAAK,eAEA,IAAU,KAAK,WACtB,GAAU,KAAK,WACd,MAAK,IAAM,MAAS,KAAK,eAK1B,MAAK,QAAQ,KAAK,UAAW,KAAK,UAChC,KAAK,UAAW,KAAK,UACrB,KAAK,cAMP,AAAI,KAAK,QAAU,GAAK,KAAK,OAAS,EAAQ,WAC5C,KAAK,QAAU,GAAK,KAAK,OAAS,EAAQ,UAC1C,MAAK,UAAY,KAAK,OACtB,KAAK,UAAY,KAAK,OACtB,KAAK,UAAY,KAAK,OACtB,KAAK,UAAY,KAAK,OACtB,KAAK,UAAY,EACjB,KAAK,UAAY,EACjB,KAAK,aAAe,KAAK,IAAM,KAG/B,KAAK,UAAY,IApDjB,GAAa,GACf,KAAK,QAAU,GAAK,KAAK,OAAS,EAAQ,WAC1C,KAAK,QAAU,GAAK,KAAK,OAAS,EAAQ,WAE1C,MAAK,UAAY,GACjB,KAAK,UAAY,KAAK,OACtB,KAAK,UAAY,KAAK,OACtB,KAAK,UAAY,KAAK,OACtB,KAAK,UAAY,KAAK,OACtB,KAAK,UAAY,EACjB,KAAK,UAAY,EACjB,KAAK,aAAe,KAAK,IAAM,KA8CnC,KAAK,QAAU,EACf,KAAK,QAAU,EAEX,KAAK,WACP,KAAK,QAAU,GAAK,KAAK,OAAS,EAAQ,WAC1C,KAAK,QAAU,GAAK,KAAK,OAAS,EAAQ,WAI1C,MAAK,UAAY,KAAK,OACtB,KAAK,UAAY,KAAK,QAI1B,QAAQ,EAAI,EAAI,EAAI,EAAI,EAAO,CAC7B,AAAI,CAAC,KAAK,cAGV,GAAM,GAAK,EAAQ,cAAiB,GAAQ,aAAe,EAAQ,cAAgB,EAAQ,iBAC3F,EAAM,GAAK,EAAQ,cAAiB,GAAQ,aAAe,EAAQ,cAAgB,EAAQ,iBAC3F,EAAM,GAAK,EAAQ,cAAiB,GAAQ,aAAe,EAAQ,cAAgB,EAAQ,iBAC3F,EAAM,GAAK,EAAQ,cAAiB,GAAQ,aAAe,EAAQ,cAAgB,EAAQ,iBAC3F,KAAK,QAAQ,MAAM,SAAS,EAAI,EAAI,EAAI,EAAI,EAAO,IAGrD,WAAY,CACV,MAAO,GAAY,KAAM,GAAI,MAE/B,UAAU,EAAO,CACf,EAAY,KAAM,KAAM,GAE1B,aAAa,EAAO,CAClB,GAAI,GAAI,GACR,OAAS,KAAO,GACd,GAAK,EAAM,KAAO,EAAM,GAAO;AAAA,EAEjC,MAAO,KAMX,eAA8B,EAAiB,CAe7C,YAAY,EAAa,CACvB,QA4LF,eAAY,GAAI,GAChB,WAAmB,KAAK,UA5LtB,KAAK,YAAc,EAGrB,YAAa,CACX,MAAO,GAGT,OAAQ,CACN,KAAK,IAAM,GAAI,GAAQ,MACvB,KAAK,IAAM,GAAI,GAAc,MAC7B,KAAK,KAAO,EAAS,GAAI,KAAU,OAAO,EAAkB,KAAK,KAAwB,MACzF,KAAK,IAAM,GAAI,YAAW,MAC1B,KAAK,OAAS,GAAI,YAAW,GAC7B,GAAI,GAAO,CACT,KAAM,EAAkB,CACtB,CAAC,EAAQ,MAAQ,EAAG,AAAC,GAAe,KAAK,KAAO,KAAK,IAAI,IACzD,CAAC,MAAQ,MAAQ,KAAO,AAAC,GAAe,KAAK,IAAI,IACjD,CAAC,MAAQ,MAAQ,GAAK,AAAC,GAAe,KAAK,IAAI,KAAK,IACpD,CAAC,MAAQ,MAAQ,KAAQ,AAAC,GAAe,KAAK,MAAQ,KAAK,KAAK,MAGlE,MAAO,EAAkB,CACvB,CAAC,MAAQ,MAAQ,KAAO,CAAC,EAAG,IAAM,CAAE,KAAK,IAAI,GAAK,IAClD,CAAC,MAAQ,MAAQ,KAAO,CAAC,EAAG,IAAM,CAAE,KAAK,IAAI,MAAM,EAAI,GAAK,KAC5D,CAAC,MAAQ,MAAQ,KAAO,CAAC,EAAG,IAAM,CAAE,KAAK,IAAI,GAAK,EAAG,KAAK,IAAI,MAAM,EAAI,GAAK,QAGjF,KAAK,IAAM,CACT,KAAM,AAAC,GAAM,CAAE,GAAI,GAAI,EAAK,KAAK,GAAI,YAAK,MAAM,QAAQ,EAAE,GAAW,GACrE,MAAO,CAAC,EAAE,IAAM,CAAE,KAAK,MAAM,SAAS,EAAE,GAAI,EAAK,MAAM,EAAE,KAE3D,KAAK,KAAO,KAAK,OAAO,KAAK,KAE7B,KAAK,MAAQ,GAAI,GAAY,KAAK,YAAa,EAAQ,iBAAkB,EAAQ,kBACjF,KAAK,MAAM,iBAAmB,GAC9B,KAAK,MAAQ,GAAI,GACjB,KAAK,IAAM,GAAI,GAAc,KAAK,OAClC,KAAK,MAAM,SACX,KAAK,MAAQ,GAAI,GAAe,GAAI,KAAK,UAAU,KAAK,OACxD,EAAmB,KAAK,MAAO,KAAK,OAAQ,GAI9C,gBAAiB,CAEf,KAAK,IAAI,KAAQ,KAAK,OAAO,GAAK,EAAO,EAAQ,KAAK,OAAO,GAAK,EAAO,IAAO,IAChF,KAAK,IAAI,KAAQ,KAAK,OAAO,GAAK,EAAO,EAAQ,KAAK,OAAO,GAAK,EAAO,IAAO,IAChF,KAAK,IAAI,KAAQ,KAAK,OAAO,GAAK,EAAO,EAAQ,KAAK,OAAO,GAAK,EAAO,IAAO,IAChF,KAAK,IAAI,KAAQ,KAAK,OAAO,GAAK,EAAO,EAAQ,KAAK,OAAO,GAAK,EAAO,IAAO,IAEhF,KAAK,IAAI,IAAI,SAAS,IAAM,CAAC,KAAK,OAAO,GAG3C,QAAQ,EAA0B,CAChC,AAAK,GAAS,KAAK,MAAM,QACzB,KAAK,IAAI,aAAe,CAAC,EACzB,KAAK,iBACL,KAAK,MAAM,cAGX,OAFI,GAAc,KAAU,GACxB,EAAS,EACN,EAAS,GACd,GAAU,KAAK,YAEjB,MAAO,GAGT,WAAY,CACV,KAAK,MAAM,WAAW,KAAK,QAAS,KAAK,SACrC,KAAK,IAAI,IAAM,KACjB,KAAK,KAAK,YAEZ,GAAI,GAAI,KAAK,OAAO,KAAK,KAAM,GAC/B,AAAI,GAAK,GAAG,GAAI,GAChB,KAAK,MAAM,UAAU,GACrB,OAAS,GAAE,EAAG,EAAE,EAAG,IACjB,KAAK,IAAI,QACT,KAAK,IAAI,OACT,KAAK,IAAI,QAEX,MAAO,GAGT,YAAa,CACX,OAAQ,KAAK,IAAI,IAAM,QAChB,GAEH,UACG,GAEH,UACG,IAEH,AAAI,KAAK,IAAI,QAAU,IACrB,KAAK,IAAI,QAAQ,KAAK,IAAI,KAE5B,UACG,IAEH,AAAK,MAAK,IAAI,IAAM,MAAS,GAC3B,KAAK,IAAI,eAAe,KAAK,IAAI,IAAM,IAEzC,OAIN,aAAc,CACZ,MAAO,MAAK,KAAK,YAGnB,QAAQ,EAAO,EAAM,CACnB,KAAK,IAAM,EAAS,EAAM,OAC1B,KAAK,QAGP,SAAS,EAAO,EAAM,CACpB,KAAK,KAAO,EAAS,EAAM,MAC3B,KAAK,QAGP,WAAY,CACV,MAAO,MAAK,MAAM,YAEpB,OAAQ,CACN,KAAK,MAAM,OACX,KAAK,MAAM,OAEb,QAAS,CACP,KAAK,MAAM,QACX,KAAK,MAAM,QAEb,OAAQ,CACN,KAAK,KAAK,QACV,KAAK,IAAI,QACT,KAAK,IAAI,QAEX,YAAY,EAAc,CACxB,MAAS,GAAO,QAAW,MAAU,KAAK,IAAI,KAAK,GAAQ,KAG7D,UAAU,EAAO,CACf,KAAK,KAAK,UAAU,EAAM,GAC1B,KAAK,IAAI,IAAI,EAAM,GACnB,KAAK,IAAI,UAAU,EAAM,KACzB,KAAK,IAAI,UAAU,EAAM,KACzB,KAAK,kBAAkB,GAEzB,WAAY,CACV,MAAO,CACL,EAAG,KAAK,cACR,EAAG,KAAK,IAAI,MAAM,GAClB,IAAK,KAAK,IAAI,YACd,IAAK,KAAK,IAAI,YACd,GAAI,KAAK,OAAO,MAAM,IAG1B,kBAAkB,EAAO,CACvB,KAAK,OAAO,IAAI,EAAM,IAExB,mBAAoB,CAClB,MAAO,CACL,GAAI,KAAK,OAAO,MAAM,IAI1B,cAAe,CACb,MAAO,CACL,KAAM,CACJ,CAAE,KAAM,gBAAiB,MAAO,EAAQ,KAAM,MAAQ,KAAM,OAC5D,CAAE,KAAM,MAAO,MAAO,MAAQ,KAAM,KAAO,KAAM,OACjD,CAAE,KAAM,gBAAiB,MAAO,MAAQ,KAAM,IAAM,KAAM,MAC1D,CAAE,KAAM,OAAQ,MAAO,MAAQ,KAAM,KAAQ,KAAM,SAKzD,oBAAqB,CACnB,MAAO,OAAM,qBAAqB,OAAO,CAAC,UAAU,WAEtD,aAAa,EAAU,EAAO,CAC5B,OAAQ,OACD,UAAW,MAAO,MAAK,IAAI,aAAa,EAAM,SAC9C,SAAU,MAAO,MAAK,IAAI,aAAa,EAAM,aACzC,MAAO,OAAM,aAAa,EAAU,IAQjD,cAAgC,CAC9B,GAAI,GAAM,GAAI,GAAc,MAC5B,YAAK,aAAa,GACX,EAET,aAAsB,CACpB,KAAK,aAAa,MAEpB,aAAa,EAAgB,CAC3B,KAAK,MAAQ,GAAS,KAAK,YAM/B,EAAU,QAAa,EAEvB,GAAI,GAAsB",
"names": []
}