8bitworkshop/gen/pce-QQSEYHLV.js.map

8 lines
165 KiB
Plaintext

{
"version": 3,
"sources": ["../src/platform/pce.ts"],
"sourcesContent": ["import { DisasmLine, Platform, Preset, getToolForFilename_6502 } from \"../common/baseplatform\";\nimport { Keys, PLATFORMS, RasterVideo } from \"../common/emu\";\n\nconst PCE_PRESETS = [\n { id: 'test_conio.c', name: 'Hello World (conio)' },\n { id: 'siegegame.c', name: 'Siege Game (conio)' },\n { id: 'hello.wiz', name: 'Hello World (Wiz)' },\n]\n\nclass PCEnginePlatform implements Platform {\n mainElement: HTMLElement;\n pce: PCE;\n video: RasterVideo;\n\n constructor(mainElement) {\n this.mainElement = mainElement;\n }\n start(): void | Promise<void> {\n this.pce = new PCE();\n this.video = new RasterVideo(this.mainElement, 684, 262, { overscan: true, aspect: 4 / 3 });\n this.video.create();\n this.pce.SetCanvas(this.video.canvas);\n }\n reset(): void {\n this.pce.Reset();\n }\n isRunning(): boolean {\n return this.pce.TimerID != null;\n }\n pause(): void {\n this.pce.Pause();\n }\n resume(): void {\n this.pce.CreateAudioContext();\n this.pce.Start();\n }\n getPresets(): Preset[] {\n return PCE_PRESETS;\n }\n loadROM(title: string, rom: Uint8Array) {\n this.pce.Pause();\n this.pce.Init();\n this.pce.SetROM(rom);\n }\n getPlatformName(): string {\n return \"PC Engine\";\n }\n getToolForFilename(fn: string): string {\n return getToolForFilename_6502(fn);\n }\n getDefaultExtension(): string {\n return \".pce\";\n }\n readAddress(addr: number): number {\n return this.pce.Get(addr);\n }\n writeAddress(addr: number, value: number): void {\n this.pce.Set(addr, value);\n }\n readVRAMAddress(addr: number): number {\n return this.pce.VDC[0].VRAM[addr];\n }\n // TODO\n /*\n disassemble(pc: number, read: (addr: number) => number): DisasmLine {\n return disassembleHuC6280(pc, read(pc), read(pc + 1), read(pc + 2));\n }\n */\n}\n\nPLATFORMS['pce'] = PCEnginePlatform;\n\n/*\n\nhttps://github.com/yhzmr442/jspce\n\nMIT License\n\nCopyright (c) 2019 yhzmr442\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n*/\n\nclass PCE {\n SuperGrafx: boolean;\n CountryTypePCE: number;\n CountryTypeTG16: number;\n CountryType: any;\n GamePadButton6: boolean;\n MultiTap: boolean;\n TimerID: number | null; c\n MainCanvas: HTMLCanvasElement | null = null;\n Ctx: CanvasRenderingContext2D | null = null;\n ImageData: ImageData | null = null;\n DrawFlag: boolean;\n Mapper: any;\n OpCycles: number[];\n OpBytes: number[];\n A: number;\n X: number;\n Y: number;\n PC: number;\n S: number;\n P: number;\n NZCacheTable: Uint8Array;\n NFlag: number;\n VFlag: number;\n TFlag: number;\n BFlag: number;\n DFlag: number;\n IFlag: number;\n ZFlag: number;\n CFlag: number;\n TIQFlag: number;\n IRQ1Flag: number;\n IRQ2Flag: number;\n ProgressClock: number;\n CPUBaseClock: number;\n BaseClock1: number;\n BaseClock3: number;\n BaseClock5: number;\n BaseClock7: number;\n BaseClock10: number;\n TransferSrc: number;\n TransferDist: number;\n TransferLen: number;\n TransferAlt: number;\n LastInt: number;\n MPRSelect: any;\n MPR: any;\n RAM: Uint8Array;\n RAMMask: number;\n BRAM: Uint8Array;\n BRAMUse: boolean;\n INTIRQ2: number;\n IntDisableRegister: number;\n MapperBase = class {\n ROM: number[];\n Core: any;\n constructor(rom, core) {\n this.ROM = rom;\n this.Core = core;\n }\n\n Init() {\n }\n\n Read(address) {\n return 0xFF;\n }\n\n Write(address, data) {\n }\n };\n Mapper0: typeof this.MapperBase;\n Mapper1: typeof this.MapperBase;\n Mapper2: typeof this.MapperBase;\n VDC: any[];\n INTTIQ: number;\n Palette: any[];\n PaletteData: any[];\n MonoPaletteData: any[];\n VCEBaseClock: number;\n VCEControl: number;\n VCEAddress: number;\n VCEData: number;\n VPCRegister: Uint8Array;\n VPCWindow1: number;\n VPCWindow2: number;\n VPCPriority: Uint8Array;\n VDCPutLineProgressClock: number;\n VDCPutLine: number;\n VDCLineClock: number;\n ScreenSize: any[];\n PutScreenSize: any[];\n VScreenWidthArray: any[];\n ReverseBit: Uint8Array;\n ReverseBit16: Uint16Array;\n ReverseBit256: Uint32Array;\n SPAddressMask: any[];\n WaveDataArray: any[];\n WaveClockCounter: number;\n WaveVolume: number;\n WebAudioCtx: AudioContext;\n WebAudioJsNode: any;\n WebAudioGainNode: any;\n WebAudioBufferSize: number;\n PSGClock: number;\n WaveLfoOn: any;\n PSGChannel: any;\n WaveVolumeLeft: any;\n WaveVolumeRight: any;\n PSGBaseClock: any;\n PSGProgressClock: number;\n WaveLfoControl: number;\n WaveLfoFreqency: number;\n TimerBaseClock: any;\n TimerReload: number;\n TimerFlag: boolean;\n TimerCounter: number;\n TimerPrescaler: number;\n JoystickSEL: number;\n JoystickCLR: number;\n KeyUpFunction: null;\n KeyDownFunction: null;\n Keybord: any[];\n GamePad: any[];\n GamePadSelect: number;\n GamePadButtonSelect: number;\n GamePadBuffer: number;\n GamePadData: any[];\n GamePadKeyData: { index: number; data: number; }[];\n GamePadPovData: number[];\n VDCSelect: number = 0;\n ScreenWidthMAX = 0;\n ScreenHeightMAX = 0;\n\n constructor() {\n /* ***************** */\n /* **** Setting **** */\n /* ***************** */\n this.SuperGrafx = false;\n this.CountryTypePCE = 0x40;\n this.CountryTypeTG16 = 0x00;\n this.CountryType = this.CountryTypePCE;\n this.GamePadButton6 = false;\n this.MultiTap = false;\n\n /* ******************* */\n /* **** Construct **** */\n /* ******************* */\n this.EtcConstruct();\n this.CPUConstruct();\n this.StorageConstruct();\n this.VCEConstruct();\n this.VPCConstruct();\n this.VDCConstruct();\n this.SoundConstruct();\n this.PSGConstruct();\n this.TimerConstruct();\n this.JoystickConstruct();\n }\n\n\n /* ************* */\n /* **** ETC **** */\n /* ************* */\n EtcConstruct() {\n this.TimerID = null;\n this.MainCanvas = null;\n this.Ctx = null;\n this.ImageData = null;\n }\n\n\n UpdateAnimationFrame() {\n this.TimerID = window.requestAnimationFrame(this.UpdateAnimationFrame.bind(this));\n this.Run();\n }\n\n\n CancelAnimationFrame() {\n window.cancelAnimationFrame(this.TimerID);\n this.TimerID = null;\n }\n\n\n Pause() {\n if (this.TimerID != null) {\n this.JoystickEventRelease();\n this.CancelAnimationFrame();\n }\n }\n\n\n Start() {\n if (this.TimerID == null) {\n this.JoystickEventInit();\n this.UpdateAnimationFrame();\n }\n }\n\n\n Run() {\n this.CheckGamePad();\n this.DrawFlag = false;\n while (!this.DrawFlag) {\n this.CPURun();\n this.VDCRun();\n this.TimerRun();\n this.PSGRun();\n }\n }\n\n\n Reset() {\n this.StorageReset();\n this.Mapper.Init();\n this.CPUInit();\n this.VCEInit();\n this.VPCInit();\n this.VDCInit();\n this.TimerInit();\n this.JoystickInit();\n this.PSGInit();\n this.CPUReset();\n }\n\n\n Init() {\n this.StorageInit();\n this.CPUInit();\n this.VCEInit();\n this.VPCInit();\n this.VDCInit();\n this.TimerInit();\n this.JoystickInit();\n this.PSGInit();\n }\n\n\n SetCanvas(canvas: HTMLCanvasElement) {\n this.MainCanvas = canvas;\n if (!this.MainCanvas.getContext)\n return false;\n\n this.Ctx = this.MainCanvas.getContext(\"2d\");\n this.ImageData = this.Ctx.createImageData(this.MainCanvas.width, this.MainCanvas.height); // this.ScreenWidthMAX, this.ScreenHeightMAX);\n for (let i = 0; i < this.MainCanvas.width * this.MainCanvas.height * 4; i += 4) {\n this.ImageData.data[i] = 0;\n this.ImageData.data[i + 1] = 0;\n this.ImageData.data[i + 2] = 0;\n this.ImageData.data[i + 3] = 255;\n }\n this.Ctx.putImageData(this.ImageData, 0, 0);\n\n return true;\n }\n\n /* ************* */\n /* **** CPU **** */\n /* ************* */\n CPUConstruct() {\n this.OpCycles = [\n 8, 7, 3, 4, 6, 4, 6, 7, 3, 2, 2, 2, 7, 5, 7, 6,// 0x00\n 2, 7, 7, 4, 6, 4, 6, 7, 2, 5, 2, 2, 7, 5, 7, 6,// 0x10\n 7, 7, 3, 4, 4, 4, 6, 7, 3, 2, 2, 2, 5, 5, 7, 6,// 0x20\n 2, 7, 7, 2, 4, 4, 6, 7, 2, 5, 2, 2, 5, 5, 7, 6,// 0x30\n 7, 7, 3, 4, 8, 4, 6, 7, 3, 2, 2, 2, 4, 5, 7, 6,// 0x40\n 2, 7, 7, 5, 2, 4, 6, 7, 2, 5, 3, 2, 2, 5, 7, 6,// 0x50\n 7, 7, 2, 2, 4, 4, 6, 7, 3, 2, 2, 2, 7, 5, 7, 6,// 0x60\n 2, 7, 7, 0, 4, 4, 6, 7, 2, 5, 3, 2, 7, 5, 7, 6,// 0x70\n 4, 7, 2, 7, 4, 4, 4, 7, 2, 2, 2, 2, 5, 5, 5, 6,// 0x80\n 2, 7, 7, 8, 4, 4, 4, 7, 2, 5, 2, 2, 5, 5, 5, 6,// 0x90\n 2, 7, 2, 7, 4, 4, 4, 7, 2, 2, 2, 2, 5, 5, 5, 6,// 0xA0\n 2, 7, 7, 8, 4, 4, 4, 7, 2, 5, 2, 2, 5, 5, 5, 6,// 0xB0\n 2, 7, 2, 0, 4, 4, 6, 7, 2, 2, 2, 2, 5, 5, 7, 6,// 0xC0\n 2, 7, 7, 0, 2, 4, 6, 7, 2, 5, 3, 2, 2, 5, 7, 6,// 0xD0\n 2, 7, 2, 0, 4, 4, 6, 7, 2, 2, 2, 2, 5, 5, 7, 6,// 0xE0\n 2, 7, 7, 0, 2, 4, 6, 7, 2, 5, 3, 2, 2, 5, 7, 6];//0xF0\n\n this.OpBytes = [\n 0, 2, 1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 0,// 0x00\n 0, 2, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 0,// 0x10\n 0, 2, 1, 2, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 0,// 0x20\n 0, 2, 2, 1, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 0,// 0x30\n 0, 2, 1, 2, 0, 2, 2, 2, 1, 2, 1, 1, 0, 3, 3, 0,// 0x40\n 0, 2, 2, 2, 1, 2, 2, 2, 1, 3, 1, 1, 1, 3, 3, 0,// 0x50\n 0, 2, 1, 1, 2, 2, 2, 2, 1, 2, 1, 1, 0, 3, 3, 0,// 0x60\n 0, 2, 2, 0, 2, 2, 2, 2, 1, 3, 1, 1, 0, 3, 3, 0,// 0x70\n 0, 2, 1, 3, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 0,// 0x80\n 0, 2, 2, 4, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 0,// 0x90\n 2, 2, 2, 3, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 0,// 0xA0\n 0, 2, 2, 4, 2, 2, 2, 2, 1, 3, 1, 1, 3, 3, 3, 0,// 0xB0\n 2, 2, 1, 0, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 0,// 0xC0\n 0, 2, 2, 0, 1, 2, 2, 2, 1, 3, 1, 1, 1, 3, 3, 0,// 0xD0\n 2, 2, 1, 0, 2, 2, 2, 2, 1, 2, 1, 1, 3, 3, 3, 0,// 0xE0\n 0, 2, 2, 0, 1, 2, 2, 2, 1, 3, 1, 1, 1, 3, 3, 0];//0xF0\n\n this.A = 0;\n this.X = 0;\n this.Y = 0;\n this.PC = 0;\n this.S = 0;\n this.P = 0;\n\n this.NZCacheTable = new Uint8Array(0x100);\n this.NZCacheTable = this.NZCacheTable.map((d, i) => { return i & 0x80; });\n this.NZCacheTable[0x00] = 0x02;\n\n this.NFlag = 0x80;\n this.VFlag = 0x40;\n this.TFlag = 0x20;\n this.BFlag = 0x10;\n this.DFlag = 0x08;\n this.IFlag = 0x04;\n this.ZFlag = 0x02;\n this.CFlag = 0x01;\n\n this.TIQFlag = 0x04;\n this.IRQ1Flag = 0x02;\n this.IRQ2Flag = 0x01;\n\n this.ProgressClock = 0;\n this.CPUBaseClock = 0;\n\n this.BaseClock1 = 12;\n this.BaseClock3 = 6;\n this.BaseClock5 = 4;\n this.BaseClock7 = 3;\n this.BaseClock10 = 2;\n\n this.TransferSrc = 0;\n this.TransferDist = 0;\n this.TransferLen = 0;\n this.TransferAlt = 0;\n }\n\n\n CPUReset() {\n this.TransferSrc = 0;\n this.TransferDist = 0;\n this.TransferLen = 0;\n this.TransferAlt = 0;\n\n this.CPUBaseClock = this.BaseClock1;\n\n this.SetIFlag();\n this.PC = this.Get16(0xFFFE);\n }\n\n\n CPUInit() {\n this.A = 0;\n this.X = 0;\n this.Y = 0;\n this.PC = 0;\n this.S = 0;\n this.P = 0x00;\n\n this.ProgressClock = 0;\n this.CPUBaseClock = this.BaseClock1;\n\n this.TransferSrc = 0;\n this.TransferDist = 0;\n this.TransferLen = 0;\n this.TransferAlt = 0;\n\n this.LastInt = 0x00;\n }\n\n\n CPURun() {\n this.ProgressClock = 0;\n\n let tmp = this.LastInt;\n this.LastInt = (this.P & this.IFlag) == 0x00 ? this.GetIntStatus() : 0x00;\n\n if (tmp != 0x00 && this.TransferLen == 0) {\n this.LastInt = 0x00;\n\n if ((tmp & this.TIQFlag) == this.TIQFlag) {//TIQ\n this.Push(this.PCH());\n this.Push(this.PCL());\n this.Push(this.P);\n this.P = 0x04;\n this.PC = this.Get16(0xFFFA);\n } else if ((tmp & this.IRQ1Flag) == this.IRQ1Flag) {//IRQ1\n this.Push(this.PCH());\n this.Push(this.PCL());\n this.Push(this.P);\n this.P = 0x04;\n this.PC = this.Get16(0xFFF8);\n } else if ((tmp & this.IRQ2Flag) == this.IRQ2Flag) {//IRQ2\n this.Push(this.PCH());\n this.Push(this.PCL());\n this.Push(this.P);\n this.SetIFlag();\n this.PC = this.Get16(0xFFF6);\n }\n this.ProgressClock = 8 * this.CPUBaseClock;\n } else\n this.OpExec();\n }\n\n\n OpExec() {\n let address;\n let tmp;\n let data;\n let bit;\n let i;\n\n let op = this.Get(this.PC);\n\n switch (op) {\n case 0x69: // ADC IMM\n this.ADC(this.PC + 1);\n break;\n case 0x65: // ADC ZP\n this.ADC(this.ZP());\n break;\n case 0x75: // ADC ZP, X\n this.ADC(this.ZP_X());\n break;\n case 0x72: // ADC (IND)\n this.ADC(this.IND());\n break;\n case 0x61: // ADC (IND, X)\n this.ADC(this.IND_X());\n break;\n case 0x71: // ADC (IND), Y\n this.ADC(this.IND_Y());\n break;\n case 0x6D: // ADC ABS\n this.ADC(this.ABS());\n break;\n case 0x7D: // ADC ABS, X\n this.ADC(this.ABS_X());\n break;\n case 0x79: // ADC ABS, Y\n this.ADC(this.ABS_Y());\n break;\n\n case 0xE9: // SBC IMM\n this.SBC(this.PC + 1);\n break;\n case 0xE5: // SBC ZP\n this.SBC(this.ZP());\n break;\n case 0xF5: // SBC ZP, X\n this.SBC(this.ZP_X());\n break;\n case 0xF2: // SBC (IND)\n this.SBC(this.IND());\n break;\n case 0xE1: // SBC (IND, X)\n this.SBC(this.IND_X());\n break;\n case 0xF1: // SBC (IND), Y\n this.SBC(this.IND_Y());\n break;\n case 0xED: // SBC ABS\n this.SBC(this.ABS());\n break;\n case 0xFD: // SBC ABS, X\n this.SBC(this.ABS_X());\n break;\n case 0xF9: // SBC ABS, Y\n this.SBC(this.ABS_Y());\n break;\n\n case 0x29: // AND IMM\n this.AND(this.PC + 1);\n break;\n case 0x25: // AND ZP\n this.AND(this.ZP());\n break;\n case 0x35: // AND ZP, X\n this.AND(this.ZP_X());\n break;\n case 0x32: // AND (IND)\n this.AND(this.IND());\n break;\n case 0x21: // AND (IND, X)\n this.AND(this.IND_X());\n break;\n case 0x31: // AND (IND), Y\n this.AND(this.IND_Y());\n break;\n case 0x2D: // AND ABS\n this.AND(this.ABS());\n break;\n case 0x3D: // AND ABS, X\n this.AND(this.ABS_X());\n break;\n case 0x39: // AND ABS, Y\n this.AND(this.ABS_Y());\n break;\n\n case 0x49: // EOR IMM\n this.EOR(this.PC + 1);\n break;\n case 0x45: // EOR ZP\n this.EOR(this.ZP());\n break;\n case 0x55: // EOR ZP, X\n this.EOR(this.ZP_X());\n break;\n case 0x52: // EOR (IND)\n this.EOR(this.IND());\n break;\n case 0x41: // EOR (IND, X)\n this.EOR(this.IND_X());\n break;\n case 0x51: // EOR (IND), Y\n this.EOR(this.IND_Y());\n break;\n case 0x4D: // EOR ABS\n this.EOR(this.ABS());\n break;\n case 0x5D: // EOR ABS, X\n this.EOR(this.ABS_X());\n break;\n case 0x59: // EOR ABS, Y\n this.EOR(this.ABS_Y());\n break;\n\n case 0x09: // ORA IMM\n this.ORA(this.PC + 1);\n break;\n case 0x05: // ORA ZP\n this.ORA(this.ZP());\n break;\n case 0x15: // ORA ZP, X\n this.ORA(this.ZP_X());\n break;\n case 0x12: // ORA (IND)\n this.ORA(this.IND());\n break;\n case 0x01: // ORA (IND, X)\n this.ORA(this.IND_X());\n break;\n case 0x11: // ORA (IND), Y\n this.ORA(this.IND_Y());\n break;\n case 0x0D: // ORA ABS\n this.ORA(this.ABS());\n break;\n case 0x1D: // ORA ABS, X\n this.ORA(this.ABS_X());\n break;\n case 0x19: // ORA ABS, Y\n this.ORA(this.ABS_Y());\n break;\n\n case 0x06: // ASL ZP\n address = this.ZP();\n this.Set(address, this.ASL(this.Get(address)));\n break;\n case 0x16: // ASL ZP, X\n address = this.ZP_X();\n this.Set(address, this.ASL(this.Get(address)));\n break;\n case 0x0E: // ASL ABS\n address = this.ABS();\n this.Set(address, this.ASL(this.Get(address)));\n break;\n case 0x1E: // ASL ABS, X\n address = this.ABS_X();\n this.Set(address, this.ASL(this.Get(address)));\n break;\n case 0x0A: // ASL A\n this.A = this.ASL(this.A);\n break;\n\n case 0x46: // LSR ZP\n address = this.ZP();\n this.Set(address, this.LSR(this.Get(address)));\n break;\n case 0x56: // LSR ZP, X\n address = this.ZP_X();\n this.Set(address, this.LSR(this.Get(address)));\n break;\n case 0x4E: // LSR ABS\n address = this.ABS();\n this.Set(address, this.LSR(this.Get(address)));\n break;\n case 0x5E: // LSR ABS, X\n address = this.ABS_X();\n this.Set(address, this.LSR(this.Get(address)));\n break;\n case 0x4A: // LSR A\n this.A = this.LSR(this.A);\n break;\n\n case 0x26: // ROL ZP\n address = this.ZP();\n this.Set(address, this.ROL(this.Get(address)));\n break;\n case 0x36: // ROL ZP, X\n address = this.ZP_X();\n this.Set(address, this.ROL(this.Get(address)));\n break;\n case 0x2E: // ROL ABS\n address = this.ABS();\n this.Set(address, this.ROL(this.Get(address)));\n break;\n case 0x3E: // ROL ABS, X\n address = this.ABS_X();\n this.Set(address, this.ROL(this.Get(address)));\n break;\n case 0x2A: // ROL A\n this.A = this.ROL(this.A);\n break;\n\n case 0x66: // ROR ZP\n address = this.ZP();\n this.Set(address, this.ROR(this.Get(address)));\n break;\n case 0x76: // ROR ZP, X\n address = this.ZP_X();\n this.Set(address, this.ROR(this.Get(address)));\n break;\n case 0x6E: // ROR ABS\n address = this.ABS();\n this.Set(address, this.ROR(this.Get(address)));\n break;\n case 0x7E: // ROR ABS, X\n address = this.ABS_X();\n this.Set(address, this.ROR(this.Get(address)));\n break;\n case 0x6A: // ROR A\n this.A = this.ROR(this.A);\n break;\n\n case 0x0F: // BBR0\n this.BBRi(0);\n break;\n case 0x1F: // BBR1\n this.BBRi(1);\n break;\n case 0x2F: // BBR2\n this.BBRi(2);\n break;\n case 0x3F: // BBR3\n this.BBRi(3);\n break;\n case 0x4F: // BBR4\n this.BBRi(4);\n break;\n case 0x5F: // BBR5\n this.BBRi(5);\n break;\n case 0x6F: // BBR6\n this.BBRi(6);\n break;\n case 0x7F: // BBR7\n this.BBRi(7);\n break;\n\n case 0x8F: // BBS0\n this.BBSi(0);\n break;\n case 0x9F: // BBS1\n this.BBSi(1);\n break;\n case 0xAF: // BBS2\n this.BBSi(2);\n break;\n case 0xBF: // BBS3\n this.BBSi(3);\n break;\n case 0xCF: // BBS4\n this.BBSi(4);\n break;\n case 0xDF: // BBS5\n this.BBSi(5);\n break;\n case 0xEF: // BBS6\n this.BBSi(6);\n break;\n case 0xFF: // BBS7\n this.BBSi(7);\n break;\n\n case 0x90: // BCC\n this.Branch((this.P & this.CFlag) == 0x00, 1);\n break;\n case 0xB0: // BCS\n this.Branch((this.P & this.CFlag) == this.CFlag, 1);\n break;\n case 0xD0: // BNE\n this.Branch((this.P & this.ZFlag) == 0x00, 1);\n break;\n case 0xF0: // BEQ\n this.Branch((this.P & this.ZFlag) == this.ZFlag, 1);\n break;\n case 0x10: // BPL\n this.Branch((this.P & this.NFlag) == 0x00, 1);\n break;\n case 0x30: // BMI\n this.Branch((this.P & this.NFlag) == this.NFlag, 1);\n break;\n case 0x50: // BVC\n this.Branch((this.P & this.VFlag) == 0x00, 1);\n break;\n case 0x70: // BVS\n this.Branch((this.P & this.VFlag) == this.VFlag, 1);\n break;\n case 0x80: // BRA\n this.Branch(true, 1);\n break;\n\n case 0x44: // BSR\n this.PC++;\n this.Push(this.PCH());\n this.Push(this.PCL());\n this.Branch(true, 0);\n break;\n case 0x20: // JSR ABS\n tmp = this.ABS();\n this.PC += 2;\n this.Push(this.PCH());\n this.Push(this.PCL());\n this.PC = tmp;\n this.ClearTFlag();\n break;\n\n case 0x40: // RTI\n this.P = this.Pull();\n this.toPCL(this.Pull());\n this.toPCH(this.Pull());\n break;\n case 0x60: // RTS\n this.ClearTFlag();\n this.toPCL(this.Pull());\n this.toPCH(this.Pull());\n this.PC++;\n break;\n\n case 0x4C: // JMP ABS\n this.PC = this.ABS();\n this.ClearTFlag();\n break;\n case 0x6C: // JMP (ABS)\n this.PC = this.ABS_IND();\n this.ClearTFlag();\n break;\n case 0x7C: // JMP (ABS, X)\n this.PC = this.ABS_X_IND();\n this.ClearTFlag();\n break;\n\n case 0x00: // BRK\n this.PC += 2;\n this.Push(this.PCH());\n this.Push(this.PCL());\n this.SetBFlag();\n this.Push(this.P);\n this.ClearDFlag();\n this.ClearTFlag();\n this.SetIFlag();\n this.PC = this.Get16(0xFFF6);\n break;\n\n case 0x62: // CLA\n this.A = 0x00;\n this.ClearTFlag();\n break;\n case 0x82: // CLX\n this.X = 0x00;\n this.ClearTFlag();\n break;\n case 0xC2: // CLY\n this.Y = 0x00;\n this.ClearTFlag();\n break;\n\n case 0x18: // CLC\n this.ClearCFlag();\n this.ClearTFlag();\n break;\n case 0xD8: // CLD\n this.ClearDFlag();\n this.ClearTFlag();\n break;\n case 0x58: // CLI\n this.ClearIFlag();\n this.ClearTFlag();\n break;\n case 0xB8: // CLV\n this.ClearVFlag();\n this.ClearTFlag();\n break;\n\n case 0x38: // SEC\n this.SetCFlag();\n this.ClearTFlag();\n break;\n case 0xF8: // SED\n this.SetDFlag();\n this.ClearTFlag();\n break;\n case 0x78: // SEI\n this.SetIFlag();\n this.ClearTFlag();\n break;\n case 0xF4: // SET\n this.SetTFlag();\n break;\n\n case 0xC9: // CMP IMM\n this.Compare(this.A, this.PC + 1);\n break;\n case 0xC5: // CMP ZP\n this.Compare(this.A, this.ZP());\n break;\n case 0xD5: // CMP ZP, X\n this.Compare(this.A, this.ZP_X());\n break;\n case 0xD2: // CMP (IND)\n this.Compare(this.A, this.IND());\n break;\n case 0xC1: // CMP (IND, X)\n this.Compare(this.A, this.IND_X());\n break;\n case 0xD1: // CMP (IND), Y\n this.Compare(this.A, this.IND_Y());\n break;\n case 0xCD: // CMP ABS\n this.Compare(this.A, this.ABS());\n break;\n case 0xDD: // CMP ABS, X\n this.Compare(this.A, this.ABS_X());\n break;\n case 0xD9: // CMP ABS, Y\n this.Compare(this.A, this.ABS_Y());\n break;\n case 0xE0: // CPX IMM\n this.Compare(this.X, this.PC + 1);\n break;\n case 0xE4: // CPX ZP\n this.Compare(this.X, this.ZP());\n break;\n case 0xEC: // CPX ABS\n this.Compare(this.X, this.ABS());\n break;\n case 0xC0: // CPY IMM\n this.Compare(this.Y, this.PC + 1);\n break;\n case 0xC4: // CPY ZP\n this.Compare(this.Y, this.ZP());\n break;\n case 0xCC: // CPY ABS\n this.Compare(this.Y, this.ABS());\n break;\n\n case 0xC6: // DEC ZP\n address = this.ZP();\n this.Set(address, this.Decrement(this.Get(address)));\n break;\n case 0xD6: // DEC ZP, X\n address = this.ZP_X();\n this.Set(address, this.Decrement(this.Get(address)));\n break;\n case 0xCE: // DEC ABS\n address = this.ABS();\n this.Set(address, this.Decrement(this.Get(address)));\n break;\n case 0xDE: // DEC ABS, X\n address = this.ABS_X();\n this.Set(address, this.Decrement(this.Get(address)));\n break;\n case 0x3A: // DEC A\n this.A = this.Decrement(this.A);\n break;\n case 0xCA: // DEX\n this.X = this.Decrement(this.X);\n break;\n case 0x88: // DEY\n this.Y = this.Decrement(this.Y);\n break;\n\n case 0xE6: // INC ZP\n address = this.ZP();\n this.Set(address, this.Increment(this.Get(address)));\n break;\n case 0xF6: // INC ZP, X\n address = this.ZP_X();\n this.Set(address, this.Increment(this.Get(address)));\n break;\n case 0xEE: // INC ABS\n address = this.ABS();\n this.Set(address, this.Increment(this.Get(address)));\n break;\n case 0xFE: // INC ABS, X\n address = this.ABS_X();\n this.Set(address, this.Increment(this.Get(address)));\n break;\n case 0x1A: // INC A\n this.A = this.Increment(this.A);\n break;\n case 0xE8: // INX\n this.X = this.Increment(this.X);\n break;\n case 0xC8: // INY\n this.Y = this.Increment(this.Y);\n break;\n\n case 0x48: // PHA\n this.Push(this.A);\n this.ClearTFlag();\n break;\n case 0x08: // PHP\n this.Push(this.P);\n this.ClearTFlag();\n break;\n case 0xDA: // PHX\n this.Push(this.X);\n this.ClearTFlag();\n break;\n case 0x5A: // PHY\n this.Push(this.Y);\n this.ClearTFlag();\n break;\n\n case 0x68: // PLA\n this.A = this.Pull();\n this.SetNZFlag(this.A);\n this.ClearTFlag();\n break;\n case 0x28: // PLP\n this.P = this.Pull();\n break;\n case 0xFA: // PLX\n this.X = this.Pull();\n this.SetNZFlag(this.X);\n this.ClearTFlag();\n break;\n case 0x7A: // PLY\n this.Y = this.Pull();\n this.SetNZFlag(this.Y);\n this.ClearTFlag();\n break;\n\n case 0x07: // RMB0\n this.RMBi(0);\n break;\n case 0x17: // RMB1\n this.RMBi(1);\n break;\n case 0x27: // RMB2\n this.RMBi(2);\n break;\n case 0x37: // RMB3\n this.RMBi(3);\n break;\n case 0x47: // RMB4\n this.RMBi(4);\n break;\n case 0x57: // RMB5\n this.RMBi(5);\n break;\n case 0x67: // RMB6\n this.RMBi(6);\n break;\n case 0x77: // RMB7\n this.RMBi(7);\n break;\n\n case 0x87: // SMB0\n this.SMBi(0);\n break;\n case 0x97: // SMB1\n this.SMBi(1);\n break;\n case 0xA7: // SMB2\n this.SMBi(2);\n break;\n case 0xB7: // SMB3\n this.SMBi(3);\n break;\n case 0xC7: // SMB4\n this.SMBi(4);\n break;\n case 0xD7: // SMB5\n this.SMBi(5);\n break;\n case 0xE7: // SMB6\n this.SMBi(6);\n break;\n case 0xF7: // SMB7\n this.SMBi(7);\n break;\n\n case 0x22: // SAX\n tmp = this.A;\n this.A = this.X;\n this.X = tmp;\n this.ClearTFlag();\n break;\n case 0x42: // SAY\n tmp = this.A;\n this.A = this.Y;\n this.Y = tmp;\n this.ClearTFlag();\n break;\n case 0x02: // SXY\n tmp = this.X;\n this.X = this.Y;\n this.Y = tmp;\n this.ClearTFlag();\n break;\n\n case 0xAA: // TAX\n this.X = this.A;\n this.SetNZFlag(this.X);\n this.ClearTFlag();\n break;\n case 0xA8: // TAY\n this.Y = this.A;\n this.SetNZFlag(this.Y);\n this.ClearTFlag();\n break;\n case 0xBA: // TSX\n this.X = this.S;\n this.SetNZFlag(this.X);\n this.ClearTFlag();\n break;\n case 0x8A: // TXA\n this.A = this.X;\n this.SetNZFlag(this.A);\n this.ClearTFlag();\n break;\n case 0x9A: // TXS\n this.S = this.X;\n this.ClearTFlag();\n break;\n case 0x98: // TYA\n this.A = this.Y;\n this.SetNZFlag(this.A);\n this.ClearTFlag();\n break;\n\n case 0x89: // BIT IMM\n this.BIT(this.PC + 1);\n break;\n case 0x24: // BIT ZP\n this.BIT(this.ZP());\n break;\n case 0x34: // BIT ZP, X\n this.BIT(this.ZP_X());\n break;\n case 0x2C: // BIT ABS\n this.BIT(this.ABS());\n break;\n case 0x3C: // BIT ABS, X\n this.BIT(this.ABS_X());\n break;\n\n case 0x83: // TST IMM ZP\n this.TST(this.PC + 1, 0x2000 | this.Get(this.PC + 2));\n break;\n case 0xA3: // TST IMM ZP, X\n this.TST(this.PC + 1, 0x2000 | ((this.Get(this.PC + 2) + this.X) & 0xFF));\n break;\n case 0x93: // TST IMM ABS\n this.TST(this.PC + 1, this.Get16(this.PC + 2));\n break;\n case 0xB3: // TST IMM ABS, X\n this.TST(this.PC + 1, (this.Get16(this.PC + 2) + this.X) & 0xFFFF);\n break;\n\n case 0x14: // TRB ZP\n this.TRB(this.ZP())\n break;\n case 0x1C: // TRB ABS\n this.TRB(this.ABS())\n break;\n\n case 0x04: // TSB ZP\n this.TSB(this.ZP())\n break;\n case 0x0C: // TSB ABS\n this.TSB(this.ABS())\n break;\n\n case 0xA9: // LDA IMM\n this.A = this.Load(this.PC + 1);\n break;\n case 0xA5: // LDA ZP\n this.A = this.Load(this.ZP());\n break;\n case 0xB5: // LDA ZP, X\n this.A = this.Load(this.ZP_X());\n break;\n case 0xB2: // LDA (IND)\n this.A = this.Load(this.IND());\n break;\n case 0xA1: // LDA (IND, X)\n this.A = this.Load(this.IND_X());\n break;\n case 0xB1: // LDA (IND), Y\n this.A = this.Load(this.IND_Y());\n break;\n case 0xAD: // LDA ABS\n this.A = this.Load(this.ABS());\n break;\n case 0xBD: // LDA ABS, X\n this.A = this.Load(this.ABS_X());\n break;\n case 0xB9: // LDA ABS, Y\n this.A = this.Load(this.ABS_Y());\n break;\n case 0xA2: // LDX IMM\n this.X = this.Load(this.PC + 1);\n break;\n case 0xA6: // LDX ZP\n this.X = this.Load(this.ZP());\n break;\n case 0xB6: // LDX ZP, Y\n this.X = this.Load(this.ZP_Y());\n break;\n case 0xAE: // LDX ABS\n this.X = this.Load(this.ABS());\n break;\n case 0xBE: // LDX ABS, Y\n this.X = this.Load(this.ABS_Y());\n break;\n case 0xA0: // LDY IMM\n this.Y = this.Load(this.PC + 1);\n break;\n case 0xA4: // LDY ZP\n this.Y = this.Load(this.ZP());\n break;\n case 0xB4: // LDY ZP, X\n this.Y = this.Load(this.ZP_X());\n break;\n case 0xAC: // LDY ABS\n this.Y = this.Load(this.ABS());\n break;\n case 0xBC: // LDY ABS, X\n this.Y = this.Load(this.ABS_X());\n break;\n\n case 0x85: // STA ZP\n this.Store(this.ZP(), this.A);\n break;\n case 0x95: // STA ZP, X\n this.Store(this.ZP_X(), this.A);\n break;\n case 0x92: // STA (IND)\n this.Store(this.IND(), this.A);\n break;\n case 0x81: // STA (IND, X)\n this.Store(this.IND_X(), this.A);\n break;\n case 0x91: // STA (IND), Y\n this.Store(this.IND_Y(), this.A);\n break;\n case 0x8D: // STA ABS\n this.Store(this.ABS(), this.A);\n break;\n case 0x9D: // STA ABS, X\n this.Store(this.ABS_X(), this.A);\n break;\n case 0x99: // STA ABS, Y\n this.Store(this.ABS_Y(), this.A);\n break;\n case 0x86: // STX ZP\n this.Store(this.ZP(), this.X);\n break;\n case 0x96: // STX ZP, Y\n this.Store(this.ZP_Y(), this.X);\n break;\n case 0x8E: // STX ABS\n this.Store(this.ABS(), this.X);\n break;\n case 0x84: // STY ZP\n this.Store(this.ZP(), this.Y);\n break;\n case 0x94: // STY ZP, X\n this.Store(this.ZP_X(), this.Y);\n break;\n case 0x8C: // STY ABS\n this.Store(this.ABS(), this.Y);\n break;\n case 0x64: // STZ ZP\n this.Store(this.ZP(), 0x00);\n break;\n case 0x74: // STZ ZP, X\n this.Store(this.ZP_X(), 0x00);\n break;\n case 0x9C: // STZ ABS\n this.Store(this.ABS(), 0x00);\n break;\n case 0x9E: // STZ ABS, X\n this.Store(this.ABS_X(), 0x00);\n break;\n\n case 0xEA: // NOP\n this.ClearTFlag();\n break;\n\n case 0x03: // ST0\n this.SetVDCRegister(this.Get(this.PC + 1), this.VDCSelect);\n this.ClearTFlag();\n break;\n case 0x13: // ST1\n this.SetVDCLow(this.Get(this.PC + 1), this.VDCSelect);\n this.ClearTFlag();\n break;\n case 0x23: // ST2\n this.SetVDCHigh(this.Get(this.PC + 1), this.VDCSelect);\n this.ClearTFlag();\n break;\n\n case 0x53: // TAMi\n data = this.Get(this.PC + 1);\n bit = 0x01;\n if (data == 0x00)\n data = this.MPRSelect;\n else\n this.MPRSelect = data;\n for (i = 0; i < 8; i++)\n if ((data & (bit << i)) != 0x00)\n this.MPR[i] = this.A << 13;\n break;\n case 0x43: // TMAi\n data = this.Get(this.PC + 1);\n bit = 0x01;\n if (data == 0x00)\n data = this.MPRSelect;\n else\n this.MPRSelect = data;\n for (i = 0; i < 8; i++)\n if ((data & (bit << i)) != 0x00)\n this.A = this.MPR[i] >>> 13;\n break;\n\n case 0xF3: // TAI\n if (this.TransferLen == 0) {\n this.TransferSrc = this.Get16(this.PC + 1);\n this.TransferDist = this.Get16(this.PC + 3);\n this.TransferLen = this.Get16(this.PC + 5);\n this.TransferAlt = 1;\n this.ProgressClock = 17;\n }\n\n this.Set(this.TransferDist, this.Get(this.TransferSrc));\n this.TransferSrc = (this.TransferSrc + this.TransferAlt) & 0xFFFF;\n this.TransferDist = (this.TransferDist + 1) & 0xFFFF;\n this.TransferLen = (this.TransferLen - 1) & 0xFFFF;\n this.TransferAlt = this.TransferAlt == 1 ? -1 : 1;\n this.ProgressClock += 6;\n\n if (this.TransferLen == 0) {\n this.ClearTFlag();\n this.PC += 7;\n }\n break;\n case 0xC3: // TDD\n if (this.TransferLen == 0) {\n this.TransferSrc = this.Get16(this.PC + 1);\n this.TransferDist = this.Get16(this.PC + 3);\n this.TransferLen = this.Get16(this.PC + 5);\n this.ProgressClock = 17;\n }\n\n this.Set(this.TransferDist, this.Get(this.TransferSrc));\n this.TransferSrc = (this.TransferSrc - 1) & 0xFFFF;\n this.TransferDist = (this.TransferDist - 1) & 0xFFFF;\n this.TransferLen = (this.TransferLen - 1) & 0xFFFF;\n this.ProgressClock += 6;\n\n if (this.TransferLen == 0) {\n this.ClearTFlag();\n this.PC += 7;\n }\n break;\n case 0xE3: // TIA\n if (this.TransferLen == 0) {\n this.TransferSrc = this.Get16(this.PC + 1);\n this.TransferDist = this.Get16(this.PC + 3);\n this.TransferLen = this.Get16(this.PC + 5);\n this.TransferAlt = 1;\n this.ProgressClock = 17;\n }\n\n this.Set(this.TransferDist, this.Get(this.TransferSrc));\n this.TransferSrc = (this.TransferSrc + 1) & 0xFFFF;\n this.TransferDist = (this.TransferDist + this.TransferAlt) & 0xFFFF;\n this.TransferLen = (this.TransferLen - 1) & 0xFFFF;\n this.TransferAlt = this.TransferAlt == 1 ? -1 : 1;\n this.ProgressClock += 6;\n\n if (this.TransferLen == 0) {\n this.ClearTFlag();\n this.PC += 7;\n }\n break;\n case 0x73: // TII\n if (this.TransferLen == 0) {\n this.TransferSrc = this.Get16(this.PC + 1);\n this.TransferDist = this.Get16(this.PC + 3);\n this.TransferLen = this.Get16(this.PC + 5);\n this.ProgressClock = 17;\n }\n\n this.Set(this.TransferDist, this.Get(this.TransferSrc));\n this.TransferSrc = (this.TransferSrc + 1) & 0xFFFF;\n this.TransferDist = (this.TransferDist + 1) & 0xFFFF;\n this.TransferLen = (this.TransferLen - 1) & 0xFFFF;\n this.ProgressClock += 6;\n\n if (this.TransferLen == 0) {\n this.ClearTFlag();\n this.PC += 7;\n }\n\n break;\n case 0xD3: // TIN\n if (this.TransferLen == 0) {\n this.TransferSrc = this.Get16(this.PC + 1);\n this.TransferDist = this.Get16(this.PC + 3);\n this.TransferLen = this.Get16(this.PC + 5);\n this.ProgressClock = 17;\n }\n\n this.Set(this.TransferDist, this.Get(this.TransferSrc));\n this.TransferSrc = (this.TransferSrc + 1) & 0xFFFF;\n this.TransferLen = (this.TransferLen - 1) & 0xFFFF;\n this.ProgressClock += 6;\n\n if (this.TransferLen == 0) {\n this.ClearTFlag();\n this.PC += 7;\n }\n break;\n\n case 0xD4: // CSH\n this.ClearTFlag();\n this.CPUBaseClock = this.BaseClock7;\n break;\n case 0x54: // CSL\n this.ClearTFlag();\n this.CPUBaseClock = this.BaseClock1;\n break;\n default:\n this.ClearTFlag();//NOP\n break;\n }\n this.PC += this.OpBytes[op];\n this.ProgressClock = (this.ProgressClock + this.OpCycles[op]) * this.CPUBaseClock;\n }\n\n Adder(address, neg) {\n let data0;\n let data1 = this.Get(address);\n\n if (!neg && (this.P & this.TFlag) == this.TFlag) {\n this.ProgressClock = 3;\n data0 = this.Get(0x2000 | this.X);\n } else\n data0 = this.A;\n\n if (neg)\n data1 = ~data1 & 0xFF;\n\n let carry = this.P & 0x01;\n let tmp = data0 + data1 + carry;\n\n if ((this.P & this.DFlag) == 0x00) {\n if ((((~data0 & ~data1 & tmp) | (data0 & data1 & ~tmp)) & 0x80) == 0x80)\n this.SetVFlag();\n else\n this.ClearVFlag();\n } else {\n this.ProgressClock += 1;\n if (neg) {\n if ((tmp & 0x0F) > 0x09)\n tmp -= 0x06;\n if ((tmp & 0xF0) > 0x90)\n tmp -= 0x60;\n } else {\n if (((data0 & 0x0F) + (data1 & 0x0F) + carry) > 0x09)\n tmp += 0x06;\n if ((tmp & 0x1F0) > 0x90)\n tmp += 0x60;\n }\n }\n\n if (tmp > 0xFF)\n this.SetCFlag();\n else\n this.ClearCFlag();\n\n tmp &= 0xFF;\n this.SetNZFlag(tmp);\n\n if (!neg && (this.P & this.TFlag) == this.TFlag)\n this.Set(0x2000 | this.X, tmp);\n else\n this.A = tmp;\n\n this.ClearTFlag();\n }\n\n\n ADC(address) {\n this.Adder(address, false);\n }\n\n\n SBC(address) {\n this.Adder(address, true);\n }\n\n\n AND(address) {\n let data0;\n let data1 = this.Get(address);\n\n if ((this.P & this.TFlag) == 0x00) {\n data0 = this.A;\n } else {\n this.ProgressClock = 3;\n data0 = this.Get(0x2000 | this.X);\n }\n\n let tmp = data0 & data1;\n this.SetNZFlag(tmp);\n\n if ((this.P & this.TFlag) == 0x00)\n this.A = tmp;\n else\n this.Set(0x2000 | this.X, tmp);\n\n this.ClearTFlag();\n }\n\n\n EOR(address) {\n let data0;\n let data1 = this.Get(address);\n\n if ((this.P & this.TFlag) == 0x00) {\n data0 = this.A;\n } else {\n this.ProgressClock = 3;\n data0 = this.Get(0x2000 | this.X);\n }\n\n let tmp = data0 ^ data1;\n this.SetNZFlag(tmp);\n\n if ((this.P & this.TFlag) == 0x00)\n this.A = tmp;\n else\n this.Set(0x2000 | this.X, tmp);\n\n this.ClearTFlag();\n }\n\n\n ORA(address) {\n let data0;\n let data1 = this.Get(address);\n\n if ((this.P & this.TFlag) == 0x00) {\n data0 = this.A;\n } else {\n this.ProgressClock = 3;\n data0 = this.Get(0x2000 | this.X);\n }\n\n let tmp = data0 | data1;\n this.SetNZFlag(tmp);\n\n if ((this.P & this.TFlag) == 0x00)\n this.A = tmp;\n else\n this.Set(0x2000 | this.X, tmp);\n\n this.ClearTFlag();\n }\n\n\n ASL(data) {\n data <<= 1;\n if (data > 0xFF)\n this.SetCFlag();\n else\n this.ClearCFlag();\n\n data &= 0xFF;\n this.SetNZFlag(data);\n this.ClearTFlag();\n return data;\n }\n\n\n LSR(data) {\n if ((data & 0x01) == 0x01)\n this.SetCFlag();\n else\n this.ClearCFlag();\n\n data >>= 1;\n this.SetNZFlag(data);\n this.ClearTFlag();\n return data;\n }\n\n\n ROL(data) {\n data = (data << 1) | (this.P & 0x01);\n if (data > 0xFF)\n this.SetCFlag();\n else\n this.ClearCFlag();\n\n data &= 0xFF;\n this.SetNZFlag(data);\n this.ClearTFlag();\n return data;\n }\n\n\n ROR(data) {\n let tmp = this.P & this.CFlag;\n if ((data & 0x01) == 0x01)\n this.SetCFlag();\n else\n this.ClearCFlag();\n\n data = (data >> 1) | (tmp << 7);\n this.SetNZFlag(data);\n this.ClearTFlag();\n return data;\n }\n\n\n BBRi(bit) {\n let tmp = this.Get(this.ZP());\n tmp = (tmp >> bit) & 0x01;\n this.Branch(tmp == 0, 2);\n }\n\n\n BBSi(bit) {\n let tmp = this.Get(this.ZP());\n tmp = (tmp >> bit) & 0x01;\n this.Branch(tmp == 1, 2);\n }\n\n\n Branch(status, adr) {\n this.ClearTFlag();\n if (status) {\n let tmp = this.Get(this.PC + adr);\n if (tmp >= 0x80)\n tmp |= 0xFF00;\n this.PC = (this.PC + adr + 1 + tmp) & 0xFFFF;\n this.ProgressClock = 2;\n } else\n this.PC += adr + 1;\n }\n\n\n Compare(data0, data1) {\n data0 -= this.Get(data1);\n if (data0 < 0)\n this.ClearCFlag();\n else\n this.SetCFlag();\n\n this.ClearTFlag();\n this.SetNZFlag(data0 & 0xFF);\n }\n\n\n Decrement(data) {\n data = (data - 1) & 0xFF;\n this.SetNZFlag(data);\n this.ClearTFlag();\n return data;\n }\n\n\n Increment(data) {\n data = (data + 1) & 0xFF;\n this.SetNZFlag(data);\n this.ClearTFlag();\n return data;\n }\n\n\n Push(data) {\n this.Set(0x2100 | this.S, data);\n this.S = (this.S - 1) & 0xFF;\n }\n\n\n Pull() {\n this.S = (this.S + 1) & 0xFF;\n return this.Get(0x2100 | this.S);\n }\n\n\n RMBi(bit) {\n let address = this.ZP();\n this.Set(address, this.Get(address) & ~(0x01 << bit));\n this.ClearTFlag();\n }\n\n\n SMBi(bit) {\n let address = this.ZP();\n this.Set(address, this.Get(address) | (0x01 << bit));\n this.ClearTFlag();\n }\n\n\n BIT(address) {\n let tmp = this.Get(address);\n this.SetNZFlag(this.A & tmp);\n this.P = (this.P & ~(this.NFlag | this.VFlag)) | (tmp & (this.NFlag | this.VFlag));\n this.ClearTFlag();\n }\n\n\n TST(address0, address1) {\n let tmp0 = this.Get(address0);\n let tmp1 = this.Get(address1);\n this.SetNZFlag(tmp0 & tmp1);\n this.P = (this.P & ~(this.NFlag | this.VFlag)) | (tmp1 & (this.NFlag | this.VFlag));\n this.ClearTFlag();\n }\n\n\n TRB(address) {\n let tmp = this.Get(address);\n let res = ~this.A & tmp;\n this.Set(address, res);\n this.SetNZFlag(res);\n this.P = (this.P & ~(this.NFlag | this.VFlag)) | (tmp & (this.NFlag | this.VFlag));\n this.ClearTFlag();\n }\n\n\n TSB(address) {\n let tmp = this.Get(address);\n let res = this.A | tmp;\n this.Set(address, res);\n this.SetNZFlag(res);\n this.P = (this.P & ~(this.NFlag | this.VFlag)) | (tmp & (this.NFlag | this.VFlag));\n this.ClearTFlag();\n }\n\n\n Load(address) {\n let data = this.Get(address);\n this.SetNZFlag(data);\n this.ClearTFlag();\n return data;\n }\n\n\n Store(address, data) {\n this.Set(address, data);\n this.ClearTFlag();\n }\n\n\n ZP() {\n return 0x2000 | this.Get(this.PC + 1);\n }\n\n\n ZP_X() {\n return 0x2000 | ((this.Get(this.PC + 1) + this.X) & 0xFF);\n }\n\n\n ZP_Y() {\n return 0x2000 | ((this.Get(this.PC + 1) + this.Y) & 0xFF);\n }\n\n\n IND() {\n return this.Get16(0x2000 | this.Get(this.PC + 1));\n }\n\n\n IND_X() {\n return this.Get16(0x2000 | ((this.Get(this.PC + 1) + this.X) & 0xFF));\n }\n\n\n IND_Y() {\n return (this.Get16(0x2000 | this.Get(this.PC + 1)) + this.Y) & 0xFFFF;\n }\n\n\n ABS() {\n return this.Get16(this.PC + 1);\n }\n\n\n ABS_X() {\n return (this.Get16(this.PC + 1) + this.X) & 0xFFFF;\n }\n\n\n ABS_Y() {\n return (this.Get16(this.PC + 1) + this.Y) & 0xFFFF;\n }\n\n\n ABS_IND() {\n return this.Get16(this.Get16(this.PC + 1));\n }\n\n\n ABS_X_IND() {\n return this.Get16((this.Get16(this.PC + 1) + this.X) & 0xFFFF);\n }\n\n\n SetNZFlag(data) { // Set N Z Flags\n this.P = (this.P & ~(this.NFlag | this.ZFlag)) | this.NZCacheTable[data];\n }\n\n\n SetVFlag() { // Set V Flag\n this.P |= this.VFlag;\n }\n\n\n ClearVFlag() { // Clear V Flag\n this.P &= ~this.VFlag;\n }\n\n\n SetTFlag() { // Set T Flag\n this.P |= this.TFlag;\n }\n\n\n ClearTFlag() { // Clear T Flag\n this.P &= ~this.TFlag;\n }\n\n\n SetBFlag() { // Set B Flag\n this.P |= this.BFlag;\n }\n\n\n ClearBFlag() { // Clear B Flag\n this.P &= ~this.BFlag;\n }\n\n\n SetDFlag() { // Set D Flag\n this.P |= this.DFlag;\n }\n\n\n ClearDFlag() { // Clear D Flag\n this.P &= ~this.DFlag;\n }\n\n\n SetIFlag() { // Set I Flag\n this.P |= this.IFlag;\n }\n\n\n ClearIFlag() { // Clear I Flag\n this.P &= ~this.IFlag;\n }\n\n\n SetCFlag() { // Set C Flag\n this.P |= this.CFlag;\n }\n\n\n ClearCFlag() { // Clear C Flag\n this.P &= ~this.CFlag;\n }\n\n\n PCH() {\n return this.PC >> 8;\n }\n\n\n PCL() {\n return this.PC & 0x00FF;\n }\n\n\n toPCH(data) {\n this.PC = (this.PC & 0x00FF) | (data << 8);\n }\n\n\n toPCL(data) {\n this.PC = (this.PC & 0xFF00) | data;\n }\n\n\n /* ***************** */\n /* **** Storage **** */\n /* ***************** */\n StorageConstruct() {\n this.MPR = new Array(8);\n this.MPRSelect = 0;\n this.RAM = new Uint8Array(0x8000);\n this.RAMMask = 0x1FFF;\n this.BRAM = new Uint8Array(0x2000).fill(0x00);\n this.BRAMUse = false;\n\n this.INTIRQ2 = 0x00;\n this.IntDisableRegister = 0;\n\n this.Mapper = null;\n\n this.Mapper0 = class extends this.MapperBase {\n Address: number;\n constructor(rom, core) {\n super(rom, core);\n\n let tmp = this.ROM.length - 1;\n this.Address = 0x80000;\n while (this.Address > 0x0000) {\n if ((this.Address & tmp) != 0x0000)\n break;\n this.Address >>>= 1;\n }\n }\n\n Read(address) {\n if (address >= this.ROM.length)\n return this.ROM[(address & (this.Address - 1)) | this.Address];\n else\n return this.ROM[address];\n }\n };\n\n this.Mapper1 = class extends this.MapperBase {\n ROM: any;\n Address: number;\n constructor(rom, core) {\n super(rom, core);\n this.Address = 0;\n }\n\n Init() {\n this.Address = 0;\n }\n\n Read(address) {\n if (address < 0x80000)\n return this.ROM[address];\n else\n return this.ROM[this.Address | (address & 0x7FFFF)];\n }\n\n Write(address, data) {\n this.Address = ((address & 0x000F) + 1) << 19;\n }\n };\n\n this.Mapper2 = class extends this.MapperBase {\n ROM: any;\n constructor(rom, core) {\n super(rom, core);\n this.ROM = rom;\n }\n\n Read(address) {\n return this.ROM[address] || 0;\n }\n\n Write(address, data) {\n if (address >= 0x80000)\n this.ROM[address] = data;\n }\n };\n }\n\n\n GetIntStatus() {\n return ~this.IntDisableRegister & this.GetIntReqest();\n }\n\n\n GetIntDisable() {\n return this.IntDisableRegister;\n }\n\n\n SetIntDisable(data) {\n this.IntDisableRegister = data;\n this.TimerAcknowledge();\n }\n\n\n GetIntReqest() {\n return (((this.VDC[0].VDCStatus | this.VDC[1].VDCStatus) & 0x3F) != 0x00 ? this.IRQ1Flag : 0x00) | this.INTIRQ2 | this.INTTIQ;\n }\n\n\n SetIntReqest(data) {\n this.TimerAcknowledge();\n }\n\n\n SetROM(rom) {\n this.Init();\n let tmp = rom.slice(rom.length % 8192);\n //if(tmp[0x001FFF] < 0xE0)\n //\ttmp = tmp.map((d) => {return this.ReverseBit[d];});\n this.Mapper = new this.Mapper0(tmp, this);\n this.CPUReset();\n }\n\n\n StorageInit() {\n this.RAM.fill(0x00);\n this.RAMMask = this.SuperGrafx ? 0x7FFF : 0x1FFF;\n this.StorageReset();\n }\n\n\n StorageReset() {\n this.IntDisableRegister = 0x00;//IntInit\n\n for (let i = 0; i < 7; i++)\n this.MPR[i] = 0xFF << 13;\n this.MPR[7] = 0x00;\n\n this.MPRSelect = 0x01;\n }\n\n\n Get16(address) {\n return (this.Get(address + 1) << 8) | this.Get(address);\n }\n\n\n Get(address) {\n address = this.MPR[address >> 13] | (address & 0x1FFF);\n\n if (address < 0x100000)// ROM\n return this.Mapper.Read(address);\n\n if (address < 0x1EE000)// NOT USE\n return 0xFF;\n\n if (address < 0x1F0000) {// BRAM\n if (this.BRAMUse)\n return this.BRAM[address & 0x1FFF];\n else\n return 0xFF;\n }\n\n if (address < 0x1F8000)// RAM\n return this.RAM[address & this.RAMMask];\n\n if (address < 0x1FE000)// NOT USE\n return 0xFF;\n\n if (address < 0x1FE400) {// VDC\n if (this.SuperGrafx) {\n let tmp = address & 0x00001F;\n if (tmp < 0x00008) {\n switch (address & 0x000003) {// VDC#1\n case 0x00:\n return this.GetVDCStatus(0);\n case 0x01:\n return 0x00;\n case 0x02:\n return this.GetVDCLow(0);\n case 0x03:\n return this.GetVDCHigh(0);\n }\n } else if (tmp < 0x00010) {// VPC\n return this.GetVPC(tmp & 0x000007);\n } else if (tmp < 0x00018) {// VDC#2\n switch (address & 0x000003) {\n case 0x00:\n return this.GetVDCStatus(1);\n case 0x01:\n return 0x00;\n case 0x02:\n return this.GetVDCLow(1);\n case 0x03:\n return this.GetVDCHigh(1);\n }\n } else {\n return 0xFF;\n }\n } else {\n switch (address & 0x000003) {// VDC#1\n case 0x00:\n return this.GetVDCStatus(0);\n case 0x01:\n return 0x00;\n case 0x02:\n return this.GetVDCLow(0);\n case 0x03:\n return this.GetVDCHigh(0);\n }\n }\n }\n\n if (address < 0x1FE800) {// VCE\n switch (address & 0x000007) {\n case 0x04:\n return this.GetVCEDataLow();\n case 0x05:\n return this.GetVCEDataHigh();\n default:\n return 0x00;\n\n }\n }\n\n if (address < 0x1FEC00)// PSG\n return this.GetPSG(address & 0x00000F);\n\n if (address < 0x1FF000)// TIMER\n return this.ReadTimerCounter();\n\n if (address < 0x1FF400)// IO\n return this.GetJoystick();\n\n if (address < 0x1FF800) {// INT Register\n switch (address & 0x000003) {\n case 0x02:\n return this.GetIntDisable();\n case 0x03:\n return this.GetIntReqest();\n default:\n return 0x00;\n }\n }\n\n return 0xFF;//EXT\n }\n\n\n Set(address, data) {\n address = this.MPR[address >> 13] | (address & 0x1FFF);\n\n if (address < 0x100000) {// ROM\n this.Mapper.Write(address, data);\n return;\n }\n\n if (address < 0x1EE000)// NOT USE\n return;\n\n if (address < 0x1F0000) {// BRAM\n if (this.BRAMUse)\n this.BRAM[address & 0x1FFF] = data;\n return;\n }\n\n if (address < 0x1F8000) {// RAM\n this.RAM[address & this.RAMMask] = data;\n return;\n }\n\n if (address < 0x1FE000)// NOT USE\n return;\n\n if (address < 0x1FE400) {// VDC\n if (this.SuperGrafx) {\n let tmp = address & 0x00001F;\n if (tmp < 0x00008) {\n switch (address & 0x000003) {// VDC#1\n case 0x00:\n this.SetVDCRegister(data, 0);\n break;\n case 0x02:\n this.SetVDCLow(data, 0);\n break;\n case 0x03:\n this.SetVDCHigh(data, 0);\n break;\n }\n } else if (tmp < 0x00010) {// VPC\n this.SetVPC(tmp & 0x000007, data);\n } else if (tmp < 0x00018) {// VDC#2\n switch (address & 0x000003) {\n case 0x00:\n this.SetVDCRegister(data, 1);\n break;\n case 0x02:\n this.SetVDCLow(data, 1);\n break;\n case 0x03:\n this.SetVDCHigh(data, 1);\n break;\n }\n }\n } else {\n switch (address & 0x000003) {// VDC#1\n case 0x00:\n this.SetVDCRegister(data, 0);\n break;\n case 0x01:\n break;\n case 0x02:\n this.SetVDCLow(data, 0);\n break;\n case 0x03:\n this.SetVDCHigh(data, 0);\n break;\n }\n }\n return;\n }\n\n if (address < 0x1FE800) {// VCE\n switch (address & 0x000007) {\n case 0x00:\n this.SetVCEControl(data);\n break;\n case 0x02:\n this.SetVCEAddressLow(data);\n break;\n case 0x03:\n this.SetVCEAddressHigh(data);\n break;\n case 0x04:\n this.SetVCEDataLow(data);\n break;\n case 0x05:\n this.SetVCEDataHigh(data);\n break;\n }\n return;\n }\n\n if (address < 0x1FEC00) {// PSG\n this.SetPSG(address & 0x00000F, data);\n return;\n }\n\n if (address < 0x1FF000) {// TIMER\n switch (address & 0x000001) {\n case 0x00:\n this.WirteTimerReload(data);\n break;\n case 0x01:\n this.WirteTimerControl(data);\n break;\n }\n return;\n }\n\n if (address < 0x1FF400) {// IO\n this.SetJoystick(data);\n return;\n }\n\n if (address < 0x1FF800) {// INT Register\n switch (address & 0x000003) {\n case 0x02:\n this.SetIntDisable(data);\n break;\n case 0x03:\n this.SetIntReqest(data);\n break;\n }\n return;\n }\n }\n\n\n /* ************* */\n /* **** VCE **** */\n /* ************* */\n VCEConstruct() {\n this.Palette = new Array(512);\n this.PaletteData = new Array(512);\n this.MonoPaletteData = new Array(512);\n\n this.VCEBaseClock = 0;\n this.VCEControl = 0;\n this.VCEAddress = 0;\n this.VCEData = 0;\n }\n\n\n VCEInit() {\n this.Palette.fill(0x0000);\n for (let i = 0; i < 512; i++) {\n this.PaletteData[i] = { r: 0, g: 0, b: 0 };\n this.MonoPaletteData[i] = { r: 0, g: 0, b: 0 };\n }\n\n this.VCEBaseClock = this.BaseClock5;\n this.VCEControl = 0x00;\n this.VCEAddress = 0x00;\n this.VCEData = 0x00;\n }\n\n\n SetVCEControl(data) {\n this.VCEControl = data;\n\n switch (data & 0x03) {\n case 0x00:\n this.VCEBaseClock = this.BaseClock5;\n break;\n case 0x01:\n this.VCEBaseClock = this.BaseClock7;\n break;\n case 0x02:\n case 0x03:\n this.VCEBaseClock = this.BaseClock10;\n break;\n }\n }\n\n\n SetVCEAddressLow(data) {\n this.VCEAddress = (this.VCEAddress & 0xFF00) | data;\n }\n\n\n SetVCEAddressHigh(data) {\n this.VCEAddress = ((this.VCEAddress & 0x00FF) | (data << 8)) & 0x01FF;\n }\n\n\n GetVCEDataLow() {\n return this.Palette[this.VCEAddress] & 0x00FF;\n }\n\n\n GetVCEDataHigh() {\n let tmp = (this.Palette[this.VCEAddress] & 0xFF00) >> 8;\n this.VCEAddress = (this.VCEAddress + 1) & 0x01FF;\n return tmp;\n }\n\n\n SetVCEDataLow(data) {\n this.Palette[this.VCEAddress] = (this.Palette[this.VCEAddress] & 0xFF00) | data;\n this.ToPalettes();\n }\n\n\n SetVCEDataHigh(data) {\n this.Palette[this.VCEAddress] = (this.Palette[this.VCEAddress] & 0x00FF) | (data << 8);\n this.ToPalettes();\n this.VCEAddress = (this.VCEAddress + 1) & 0x01FF;\n }\n\n\n ToPalettes() {\n let color = this.Palette[this.VCEAddress];\n let tmp = this.PaletteData[this.VCEAddress];\n tmp.r = ((color >> 3) & 0x07) * 36;\n tmp.g = ((color >> 6) & 0x07) * 36;\n tmp.b = (color & 0x07) * 36;\n\n let mono = tmp.r * 0.299 + tmp.g * 0.587 + tmp.b * 0.114;\n this.MonoPaletteData[this.VCEAddress].r = mono;\n this.MonoPaletteData[this.VCEAddress].g = mono;\n this.MonoPaletteData[this.VCEAddress].b = mono;\n }\n\n\n /* ************* */\n /* **** VPC **** */\n /* ************* */\n VPCConstruct() {\n this.VPCRegister = new Uint8Array(8);\n this.VDCSelect = 0;\n this.VPCWindow1 = 0;\n this.VPCWindow2 = 0;\n this.VPCPriority = new Uint8Array(4);\n }\n\n\n VPCInit() {\n this.VPCRegister.fill(0x00);\n this.VPCRegister[0] = 0x11;\n this.VPCRegister[1] = 0x11;\n this.VPCRegister[7] = 0xFF;\n\n this.VDCSelect = 0;\n this.VPCWindow1 = 0;\n this.VPCWindow2 = 0;\n this.VPCPriority.fill(0x01);\n }\n\n\n SetVPC(no, data) {\n if (no == 0x07)\n return;\n\n this.VPCRegister[no] = data;\n if (no == 0x06)\n this.VDCSelect = data & 0x01;\n\n if (no == 0x02 || no == 0x03) {\n this.VPCWindow1 = (this.VPCRegister[0x02] | ((this.VPCRegister[0x03] & 0x03) << 8)) - 64;\n if (this.VPCWindow1 < 0)\n this.VPCWindow1 = 1024;\n }\n\n if (no == 0x04 || no == 0x05) {\n this.VPCWindow2 = (this.VPCRegister[0x04] | ((this.VPCRegister[0x05] & 0x03) << 8)) - 64;\n if (this.VPCWindow2 < 0)\n this.VPCWindow2 = -1;\n }\n\n if (no == 0x00) {\n this.VPCPriority[2] = this.VPCRegister[0x00] >> 4;\n this.VPCPriority[3] = this.VPCRegister[0x00] & 0x0F;\n }\n\n if (no == 0x01) {\n this.VPCPriority[0] = this.VPCRegister[0x01] >> 4;\n this.VPCPriority[1] = this.VPCRegister[0x01] & 0x0F;\n }\n }\n\n\n GetVPC(no) {\n return this.VPCRegister[no];\n }\n\n\n /* ************* */\n /* **** VDC **** */\n /* ************* */\n VDCConstruct() {\n this.DrawFlag = false;\n this.VDCPutLineProgressClock = 0;\n this.VDCPutLine = 0;\n this.VDC = new Array(2);\n\n this.VDCLineClock = 1368;\n\n this.ScreenSize = [];\n this.ScreenSize[this.BaseClock5] = 342;\n this.ScreenSize[this.BaseClock7] = 456;\n this.ScreenSize[this.BaseClock10] = 684;\n\n this.PutScreenSize = [];\n this.PutScreenSize[this.BaseClock5] = 320;\n this.PutScreenSize[this.BaseClock7] = 428;\n this.PutScreenSize[this.BaseClock10] = 640;\n\n this.ScreenHeightMAX = 262;\n this.ScreenWidthMAX = 684;\n\n this.VScreenWidthArray = [];\n this.VScreenWidthArray[0x00] = 32;\n this.VScreenWidthArray[0x10] = 64;\n this.VScreenWidthArray[0x20] = 128;\n this.VScreenWidthArray[0x30] = 128;\n\n this.ReverseBit = new Uint8Array(0x100);\n this.ReverseBit = this.ReverseBit.map((d, i) => {\n return ((i & 0x80) >> 7) | ((i & 0x40) >> 5) |\n ((i & 0x20) >> 3) | ((i & 0x10) >> 1) |\n ((i & 0x08) << 1) | ((i & 0x04) << 3) |\n ((i & 0x02) << 5) | ((i & 0x01) << 7);\n });\n\n this.ReverseBit16 = new Uint16Array(0x10000).fill(0x00);\n this.ReverseBit16 = this.ReverseBit16.map((d, i) => { return (this.ReverseBit[i & 0x00FF] << 8) | this.ReverseBit[(i & 0xFF00) >> 8]; });\n\n this.ReverseBit256 = new Uint32Array(0x100).fill(0x00);\n this.ReverseBit256 = this.ReverseBit256.map((d, i) => {\n let b = this.ReverseBit[i];\n return ((b & 0x80) << (28 - 7)) |\n ((b & 0x40) << (24 - 6)) |\n ((b & 0x20) << (20 - 5)) |\n ((b & 0x10) << (16 - 4)) |\n ((b & 0x08) << (12 - 3)) |\n ((b & 0x04) << (8 - 2)) |\n ((b & 0x02) << (4 - 1)) |\n ((b & 0x01) << (0 - 0));\n });\n\n this.SPAddressMask = [];\n this.SPAddressMask[16] = [];\n this.SPAddressMask[32] = [];\n this.SPAddressMask[16][16] = 0x07FE;\n this.SPAddressMask[16][32] = 0x07FE & 0x07FA;\n this.SPAddressMask[16][64] = 0x07FE & 0x07F2;\n this.SPAddressMask[32][16] = 0x07FC;\n this.SPAddressMask[32][32] = 0x07FC & 0x07FA;\n this.SPAddressMask[32][64] = 0x07FC & 0x07F2;\n }\n\n\n MakeSpriteLine(vdcno) {\n let vdcc = this.VDC[vdcno];\n\n let sp = vdcc.SPLine;\n for (let i = 0; i < vdcc.ScreenWidth; i++) {\n let spi = sp[i];\n spi.data = 0x00;\n spi.palette = 0x000;\n spi.no = 255;\n spi.priority = 0x00;\n }\n\n if ((vdcc.VDCRegister[0x05] & 0x0040) == 0x0000)\n return;\n\n let dotcount = 0;\n let line = vdcc.DrawBGYLine - (vdcc.VDS + vdcc.VSW) + 64;\n\n let vram = vdcc.VRAM;\n let satb = vdcc.SATB;\n let revbit16 = this.ReverseBit16;\n for (let i = 0, s = 0; i < 64; i++, s += 4) {\n let y = satb[s] & 0x3FF;\n let attribute = satb[s + 3];\n\n let height = ((attribute & 0x3000) >> 8) + 16;\n height = height > 32 ? 64 : height;\n\n if (line < y || line > (y + height - 1))\n continue;\n\n let x = (satb[s + 1] & 0x3FF) - 32;\n let width = ((attribute & 0x0100) >> 4) + 16;\n if ((x + width) <= 0)\n continue;\n\n let spy = line - y;\n if ((attribute & 0x8000) == 0x8000)\n spy = (height - 1) - spy;\n\n let index = ((satb[s + 2] & this.SPAddressMask[width][height]) << 5) | (((spy & 0x30) << 3) | (spy & 0x0F));\n\n let data0;\n let data1;\n let data2;\n let data3;\n if ((attribute & 0x0800) == 0x0000) {\n data0 = revbit16[vram[index]];\n data1 = revbit16[vram[index + 16]];\n data2 = revbit16[vram[index + 32]];\n data3 = revbit16[vram[index + 48]];\n if (width == 32) {\n data0 |= revbit16[vram[(index | 0x0040)]] << 16;\n data1 |= revbit16[vram[(index | 0x0040) + 16]] << 16;\n data2 |= revbit16[vram[(index | 0x0040) + 32]] << 16;\n data3 |= revbit16[vram[(index | 0x0040) + 48]] << 16;\n }\n } else {\n data0 = vram[index];\n data1 = vram[index + 16];\n data2 = vram[index + 32];\n data3 = vram[index + 48];\n if (width == 32) {\n data0 = (data0 << 16) | vram[(index | 0x0040)];\n data1 = (data1 << 16) | vram[(index | 0x0040) + 16];\n data2 = (data2 << 16) | vram[(index | 0x0040) + 32];\n data3 = (data3 << 16) | vram[(index | 0x0040) + 48];\n }\n }\n\n let palette = ((attribute & 0x000F) << 4) | 0x0100;\n let priority = attribute & 0x0080;\n\n let j = 0;\n if (x < 0) {\n j -= x;\n x = 0;\n }\n\n for (; j < width && x < vdcc.ScreenWidth; j++, x++) {\n let spx = sp[x];\n if (spx.data == 0x00) {\n let dot = ((data0 >>> j) & 0x0001)\n | (((data1 >>> j) << 1) & 0x0002)\n | (((data2 >>> j) << 2) & 0x0004)\n | (((data3 >>> j) << 3) & 0x0008);\n if (dot != 0x00) {\n spx.data = dot;\n spx.palette = palette;\n spx.priority = priority;\n }\n }\n\n if (spx.no == 255)\n spx.no = i;\n\n if (i != 0 && spx.no == 0)\n vdcc.VDCStatus |= vdcc.VDCRegister[0x05] & 0x0001;//SetSpriteCollisionINT\n\n if (++dotcount == 256) {\n vdcc.VDCStatus |= vdcc.VDCRegister[0x05] & 0x0002;//SetSpriteOverINT\n if (vdcc.SpriteLimit)\n return;\n }\n }\n }\n }\n\n\n MakeBGLine(vdcno) {\n let vdcc = this.VDC[vdcno];\n\n let sp = vdcc.SPLine;\n let bg = vdcc.BGLine;\n let sw = vdcc.ScreenWidth;\n let leftblank = ((vdcc.HDS + vdcc.HSW) << 3) + vdcc.DrawBGIndex;\n\n if ((vdcc.VDCRegister[0x05] & 0x0080) == 0x0080) {\n let WidthMask = vdcc.VScreenWidth - 1;\n\n let x = vdcc.VDCRegister[0x07];\n let index_x = (x >> 3) & WidthMask;\n x = (x & 0x07) << 2;\n\n let y = vdcc.DrawBGLine;\n let index_y = ((y >> 3) & (vdcc.VScreenHeight - 1)) * vdcc.VScreenWidth;\n y = y & 0x07;\n\n let vram = vdcc.VRAM;\n let bgx = 0;\n let revbit = this.ReverseBit256;\n\n while (bgx < sw) {\n let tmp = vram[index_x + index_y];\n let address = ((tmp & 0x0FFF) << 4) + y;\n let palette = (tmp & 0xF000) >> 8;\n\n let data0 = vram[address];\n let data1 = vram[address + 8];\n let data = (revbit[data0 & 0x00FF]) |\n (revbit[(data0 & 0xFF00) >> 8] << 1) |\n (revbit[data1 & 0x00FF] << 2) |\n (revbit[(data1 & 0xFF00) >> 8] << 3);\n\n for (; x < 32 && bgx < sw; x += 4, bgx++) {\n let dot = (data >>> x) & 0x0F;\n let spbgx = sp[bgx];\n bg[bgx + leftblank] = spbgx.data != 0x00 && (dot == 0x00 || spbgx.priority == 0x0080) ?\n spbgx.data | spbgx.palette : dot | (dot == 0x00 ? 0x00 : palette);\n }\n\n x = 0;\n index_x = (index_x + 1) & WidthMask;\n }\n } else {\n for (let i = 0; i < sw; i++)\n bg[i + leftblank] = sp[i].data | sp[i].palette;\n }\n }\n\n\n MakeBGColorLineVDC(vdcno) {\n this.VDC[vdcno].BGLine.fill(0x100);\n }\n\n\n VDCProcessDMA(vdcno) {\n let vdcc = this.VDC[vdcno];\n\n if (vdcc.VRAMtoSATBCount > 0) {//VRAMtoSATB\n vdcc.VRAMtoSATBCount -= this.ProgressClock;\n if (vdcc.VRAMtoSATBCount <= 0)\n vdcc.VDCStatus = (vdcc.VDCStatus & 0xBF) | ((vdcc.VDCRegister[0x0F] & 0x0001) << 3);//VRAMtoSATB INT\n }\n\n if (vdcc.VRAMtoVRAMCount > 0) {//VRAMtoVRAM\n vdcc.VRAMtoVRAMCount -= this.ProgressClock;\n if (vdcc.VRAMtoVRAMCount <= 0)\n vdcc.VDCStatus = (vdcc.VDCStatus & 0xBF) | ((vdcc.VDCRegister[0x0F] & 0x0002) << 3);//VRAMtoVRAM INT\n }\n }\n\n\n VDCProcess(vdcno) {\n let vdcc = this.VDC[vdcno];\n\n vdcc.VDCProgressClock -= this.VDCLineClock;\n\n vdcc.DrawBGIndex = 0;\n vdcc.BGLine.fill(0x100);\n\n for (let i = 0; i < vdcc.ScreenSize; i += vdcc.DrawLineWidth) {\n vdcc.DrawBGYLine++;\n\n if (vdcc.DrawBGYLine == this.ScreenHeightMAX)\n vdcc.DrawBGYLine = 0;\n\n if (vdcc.DrawBGYLine < (vdcc.VDS + vdcc.VSW)) {//OVER SCAN\n this.MakeBGColorLineVDC(vdcno);\n } else if (vdcc.DrawBGYLine <= (vdcc.VDS + vdcc.VSW + vdcc.VDW)) {//ACTIVE DISPLAY\n vdcc.DrawBGLine = (vdcc.DrawBGYLine == (vdcc.VDS + vdcc.VSW) ? vdcc.VDCRegister[0x08] : (vdcc.DrawBGLine + 1)) & vdcc.VScreenHeightMask;\n if (!vdcc.VDCBurst) {\n this.MakeSpriteLine(vdcno);\n this.MakeBGLine(vdcno);\n } else\n this.MakeBGColorLineVDC(vdcno);\n } else {//OVER SCAN\n this.MakeBGColorLineVDC(vdcno);\n }\n\n let vline = vdcc.VDS + vdcc.VSW + vdcc.VDW + 1;\n if (vline > 261)\n vline -= 261;\n if (vdcc.DrawBGYLine == vline) {\n vdcc.VDCStatus |= (vdcc.VDCRegister[0x05] & 0x0008) << 2;//SetVSync INT\n if (vdcc.VRAMtoSATBStartFlag) {//VRAMtoSATB\n for (let i = 0, addr = vdcc.VDCRegister[0x13]; i < 256; i++, addr++)\n vdcc.SATB[i] = vdcc.VRAM[addr];\n vdcc.VRAMtoSATBCount = 256 * this.VCEBaseClock;\n vdcc.VDCStatus |= 0x40;\n vdcc.VRAMtoSATBStartFlag = (vdcc.VDCRegister[0x0F] & 0x0010) == 0x0010;\n }\n }\n\n vdcc.RasterCount++;\n if (vdcc.DrawBGYLine == (vdcc.VDS + vdcc.VSW - 1))\n vdcc.RasterCount = 64;\n\n if (vdcc.RasterCount == vdcc.VDCRegister[0x06] && (vdcc.VDCStatus & 0x20) == 0x00)\n vdcc.VDCStatus |= vdcc.VDCRegister[0x05] & 0x0004;//SetRaster INT\n\n vdcc.DrawBGIndex += vdcc.DrawLineWidth;\n }\n }\n\n\n VDCRun() {\n this.VDCProcessDMA(0);\n this.VDC[0].VDCProgressClock += this.ProgressClock;\n\n if (this.SuperGrafx) {\n this.VDCProcessDMA(1);\n this.VDC[1].VDCProgressClock += this.ProgressClock;\n }\n\n while (this.VDC[0].VDCProgressClock >= this.VDCLineClock) {\n this.VDCProcess(0);\n if (this.SuperGrafx)\n this.VDCProcess(1);\n }\n\n this.VDCPutLineProgressClock += this.ProgressClock;\n if (this.VDCPutLineProgressClock >= this.VDCLineClock) {\n this.VDCPutLineProgressClock -= this.VDCLineClock;\n this.VDCPutLine++;\n\n if (this.VDCPutLine == this.ScreenHeightMAX) {\n this.VDCPutLine = 0;\n this.GetScreenSize(0);\n this.VDC[0].DrawBGYLine = 0;\n if (this.SuperGrafx) {\n this.GetScreenSize(1);\n this.VDC[1].DrawBGYLine = 0;\n }\n this.DrawFlag = true;\n this.Ctx.putImageData(this.ImageData, 0, 0);\n }\n\n let palettes = (this.VCEControl & 0x80) == 0x00 ? this.PaletteData : this.MonoPaletteData;\n\n let data = this.ImageData.data;\n let imageIndex = this.VDCPutLine * this.ScreenWidthMAX * 4;\n let black = palettes[0x100];\n\n let sw = this.ScreenSize[this.VCEBaseClock];\n let bgl0 = this.VDC[0].BGLine;\n\n if (this.SuperGrafx) {//VPC\n let window1 = this.VPCWindow1;\n let window2 = this.VPCWindow2;\n let priority = this.VPCPriority;\n\n let bgl1 = this.VDC[1].BGLine;\n for (let bgx = 0; bgx < sw; bgx++, imageIndex += 4) {\n let wflag = 0x00;\n if (bgx >= window1)\n wflag |= 0x01;\n if (bgx <= window2)\n wflag |= 0x02;\n\n let bg0 = bgl0[bgx];\n let bg1 = bgl1[bgx];\n\n let color;\n switch (priority[wflag]) {\n case 0x04 | 0x03:\n if (bg0 > 0x100 || bg1 > 0x100)\n color = palettes[bg0 > 0x100 ? bg0 : bg1];\n else\n color = palettes[(bg0 & 0x0FF) != 0x000 ? bg0 : bg1];\n\n break;\n case 0x08 | 0x03:\n if (bg0 < 0x100 && bg0 != 0x000)\n color = palettes[bg0];\n else\n color = palettes[(bg1 & 0x0FF) != 0x000 ? bg1 : bg0];\n break;\n case 0x00 | 0x03:\n case 0x0C | 0x03:\n color = palettes[(bg0 & 0x0FF) != 0x000 ? bg0 : bg1];\n break;\n case 0x00 | 0x01:\n case 0x04 | 0x01:\n case 0x08 | 0x01:\n case 0x0C | 0x01:\n color = palettes[bg0];\n break;\n case 0x00 | 0x02:\n case 0x04 | 0x02:\n case 0x08 | 0x02:\n case 0x0C | 0x02:\n color = palettes[bg1];\n break;\n default:\n color = black;\n break;\n }\n data[imageIndex] = color.r;\n data[imageIndex + 1] = color.g;\n data[imageIndex + 2] = color.b;\n }\n } else {\n for (let bgx = 0; bgx < sw; bgx++, imageIndex += 4) {\n let color = palettes[bgl0[bgx]];\n data[imageIndex] = color.r;\n data[imageIndex + 1] = color.g;\n data[imageIndex + 2] = color.b;\n }\n }\n }\n }\n\n\n GetScreenSize(vdcno) {\n let vdcc = this.VDC[vdcno];\n let r = vdcc.VDCRegister;\n\n vdcc.VScreenWidth = this.VScreenWidthArray[r[0x09] & 0x0030];\n\n vdcc.VScreenHeight = (r[0x09] & 0x0040) == 0x0000 ? 32 : 64;\n vdcc.VScreenHeightMask = vdcc.VScreenHeight * 8 - 1;\n vdcc.ScreenWidth = ((r[0x0B] & 0x007F) + 1) * 8;\n\n if (vdcc.ScreenWidth > this.ScreenWidthMAX)\n vdcc.ScreenWidth = this.ScreenWidthMAX;\n\n vdcc.HDS = (r[0x0A] & 0x7F00) >> 8;\n vdcc.HSW = r[0x0A] & 0x001F;\n\n vdcc.HDE = (r[0x0B] & 0x7F00) >> 8;\n vdcc.HDW = r[0x0B] & 0x007F;\n\n vdcc.VDS = ((r[0x0C] & 0xFF00) >> 8);\n vdcc.VSW = r[0x0C] & 0x001F;\n\n vdcc.VDW = r[0x0D] & 0x01FF;\n\n vdcc.VCR = r[0x0E] & 0x00FF;\n\n vdcc.ScreenSize = this.ScreenSize[this.VCEBaseClock];\n if (this.MainCanvas.width != vdcc.ScreenSize) {\n //this.MainCanvas.style.width = (this.PutScreenSize[this.VCEBaseClock] * 2) + 'px';\n this.MainCanvas.width = this.PutScreenSize[this.VCEBaseClock];\n }\n\n vdcc.DrawLineWidth = (vdcc.HDS + vdcc.HSW + vdcc.HDE + vdcc.HDW + 1) << 3;\n if (vdcc.DrawLineWidth <= this.ScreenSize[this.BaseClock5])\n vdcc.DrawLineWidth = this.ScreenSize[this.BaseClock5];\n else if (vdcc.DrawLineWidth <= this.ScreenSize[this.BaseClock7])\n vdcc.DrawLineWidth = this.ScreenSize[this.BaseClock7];\n else vdcc.DrawLineWidth = this.ScreenSize[this.BaseClock10];\n\n vdcc.VDCBurst = (r[0x05] & 0x00C0) == 0x0000 ? true : false;\n }\n\n\n VDCInit() {\n this.VDCPutLineProgressClock = 0;\n this.VDCPutLine = 0;\n this.DrawFlag = false;\n\n for (let vdcno = 0; vdcno < 2; vdcno++) {\n this.VDC[vdcno] = {\n VDCRegister: new Uint16Array(20).fill(0x0000),\n VRAM: new Uint16Array(0x10000).fill(0x0000),\n SATB: new Uint16Array(256).fill(0x0000),\n VDCBurst: false,\n SpriteLimit: false,\n\n SPLine: new Array(this.ScreenWidthMAX),\n BGLine: new Array(this.ScreenWidthMAX).fill(0x00),\n\n VDCStatus: 0x00,\n VDCRegisterSelect: 0x00,\n WriteVRAMData: 0x0000,\n\n VRAMtoSATBStartFlag: false,\n VRAMtoSATBCount: 0,\n VRAMtoVRAMCount: 0,\n\n RasterCount: 64,\n VDCProgressClock: 0,\n DrawBGYLine: 0,\n DrawBGLine: 0,\n\n VScreenWidth: 0,\n VScreenHeight: 0,\n VScreenHeightMask: 0,\n ScreenWidth: 0,\n ScreenSize: 0,\n DrawLineWidth: 0,\n DrawBGIndex: 0,\n\n HDS: 0,\n HSW: 0,\n HDE: 0,\n HDW: 0,\n VDS: 0,\n VSW: 0,\n VDW: 0,\n VCR: 0\n };\n\n for (let i = 0; i < this.VDC[vdcno].SPLine.length; i++)\n this.VDC[vdcno].SPLine[i] = { data: 0x00, no: 255, priority: 0x00 };\n\n this.VDC[vdcno].VDCRegister[0x09] = 0x0010;\n this.VDC[vdcno].VDCRegister[0x0A] = 0x0202;\n this.VDC[vdcno].VDCRegister[0x0B] = 0x031F;\n this.VDC[vdcno].VDCRegister[0x0C] = 0x0F02;\n this.VDC[vdcno].VDCRegister[0x0D] = 0x00EF;\n this.VDC[vdcno].VDCRegister[0x0E] = 0x0003;\n }\n\n this.GetScreenSize(0);\n this.GetScreenSize(1);\n }\n\n\n SetVDCRegister(data, vdcno) {\n this.VDC[vdcno].VDCRegisterSelect = data & 0x1F;\n }\n\n\n SetVDCLow(data, vdcno) {\n let vdcc = this.VDC[vdcno];\n\n if (vdcc.VDCRegisterSelect == 0x02)\n vdcc.WriteVRAMData = data;\n else\n vdcc.VDCRegister[vdcc.VDCRegisterSelect] = (vdcc.VDCRegister[vdcc.VDCRegisterSelect] & 0xFF00) | data;\n\n if (vdcc.VDCRegisterSelect == 0x01) {\n vdcc.VDCRegister[0x02] = vdcc.VRAM[vdcc.VDCRegister[0x01]];\n return;\n }\n\n if (vdcc.VDCRegisterSelect == 0x08) {\n vdcc.DrawBGLine = vdcc.VDCRegister[0x08];\n return;\n }\n\n if (vdcc.VDCRegisterSelect == 0x0F)\n vdcc.VRAMtoSATBStartFlag = (vdcc.VDCRegister[0x0F] & 0x10) == 0x10;\n }\n\n\n SetVDCHigh(data, vdcno) {\n let vdcc = this.VDC[vdcno];\n\n if (vdcc.VDCRegisterSelect == 0x02) {\n vdcc.VRAM[vdcc.VDCRegister[0x00]] = vdcc.WriteVRAMData | (data << 8);\n vdcc.VDCRegister[0x00] = (vdcc.VDCRegister[0x00] + this.GetVRAMIncrement(vdcno)) & 0xFFFF;\n return;\n }\n\n vdcc.VDCRegister[vdcc.VDCRegisterSelect] = (vdcc.VDCRegister[vdcc.VDCRegisterSelect] & 0x00FF) | (data << 8);\n\n if (vdcc.VDCRegisterSelect == 0x01) {\n vdcc.VDCRegister[0x02] = vdcc.VRAM[vdcc.VDCRegister[0x01]];\n vdcc.VDCRegister[0x03] = vdcc.VDCRegister[0x02];\n vdcc.VDCRegister[0x01] = (vdcc.VDCRegister[0x01] + this.GetVRAMIncrement(vdcno)) & 0xFFFF;\n return;\n }\n\n if (vdcc.VDCRegisterSelect == 0x08) {\n vdcc.DrawBGLine = vdcc.VDCRegister[0x08];\n return;\n }\n\n if (vdcc.VDCRegisterSelect == 0x12) {//VRAMtoVRAM\n let si = (vdcc.VDCRegister[0x0F] & 0x0004) == 0x0000 ? 1 : -1;\n let di = (vdcc.VDCRegister[0x0F] & 0x0008) == 0x0000 ? 1 : -1;\n\n let s = vdcc.VDCRegister[0x10];\n let d = vdcc.VDCRegister[0x11];\n let l = vdcc.VDCRegister[0x12] + 1;\n\n vdcc.VRAMtoVRAMCount = l * this.VCEBaseClock;\n vdcc.VDCStatus |= 0x40;\n\n let vram = vdcc.VRAM;\n for (; l > 0; l--) {\n vram[d] = vram[s];\n s = (s + si) & 0xFFFF;\n d = (d + di) & 0xFFFF;\n }\n return;\n }\n\n if (vdcc.VDCRegisterSelect == 0x13)//VRAMtoSATB\n vdcc.VRAMtoSATBStartFlag = true;\n }\n\n\n GetVRAMIncrement(vdcno) {\n switch (this.VDC[vdcno].VDCRegister[0x05] & 0x1800) {\n case 0x0000:\n return 1;\n case 0x0800:\n return 32;\n case 0x1000:\n return 64;\n case 0x1800:\n return 128;\n }\n }\n\n\n GetVDCStatus(vdcno) {\n let tmp = this.VDC[vdcno].VDCStatus;\n this.VDC[vdcno].VDCStatus &= 0x40;\n return tmp;\n }\n\n\n GetVDCLow(vdcno) {\n return this.VDC[vdcno].VDCRegister[this.VDC[vdcno].VDCRegisterSelect] & 0x00FF;\n }\n\n\n GetVDCHigh(vdcno) {\n let vdcc = this.VDC[vdcno];\n\n if (vdcc.VDCRegisterSelect == 0x02 || vdcc.VDCRegisterSelect == 0x03) {\n let tmp = (vdcc.VDCRegister[0x02] & 0xFF00) >> 8;\n vdcc.VDCRegister[0x02] = vdcc.VRAM[vdcc.VDCRegister[0x01]];\n vdcc.VDCRegister[0x03] = vdcc.VDCRegister[0x02];\n vdcc.VDCRegister[0x01] = (vdcc.VDCRegister[0x01] + this.GetVRAMIncrement(vdcno)) & 0xFFFF;\n return tmp;\n }\n\n return (vdcc.VDCRegister[vdcc.VDCRegisterSelect] & 0xFF00) >> 8;\n }\n\n\n /* *************** */\n /* **** Sound **** */\n /* *************** */\n SoundConstruct() {\n this.WaveDataArray = [];\n this.WaveClockCounter = 0;\n this.WaveVolume = 1.0;\n\n this.WebAudioCtx = null;\n this.WebAudioJsNode = null;\n this.WebAudioGainNode = null;\n this.WebAudioBufferSize = 2048;\n\n this.PSGClock = 3579545;\n }\n\n\n WebAudioFunction(e) {\n let output = [];\n let data = [];\n\n for (let i = 0; i < 2; i++) {\n output[i] = e.outputBuffer.getChannelData(i);\n data[i] = new Float32Array(this.WebAudioBufferSize);\n if (this.WaveDataArray[i].length < this.WebAudioBufferSize) {\n data[i].fill(0.0);\n } else {\n for (let j = 0; j < data[i].length; j++)\n data[i][j] = this.WaveDataArray[i].shift() / ((32 * 16 * 32) * 8 * 16);\n if (this.WaveDataArray[i].length > this.WebAudioBufferSize * 2)\n this.WaveDataArray[i] = this.WaveDataArray[i].slice(this.WebAudioBufferSize);\n }\n output[i].set(data[i]);\n }\n }\n\n SoundInit() {\n this.WaveClockCounter = 0;\n this.WaveDataArray = [];\n this.WaveDataArray[0] = [];\n this.WaveDataArray[1] = [];\n\n if (typeof AudioContext !== \"undefined\" && this.WebAudioCtx == null) {\n this.CreateAudioContext();\n }\n }\n\n CreateAudioContext() {\n this.WebAudioCtx = new window.AudioContext();\n this.WebAudioJsNode = this.WebAudioCtx.createScriptProcessor(this.WebAudioBufferSize, 0, 2);\n this.WebAudioJsNode.onaudioprocess = this.WebAudioFunction.bind(this);\n this.WebAudioGainNode = this.WebAudioCtx.createGain();\n this.WebAudioJsNode.connect(this.WebAudioGainNode);\n this.WebAudioGainNode.connect(this.WebAudioCtx.destination);\n }\n\n SoundSet() {\n let waveoutleft;\n let waveoutright;\n let ch;\n\n let i;\n let j;\n let out;\n\n this.WaveClockCounter += this.WebAudioCtx.sampleRate;\n if (this.WaveClockCounter >= this.PSGClock) {\n this.WaveClockCounter -= this.PSGClock;\n\n waveoutleft = 0;\n waveoutright = 0;\n for (j = 0; j < 6; j++) {\n if (j != 1 || !this.WaveLfoOn) {\n ch = this.PSGChannel[j];\n\n if (j < 4 || !ch.noiseon)\n out = ch.keyon ? (ch.dda ? ch.R[6] & 0x1F : ch.wave[ch.index]) : 0;\n else\n out = (ch.noise & 0x0001) == 0x0001 ? 0x0F : 0;\n\n waveoutleft += out * ch.leftvol;\n waveoutright += out * ch.rightvol;\n }\n }\n this.WaveDataArray[0].push(waveoutleft * this.WaveVolumeLeft);\n this.WaveDataArray[1].push(waveoutright * this.WaveVolumeRight);\n this.WebAudioGainNode.gain.value = this.WaveVolume;\n }\n }\n\n\n /* ************* */\n /* **** PSG **** */\n /* ************* */\n PSGConstruct() {\n this.PSGChannel = new Array(6);\n this.PSGBaseClock = this.BaseClock3;\n\n this.PSGProgressClock = 0;\n\n this.WaveVolumeLeft = 0;\n this.WaveVolumeRight = 0;\n\n this.WaveLfoOn = false;\n this.WaveLfoControl = 0;\n this.WaveLfoFreqency = 0;\n }\n\n\n PSGInit() {\n this.SoundInit();\n\n for (let i = 0; i < this.PSGChannel.length; i++)\n this.PSGChannel[i] = {\n R: new Array(10).fill(0),\n keyon: false,\n dda: false,\n freq: 0,\n count: 0,\n vol: 0,\n leftvol: 0,\n rightvol: 0,\n noiseon: false,\n noisefreq: 0,\n noise: 0x8000,\n noisestate: 0,\n index: 0,\n wave: new Uint8Array(32)\n };\n }\n\n\n PSGRun() {\n if (this.WebAudioCtx == null)\n return;\n\n let ch;\n let i;\n let j;\n let ch0;\n let ch1;\n let freqtmp;\n\n this.PSGProgressClock += this.ProgressClock;\n i = (this.PSGProgressClock / this.PSGBaseClock) | 0;\n this.PSGProgressClock %= this.PSGBaseClock;\n\n while (i > 0) {\n i--;\n j = 0;\n\n if (this.WaveLfoOn) {\n ch0 = this.PSGChannel[0];\n ch1 = this.PSGChannel[1];\n if (ch0.keyon) {\n if (ch0.count == 0) {\n ch0.index = (ch0.index + 1) & 0x1F;\n freqtmp = 0;\n if (this.WaveLfoControl != 0x00) {\n freqtmp = ch1.wave[ch1.index];\n freqtmp = freqtmp > 0x0F ? freqtmp - 0x20 : freqtmp & 0x0F;\n freqtmp <<= 4 * (this.WaveLfoControl - 1);\n }\n freqtmp = ch0.freq + freqtmp;\n if (freqtmp < 0)\n freqtmp = 0;\n ch0.count = freqtmp;\n } else\n ch0.count--;\n\n if (ch1.count == 0) {\n ch1.index = (ch1.index + 1) & 0x1F;\n ch1.count = ch1.freq * this.WaveLfoFreqency;\n } else\n ch1.count--;\n }\n j = 2;\n }\n\n for (; j < 6; j++) {\n ch = this.PSGChannel[j];\n if (j < 4 || !ch.noiseon) {\n if (ch.keyon && !ch.dda) {\n if (ch.count == 0) {\n ch.index = (ch.index + 1) & 0x1F;\n ch.count = ch.freq;\n } else\n ch.count--;\n }\n } else {\n if (ch.keyon && !ch.dda) {\n if (ch.count == 0) {\n ch.index = (ch.index + 1) & 0x1F;\n if (ch.index == 0)\n ch.noise = (ch.noise >> 1) | (((ch.noise << 12) ^ (ch.noise << 15)) & 0x8000);\n ch.count = ch.noisefreq;\n } else\n ch.count--;\n }\n }\n }\n this.SoundSet();\n }\n }\n\n\n SetPSG(r, data) {\n if (r == 0) {\n this.PSGChannel[0].R[0] = data & 0x07;\n return;\n }\n\n if (this.PSGChannel[0].R[0] > 5)\n return;\n\n let ch = this.PSGChannel[this.PSGChannel[0].R[0]];\n ch.R[r] = data;\n\n switch (r) {\n case 1:\n this.PSGChannel[0].R[1] = data;\n this.WaveVolumeLeft = (data & 0xF0) >> 4;\n this.WaveVolumeRight = data & 0x0F;\n return;\n\n case 2:\n case 3:\n ch.freq = ((ch.R[3] << 8) | ch.R[2]) & 0x0FFF;\n return;\n\n case 4:\n ch.keyon = (data & 0x80) == 0x80 ? true : false;\n ch.dda = (data & 0x40) == 0x40 ? true : false;\n if ((data & 0x40) == 0x40)\n ch.index = 0;\n ch.vol = data & 0x1F;\n case 5:\n let vol = ch.R[4] & 0x1F;\n ch.leftvol = ((ch.R[5] & 0xF0) >> 4) * vol;\n ch.rightvol = (ch.R[5] & 0x0F) * vol;\n return;\n\n case 6:\n if (!ch.dda) {\n ch.wave[ch.index] = data & 0x1F;\n ch.index = (ch.index + 1) & 0x1F;\n }\n return;\n\n case 7:\n ch.noiseon = (data & 0x80) == 0x80 ? true : false;\n ch.noisefreq = (data & 0x1F) ^ 0x1F;\n return;\n\n case 8:\n this.PSGChannel[0].R[8] = data;\n this.WaveLfoFreqency = data;\n return;\n\n case 9:\n this.PSGChannel[0].R[9] = data;\n this.WaveLfoOn = (data & 0x80) == 0x80 ? true : false;\n this.WaveLfoControl = data & 0x03;\n return;\n }\n }\n\n\n GetPSG(r) {\n if (r > 9)\n return 0xFF;\n if (r == 0 || r == 1 || r == 8 || r == 9)\n return this.PSGChannel[0].R[r];\n if (this.PSGChannel[0].R[0] > 5)\n return 0xFF;\n return this.PSGChannel[this.PSGChannel[0].R[0]].R[r];\n }\n\n\n /* *************** */\n /* **** TIMER **** */\n /* *************** */\n TimerConstruct() {\n this.TimerBaseClock = this.BaseClock7;\n this.TimerReload = 0;\n this.TimerFlag = false;\n this.TimerCounter = 0;\n this.TimerPrescaler = 0;\n this.INTTIQ = 0;\n }\n\n\n TimerInit() {\n this.TimerReload = 0x00;\n this.TimerFlag = false;\n this.TimerCounter = 0x00;\n this.TimerPrescaler = 0;\n this.INTTIQ = 0x00;\n }\n\n\n ReadTimerCounter() {\n return this.TimerCounter;\n }\n\n\n TimerAcknowledge() {\n this.INTTIQ = 0x00;\n }\n\n\n WirteTimerReload(data) {\n this.TimerReload = data & 0x7F;\n }\n\n\n WirteTimerControl(data) {\n if (!this.TimerFlag && (data & 0x01) == 0x01) {\n this.TimerCounter = this.TimerReload;\n this.TimerPrescaler = 0;\n }\n\n this.TimerFlag = (data & 0x01) == 0x01 ? true : false;\n }\n\n\n TimerRun() {\n if (this.TimerFlag) {\n this.TimerPrescaler += this.ProgressClock;\n while (this.TimerPrescaler >= (1024 * this.TimerBaseClock)) {\n this.TimerPrescaler -= 1024 * this.TimerBaseClock;\n this.TimerCounter--;\n if (this.TimerCounter < 0) {\n this.TimerCounter = this.TimerReload;\n this.INTTIQ = this.TIQFlag;\n }\n }\n }\n }\n\n\n /* ****************** */\n /* **** Joystick **** */\n /* ****************** */\n JoystickConstruct() {\n this.JoystickSEL = 0;\n this.JoystickCLR = 0;\n this.KeyUpFunction = null;\n this.KeyDownFunction = null;\n\n this.Keybord = new Array(5).fill([]);\n this.Keybord = this.Keybord.map((d) => { return new Array(4); });\n\n this.GamePad = new Array(5).fill([]);\n this.GamePad = this.Keybord.map((d) => { return new Array(4); });\n\n this.GamePadSelect = 0x00;\n this.GamePadButtonSelect = 0x00;\n this.GamePadBuffer = 0x00;\n\n this.GamePadData = [];\n this.GamePadData[\"STANDARD PAD\"] = [\n [[{ type: \"B\", index: 1 }],// SHOT1\n [{ type: \"B\", index: 0 }],// SHOT2\n [{ type: \"B\", index: 8 }],// SELECT\n [{ type: \"B\", index: 9 }, { type: \"B\", index: 2 }],// RUN\n [{ type: \"B\", index: 12 }],// UP\n [{ type: \"B\", index: 13 }],// DOWN\n [{ type: \"B\", index: 14 }],// LEFT\n [{ type: \"B\", index: 15 }]],// RIGHT\n\n [[{ type: \"B\", index: 1 }],// SHOT1\n [{ type: \"B\", index: 0 }],// SHOT2\n [{ type: \"B\", index: 8 }],// SELECT\n [{ type: \"B\", index: 9 }],// RUN\n [{ type: \"B\", index: 12 }],// UP\n [{ type: \"B\", index: 13 }],// DOWN\n [{ type: \"B\", index: 14 }],// LEFT\n [{ type: \"B\", index: 15 }],// RIGHT\n [{ type: \"B\", index: 7 }],// SHOT3\n [{ type: \"B\", index: 5 }],// SHOT4\n [{ type: \"B\", index: 2 }],// SHOT5\n [{ type: \"B\", index: 3 }]]];// SHOT6\n\n this.GamePadData[\"HORI PAD 3 TURBO (Vendor: 0f0d Product: 0009)\"] = [// Chrome\n [[{ type: \"B\", index: 2 }],// SHOT1\n [{ type: \"B\", index: 1 }],// SHOT2\n [{ type: \"B\", index: 8 }],// SELECT\n [{ type: \"B\", index: 9 }, { type: \"B\", index: 0 }],// RUN\n [{ type: \"P\", index: 9 }],// UP (POV)\n [{ type: \"N\", index: 0 }],// DOWN (POV)\n [{ type: \"N\", index: 0 }],// LEFT (POV)\n [{ type: \"N\", index: 0 }]],// RIGHT (POV)\n\n [[{ type: \"B\", index: 2 }],// SHOT1\n [{ type: \"B\", index: 1 }],// SHOT2\n [{ type: \"B\", index: 8 }],// SELECT\n [{ type: \"B\", index: 9 }],// RUN\n [{ type: \"P\", index: 9 }],// UP (POV)\n [{ type: \"N\", index: 0 }],// DOWN (POV)\n [{ type: \"N\", index: 0 }],// LEFT (POV)\n [{ type: \"N\", index: 0 }],// RIGHT (POV)\n [{ type: \"B\", index: 7 }],// SHOT3\n [{ type: \"B\", index: 5 }],// SHOT4\n [{ type: \"B\", index: 0 }],// SHOT5\n [{ type: \"B\", index: 3 }]]];// SHOT6\n\n this.GamePadData[\"0f0d-0009-HORI PAD 3 TURBO\"] = this.GamePadData[\"HORI PAD 3 TURBO (Vendor: 0f0d Product: 0009)\"];// Firefox\n this.GamePadData[\"UNKNOWN PAD\"] = this.GamePadData[\"HORI PAD 3 TURBO (Vendor: 0f0d Product: 0009)\"];\n\n this.GamePadKeyData = [{ index: 0, data: 0x01 }, { index: 0, data: 0x02 },\n { index: 0, data: 0x04 }, { index: 0, data: 0x08 },\n { index: 1, data: 0x01 }, { index: 1, data: 0x04 },\n { index: 1, data: 0x08 }, { index: 1, data: 0x02 },\n { index: 2, data: 0x01 }, { index: 2, data: 0x02 },\n { index: 2, data: 0x04 }, { index: 2, data: 0x08 }];\n\n this.GamePadPovData = [0x01, 0x01 | 0x02, 0x02, 0x02 | 0x04, 0x04, 0x04 | 0x08, 0x08, 0x01 | 0x08];\n }\n\n\n JoystickInit() {\n this.JoystickSEL = 0;\n this.JoystickCLR = 0;\n\n for (let i = 0; i < this.Keybord.length; i++) {\n this.Keybord[i][0] = 0xBF;\n this.Keybord[i][1] = 0xBF;\n this.Keybord[i][2] = 0xBF;\n this.Keybord[i][3] = 0xB0;\n }\n\n this.GamePadSelect = 0;\n this.GamePadButtonSelect = 0x00;\n this.GamePadBuffer = 0x00;\n }\n\n\n SetJoystick(data) {\n let sel = data & 0x01;\n let clr = (data & 0x02) >> 1;\n\n if ((this.JoystickSEL == 1 && this.JoystickCLR == 0) && (sel == 1 && clr == 1)) {\n this.JoystickSEL = 0;\n this.JoystickCLR = 0;\n this.GamePadSelect = 0;\n if (this.GamePadButton6)\n this.GamePadButtonSelect = this.GamePadButtonSelect ^ 0x02;\n this.GamePadBuffer = 0xB0 | this.CountryType;\n return;\n }\n\n if ((this.JoystickSEL == 0 && this.JoystickCLR == 0) && (sel == 1 && clr == 0))\n this.GamePadSelect++;\n\n this.JoystickSEL = sel;\n this.JoystickCLR = clr;\n\n let no = this.MultiTap ? this.GamePadSelect - 1 : 0;\n if (no < 5) {\n let tmp = this.GamePadButtonSelect | this.JoystickSEL;\n this.GamePadBuffer = (this.Keybord[no][tmp] & this.GamePad[no][tmp]) | this.CountryType;\n } else\n this.GamePadBuffer = 0xB0 | this.CountryType;\n }\n\n\n GetJoystick() {\n return this.GamePadBuffer;\n }\n\n\n UnsetButtonRUN(no) {\n this.Keybord[no][0] |= 0x08;\n }\n\n\n UnsetButtonSELECT(no) {\n this.Keybord[no][0] |= 0x04;\n }\n\n\n UnsetButtonSHOT2(no) {\n this.Keybord[no][0] |= 0x02;\n }\n\n\n UnsetButtonSHOT1(no) {\n this.Keybord[no][0] |= 0x01;\n }\n\n\n UnsetButtonLEFT(no) {\n this.Keybord[no][1] |= 0x08;\n }\n\n\n UnsetButtonDOWN(no) {\n this.Keybord[no][1] |= 0x04;\n }\n\n\n UnsetButtonRIGHT(no) {\n this.Keybord[no][1] |= 0x02;\n }\n\n\n UnsetButtonUP(no) {\n this.Keybord[no][1] |= 0x01;\n }\n\n\n UnsetButtonSHOT6(no) {\n this.Keybord[no][2] |= 0x08;\n }\n\n\n UnsetButtonSHOT5(no) {\n this.Keybord[no][2] |= 0x04;\n }\n\n\n UnsetButtonSHOT4(no) {\n this.Keybord[no][2] |= 0x02;\n }\n\n\n UnsetButtonSHOT3(no) {\n this.Keybord[no][2] |= 0x01;\n }\n\n\n SetButtonRUN(no) {\n this.Keybord[no][0] &= ~0x08;\n }\n\n\n SetButtonSELECT(no) {\n this.Keybord[no][0] &= ~0x04;\n }\n\n\n SetButtonSHOT2(no) {\n this.Keybord[no][0] &= ~0x02;\n }\n\n\n SetButtonSHOT1(no) {\n this.Keybord[no][0] &= ~0x01;\n }\n\n\n SetButtonLEFT(no) {\n this.Keybord[no][1] &= ~0x08;\n }\n\n\n SetButtonDOWN(no) {\n this.Keybord[no][1] &= ~0x04;\n }\n\n\n SetButtonRIGHT(no) {\n this.Keybord[no][1] &= ~0x02;\n }\n\n\n SetButtonUP(no) {\n this.Keybord[no][1] &= ~0x01;\n }\n\n\n SetButtonSHOT6(no) {\n this.Keybord[no][2] &= ~0x08;\n }\n\n\n SetButtonSHOT5(no) {\n this.Keybord[no][2] &= ~0x04;\n }\n\n\n SetButtonSHOT4(no) {\n this.Keybord[no][2] &= ~0x02;\n }\n\n\n SetButtonSHOT3(no) {\n this.Keybord[no][2] &= ~0x01;\n }\n\n\n CheckKeyUpFunction(evt) {\n switch (evt.keyCode) {\n case Keys['START'].c:// RUN 'S'\n this.UnsetButtonRUN(0);\n break;\n case Keys['SELECT'].c:// SELECT 'A'\n this.UnsetButtonSELECT(0);\n break;\n case Keys['A'].c:// SHOT2 'Z'\n case Keys['GP_A'].c:// SHOT2 'Z'\n this.UnsetButtonSHOT2(0);\n break;\n case Keys['B'].c:// SHOT1 'X'\n case Keys['GP_B'].c:// SHOT1 'X'\n this.UnsetButtonSHOT1(0);\n break;\n\n case 86:// SHOT2 'V'\n this.UnsetButtonSHOT2(0);\n break;\n case 66:// SHOT1 'B'\n this.UnsetButtonSHOT1(0);\n break;\n\n case 37:// LEFT\n this.UnsetButtonLEFT(0);\n break;\n case 39:// RIGHT\n this.UnsetButtonRIGHT(0);\n break;\n case 40:// DOWN\n this.UnsetButtonDOWN(0);\n break;\n case 38:// UP\n this.UnsetButtonUP(0);\n break;\n\n case 71:// SHOT6 'G'\n this.UnsetButtonSHOT6(0);\n break;\n case 70:// SHOT5 'F'\n this.UnsetButtonSHOT5(0);\n break;\n case 68:// SHOT4 'D'\n this.UnsetButtonSHOT4(0);\n break;\n case 67:// SHOT3 'C'\n this.UnsetButtonSHOT3(0);\n break;\n }\n //evt.preventDefault();\n }\n\n\n CheckKeyDownFunction(evt) {\n switch (evt.keyCode) {\n case Keys['START'].c:// RUN 'S'\n this.SetButtonRUN(0);\n break;\n case Keys['SELECT'].c:// SELECT 'A'\n this.SetButtonSELECT(0);\n break;\n case Keys['A'].c:// SHOT2 'Z'\n case Keys['GP_A'].c:// SHOT2 'Z'\n this.SetButtonSHOT2(0);\n break;\n case Keys['B'].c:// SHOT2 'Z'\n case Keys['GP_B'].c:// SHOT2 'Z'\n this.SetButtonSHOT1(0);\n break;\n\n case 86:// SHOT2 'V'\n this.SetButtonSHOT2(0);\n break;\n case 66:// SHOT1 'B'\n this.SetButtonSHOT1(0);\n break;\n\n case 37:// LEFT\n this.SetButtonLEFT(0);\n break;\n case 39:// RIGHT\n this.SetButtonRIGHT(0);\n break;\n case 40:// DOWN\n this.SetButtonDOWN(0);\n break;\n case 38:// UP\n this.SetButtonUP(0);\n break;\n\n case 71:// SHOT6 'G'\n this.SetButtonSHOT6(0);\n break;\n case 70:// SHOT5 'F'\n this.SetButtonSHOT5(0);\n break;\n case 68:// SHOT4 'D'\n this.SetButtonSHOT4(0);\n break;\n case 67:// SHOT3 'C'\n this.SetButtonSHOT3(0);\n break;\n }\n //evt.preventDefault();\n }\n\n\n JoystickEventInit() {\n this.KeyUpFunction = this.CheckKeyUpFunction.bind(this);\n this.KeyDownFunction = this.CheckKeyDownFunction.bind(this);\n this.MainCanvas.addEventListener(\"keyup\", this.KeyUpFunction, true);\n this.MainCanvas.addEventListener(\"keydown\", this.KeyDownFunction, true);\n }\n\n\n JoystickEventRelease() {\n this.MainCanvas.removeEventListener(\"keyup\", this.KeyUpFunction, true);\n this.MainCanvas.removeEventListener(\"keydown\", this.KeyDownFunction, true);\n }\n\n CheckGamePad() {\n for (let i = 0; i < this.GamePad.length; i++) {\n this.GamePad[i][0] = 0xBF;\n this.GamePad[i][1] = 0xBF;\n this.GamePad[i][2] = 0xBF;\n this.GamePad[i][3] = 0xB0;\n }\n\n if (typeof navigator.getGamepads === \"undefined\")\n return;\n\n let pads = navigator.getGamepads();\n for (let i = 0; i < 5; i++) {\n let pad = pads[i];\n if (typeof pad !== \"undefined\" && pad !== null) {\n\n let paddata;\n if (pad.mapping === \"standard\")\n paddata = this.GamePadData[\"STANDARD PAD\"];\n else {\n paddata = this.GamePadData[pad.id];\n if (typeof paddata === \"undefined\")\n paddata = this.GamePadData[\"UNKNOWN PAD\"];\n }\n paddata = this.GamePadButton6 ? paddata[1] : paddata[0];\n\n let tmp = 0;\n for (const val0 of paddata) {\n for (const val1 of val0) {\n switch (val1.type) {\n case \"B\":\n if (pad.buttons[val1.index].pressed)\n this.GamePad[i][this.GamePadKeyData[tmp].index] &= ~this.GamePadKeyData[tmp].data;\n break;\n case \"A-\":\n if (pad.axes[val1.index] < -0.5)\n this.GamePad[i][this.GamePadKeyData[tmp].index] &= ~this.GamePadKeyData[tmp].data;\n break;\n case \"A+\":\n if (pad.axes[val1.index] > 0.5)\n this.GamePad[i][this.GamePadKeyData[tmp].index] &= ~this.GamePadKeyData[tmp].data;\n break;\n case \"AB\":\n if (pad.axes[val1.index] > -0.75)\n this.GamePad[i][this.GamePadKeyData[tmp].index] &= ~this.GamePadKeyData[tmp].data;\n break;\n case \"P\":\n let povtmp = ((pad.axes[val1.index] + 1) * 7 / 2 + 0.5) | 0;\n this.GamePad[i][1] &= ~(povtmp <= 7 ? this.GamePadPovData[povtmp] : 0x00);\n break;\n }\n }\n tmp++;\n }\n }\n }\n }\n}\n"],
"mappings": "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EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAEjD,KAAK,QAAU,CACX,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC7C,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,E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",
"names": []
}