diff --git a/BizHawk.Emulation/BizHawk.Emulation.csproj b/BizHawk.Emulation/BizHawk.Emulation.csproj index 8a64ca9ff7..3743ffb90e 100644 --- a/BizHawk.Emulation/BizHawk.Emulation.csproj +++ b/BizHawk.Emulation/BizHawk.Emulation.csproj @@ -79,38 +79,31 @@ VersionInfo.cs - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + @@ -559,6 +552,7 @@ + diff --git a/BizHawk.Emulation/Computers/Commodore64/1541.cs b/BizHawk.Emulation/Computers/Commodore64/1541.cs deleted file mode 100644 index fa9d672ac1..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/1541.cs +++ /dev/null @@ -1,210 +0,0 @@ -using BizHawk.Emulation.CPUs.M6502; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public class Drive1541 - { - // the 1541 drive: - // - // 2kb ram, mapped 0000-07FF - // two 6522 VIA chips, mapped at 1800 (communication to C64) and 1C00 (drive mechanics) - // drive ROM, mapped C000-FFFF - - // default 1800: - // 07 00 1A FF 05 00 FF FF - // 04 00 00 00 00 00 00 00 - // default 1C00: - // 90 00 00 00 05 00 FF FF - // 04 00 00 00 00 00 80 00 - - private Cia cia; - - public MOS6502X cpu; - public int cyclesPerRevolution; - public int cyclesPerSecond; - public Disk disk; - public byte[] ram; - public byte[] rom; - public double rpm; - public ChipSignals signal; - public Via via0; - public Via via1; - - public Drive1541(byte[] driveRom, Region driveRegion, Cia ciaInterface) - { - rom = new byte[driveRom.Length]; - Array.Copy(driveRom, rom, driveRom.Length); - - cia = ciaInterface; - - switch (driveRegion) - { - case Region.NTSC: - cyclesPerSecond = 14318181 / 14; - break; - case Region.PAL: - cyclesPerSecond = 14318181 / 18; - break; - } - - HardReset(); - } - - public void Eject() - { - disk = null; - } - - public void HardReset() - { - cpu = new MOS6502X(); - cpu.PC = (ushort)(Read(0xFFFC) + (Read(0xFFFD) << 8)); - cpu.ReadMemory = Read; - cpu.WriteMemory = Write; - cpu.DummyReadMemory = Read; - - ram = new byte[0x800]; - via0 = new Via(); - via1 = new Via(); - SetRPM(300.0); - - // attach VIA/CIA - via0.Connect(cia.ConnectSerialPort(1)); - - // set VIA values - via0.Poke(0x0, 0x07); - via0.Poke(0x2, 0x1A); - via0.Poke(0x3, 0xFF); - via0.Poke(0x4, 0x05); - via0.Poke(0x6, 0xFF); - via0.Poke(0x7, 0xFF); - via0.Poke(0x8, 0x04); - via0.Poke(0xE, 0x80); - via1.Poke(0x0, 0x90); - via1.Poke(0x4, 0x05); - via1.Poke(0x6, 0xFF); - via1.Poke(0x7, 0xFF); - via1.Poke(0x8, 0x04); - via1.Poke(0xE, 0x80); - } - - public void Insert(Disk newDisk) - { - disk = newDisk; - } - - public byte Peek(int addr) - { - addr &= 0xFFFF; - if (addr < 0x0800) - { - return ram[addr]; - } - else if (addr >= 0x1800 && addr < 0x1C00) - { - return via0.Peek(addr); - } - else if (addr >= 0x1C00 && addr < 0x2000) - { - return via1.Peek(addr); - } - else if (addr >= 0xC000) - { - return rom[addr & 0x3FFF]; - } - return 0xFF; - } - - public byte PeekVia0(int addr) - { - return via0.Peek(addr); - } - - public byte PeekVia1(int addr) - { - return via1.Peek(addr); - } - - public void PerformCycle() - { - cpu.IRQ = via0.IRQ | via1.IRQ; - cpu.ExecuteOne(); - via0.PerformCycle(); - via1.PerformCycle(); - } - - public void Poke(int addr, byte val) - { - addr &= 0xFFFF; - if (addr < 0x0800) - { - ram[addr] = val; - } - else if (addr >= 0x1800 && addr < 0x1C00) - { - via0.Poke(addr, val); - } - else if (addr >= 0x1C00 && addr < 0x2000) - { - via1.Poke(addr, val); - } - } - - public void PokeVia0(int addr, byte val) - { - via0.Poke(addr, val); - } - - public void PokeVia1(int addr, byte val) - { - via1.Poke(addr, val); - } - - public byte Read(ushort addr) - { - if (addr < 0x0800) - { - return ram[addr]; - } - else if (addr >= 0x1800 && addr < 0x1C00) - { - return via0.Read(addr); - } - else if (addr >= 0x1C00 && addr < 0x2000) - { - return via1.Read(addr); - } - else if (addr >= 0xC000) - { - return rom[addr & 0x3FFF]; - } - return 0xFF; - } - - public void SetRPM(double newRPM) - { - rpm = newRPM; - cyclesPerRevolution = (int)((double)cyclesPerSecond / newRPM / (double)60); - } - - public void Write(ushort addr, byte val) - { - if (addr < 0x0800) - { - ram[addr] = val; - } - else if (addr >= 0x1800 && addr < 0x1C00) - { - via0.Write(addr, val); - } - else if (addr >= 0x1C00 && addr < 0x2000) - { - via1.Write(addr, val); - } - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/C64.Core.cs b/BizHawk.Emulation/Computers/Commodore64/C64.Core.cs new file mode 100644 index 0000000000..c5ca386b37 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/C64.Core.cs @@ -0,0 +1,179 @@ +using BizHawk.Emulation.CPUs.M6502; +using BizHawk.Emulation.Computers.Commodore64.MOS; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64 +{ + public enum Region + { + NTSC, + PAL + } + + // emulated chips: + // U1: 6526 CIA0 + // U2: 6526 CIA1 + // U4: KERNAL & BASIC ROM + // U5: CHARACTER ROM + // U6: 6510 CPU + // U7: VIC 6567 (NTSC) or 6569 (PAL) + // U8: Memory multiplexer + // U9: SID 6581 or 8580 + // U10: RAM + // U11: RAM + // U19: 2114 color RAM + + public partial class C64 : IEmulator + { + // ------------------------------------ + + C64Chips chips; + + // ------------------------------------ + + private void Init(Region initRegion) + { + chips = new C64Chips(initRegion); + InitRoms(); + + // configure video + CoreOutputComm.VsyncDen = chips.vic.CyclesPerFrame; + CoreOutputComm.VsyncNum = chips.vic.CyclesPerSecond; + } + + private void InitRoms() + { + string sourceFolder = CoreInputComm.C64_FirmwaresPath; + if (sourceFolder == null) + sourceFolder = @".\C64\Firmwares"; + + string basicFile = "basic"; + string charFile = "chargen"; + string kernalFile = "kernal"; + + string basicPath = Path.Combine(sourceFolder, basicFile); + string charPath = Path.Combine(sourceFolder, charFile); + string kernalPath = Path.Combine(sourceFolder, kernalFile); + + if (!File.Exists(basicPath)) HandleFirmwareError(basicFile); + if (!File.Exists(charPath)) HandleFirmwareError(charFile); + if (!File.Exists(kernalPath)) HandleFirmwareError(kernalFile); + + byte[] basicRom = File.ReadAllBytes(basicPath); + byte[] charRom = File.ReadAllBytes(charPath); + byte[] kernalRom = File.ReadAllBytes(kernalPath); + + chips.basicRom = new Chip23XX(Chip23XXmodel.Chip2364, basicRom); + chips.kernalRom = new Chip23XX(Chip23XXmodel.Chip2364, kernalRom); + chips.charRom = new Chip23XX(Chip23XXmodel.Chip2332, charRom); + } + + // ------------------------------------ + + public bool DriveLED + { + get + { + return false; + } + } + + public void Execute(uint count) + { + for (; count > 0; count--) + { + chips.ExecutePhase1(); + chips.ExecutePhase2(); + } + } + + public void HardReset() + { + chips.HardReset(); + } + + private byte Peek(int addr) + { + return chips.cpu.Peek(addr); + } + + private void Poke(int addr, byte val) + { + chips.cpu.Poke(addr, val); + } + + // ------------------------------------ + } + + public class C64Chips + { + public Chip23XX basicRom; //u4 + public Chip23XX charRom; //u5 + public MOS6526 cia0; //u1 + public MOS6526 cia1; //u2 + public Chip2114 colorRam; //u19 + public MOS6510 cpu; //u6 + public Chip23XX kernalRom; //u4 + public MOSPLA pla; // + public Chip4864 ram; //u10+11 + public Sid sid; //u9 + public Vic vic; //u7 + + public C64Chips(Region initRegion) + { + cia0 = new MOS6526(initRegion); + cia1 = new MOS6526(initRegion); + pla = new MOSPLA(this, cia1.ReadPort0); + switch (initRegion) + { + case Region.NTSC: + vic = new MOS6567(this); + break; + case Region.PAL: + vic = new MOS6569(this); + break; + } + colorRam = new Chip2114(); + cpu = new MOS6510(this); + ram = new Chip4864(); + sid = new MOS6581(); + } + + public void ExecutePhase1() + { + cia0.ExecutePhase1(); + cia1.ExecutePhase1(); + sid.ExecutePhase1(); + vic.ExecutePhase1(); + cpu.ExecutePhase1(); + } + + public void ExecutePhase2() + { + cia0.ExecutePhase2(); + cia1.ExecutePhase2(); + sid.ExecutePhase2(); + vic.ExecutePhase2(); + cpu.ExecutePhase2(); + } + + public void HardReset() + { + // note about hard reset: NOT identical to cold start + + // reset all chips + cia0.HardReset(); + cia1.HardReset(); + colorRam.HardReset(); + cpu.HardReset(); + pla.HardReset(); + ram.HardReset(); + sid.HardReset(); + vic.HardReset(); + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/C64.PeekPoke.cs b/BizHawk.Emulation/Computers/Commodore64/C64.PeekPoke.cs deleted file mode 100644 index cecf16925a..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/C64.PeekPoke.cs +++ /dev/null @@ -1,124 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class C64 : IEmulator - { - public byte PeekCia0(int addr) - { - return cia0.Peek(addr); - } - - public byte PeekCia1(int addr) - { - return cia1.Peek(addr); - } - - public byte PeekColorRAM(int addr) - { - return (byte)(mem.colorRam[addr & 0x3FF] & 0xF); - } - - public byte PeekDiskDrive(int addr) - { - if (diskDriveAttached) - return diskDrive.Peek(addr); - return 0xFF; - } - - public byte PeekMemory(ushort addr) - { - return mem.Peek(addr); - } - - public byte PeekMemoryInt(int addr) - { - return mem.Peek((ushort)(addr & 0xFFFF)); - } - - public byte PeekRAM(int addr) - { - return mem.ram[addr]; - } - - public byte PeekSid(int addr) - { - return sid.regs[addr]; - } - - public byte PeekVia0(int addr) - { - if (diskDriveAttached) - return diskDrive.PeekVia0(addr); - return 0xFF; - } - - public byte PeekVia1(int addr) - { - if (diskDriveAttached) - return diskDrive.PeekVia1(addr); - return 0xFF; - } - - public byte PeekVic(int addr) - { - return vic.Peek(addr); - } - - public void PokeCia0(int addr, byte val) - { - cia0.Poke(addr, val); - } - - public void PokeCia1(int addr, byte val) - { - cia1.Poke(addr, val); - } - - public void PokeColorRAM(int addr, byte val) - { - mem.colorRam[addr & 0x3FF] = (byte)(val & 0xF); - } - - public void PokeDiskDrive(int addr, byte val) - { - if (diskDriveAttached) - diskDrive.Poke(addr, val); - } - - public void PokeMemoryInt(int addr, byte val) - { - mem.Poke((ushort)(addr & 0xFFFF), val); - } - - public void PokeRAM(int addr, byte val) - { - mem.PokeRam(addr, val); - } - - public void PokeSid(int addr, byte val) - { - sid.Poke(addr, val); - } - - public void PokeVia0(int addr, byte val) - { - if (diskDriveAttached) - diskDrive.PokeVia0(addr, val); - } - - public void PokeVia1(int addr, byte val) - { - if (diskDriveAttached) - diskDrive.PokeVia1(addr, val); - } - - public void PokeVic(int addr, byte val) - { - vic.Poke(addr, val); - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/Savestate.cs b/BizHawk.Emulation/Computers/Commodore64/C64.Savestate.cs similarity index 57% rename from BizHawk.Emulation/Computers/Commodore64/Savestate.cs rename to BizHawk.Emulation/Computers/Commodore64/C64.Savestate.cs index 365fad9ad2..793cd10e38 100644 --- a/BizHawk.Emulation/Computers/Commodore64/Savestate.cs +++ b/BizHawk.Emulation/Computers/Commodore64/C64.Savestate.cs @@ -55,37 +55,6 @@ namespace BizHawk.Emulation.Computers.Commodore64 void SyncState(Serializer ser) { - // global stuffs - ser.BeginSection("GAME"); - ser.Sync("Lag", ref _lagcount); - ser.Sync("Frame", ref _frame); - ser.Sync("IsLag", ref _islag); - ser.EndSection(); - - // cpu creates its own section.. - cpu.SyncState(ser); - - ser.BeginSection("MEM"); - mem.SyncState(ser); - ser.EndSection(); - - ser.BeginSection("VIC"); - vic.SyncState(ser); - ser.EndSection(); - - ser.BeginSection("SID"); - sid.SyncState(ser); - ser.EndSection(); - - ser.BeginSection("CIA0"); - cia0.SyncState(ser); - ser.EndSection(); - - ser.BeginSection("CIA1"); - cia1.SyncState(ser); - ser.EndSection(); - - // TODO: drive } } } diff --git a/BizHawk.Emulation/Computers/Commodore64/C64.core.cs b/BizHawk.Emulation/Computers/Commodore64/C64.core.cs deleted file mode 100644 index 8a49e00c0a..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/C64.core.cs +++ /dev/null @@ -1,201 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using BizHawk.Emulation.CPUs.M6502; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public enum Region - { - NTSC, - PAL - } - - public partial class C64 : IEmulator - { - // input - public Input input; - - // source - public Cartridge cart = null; - public Drive1541 diskDrive = null; - public bool diskDriveAttached = false; - public string extension; - public byte[] inputFile; - public List mediaAttached = new List(); - - // chipset - public Cia cia0; - public Cia cia1; - public MOS6502X cpu; - public Memory mem; - public Sid sid; - public VicII vic; - public ChipSignals signal; - - // cpu - private bool haltCPU; - - public bool DriveLED - { - get - { - if (diskDriveAttached) - { - return (diskDrive.Peek(0x1C00) & 0x8) != 0; - } - else - { - return false; - } - } - } - - public void HardReset() - { - mem.HardReset(); - cia0.HardReset(); - cia1.HardReset(); - vic.HardReset(); - sid.HardReset(); - if (diskDriveAttached) - diskDrive.HardReset(); - } - - private void Init(Region initRegion) - { - // initalize cpu - cpu = new MOS6502X(); - cpu.ReadMemory = ReadMemoryCPU; - cpu.WriteMemory = WriteMemory; - cpu.DummyReadMemory = PeekMemory; - - // initialize cia timers - cia0 = new Cia(initRegion); - cia1 = new Cia(initRegion); - - // initialize vic - signal = new ChipSignals(); - vic = new VicII(signal, initRegion); - - // set vsync rate - switch (initRegion) - { - case Region.NTSC: - CoreOutputComm.VsyncDen = vic.CyclesPerFrame * 14; - CoreOutputComm.VsyncNum = 14318181; - break; - case Region.PAL: - CoreOutputComm.VsyncDen = vic.CyclesPerFrame * 18; - CoreOutputComm.VsyncNum = 17734472; - break; - } - - // initialize sid - sid = new Sid(initRegion, 44100); // we'll assume 44.1k for now until there's a better way - - // initialize memory (this must be done AFTER all other chips are initialized) - string romPath = CoreInputComm.C64_FirmwaresPath; - if (romPath == null) - { - romPath = @".\C64\Firmwares"; - } - mem = new Memory(romPath, vic, sid, cia0, cia1); - vic.mem = mem; - - // initialize cpu hard reset vector - cpu.PC = (ushort)(ReadMemory(0xFFFC) + (ReadMemory(0xFFFD) << 8)); - cpu.BCD_Enabled = true; - - // initailize input - input = new Input(new DataPortConnector[] { cia0.ConnectPort(0), cia0.ConnectPort(1) }); - cia0.AttachWriteHook(0, input.WritePortA); - cia0.AttachWriteHook(1, input.WritePortB); - - // initialize media - switch (extension.ToUpper()) - { - case @".G64": - diskDrive = new Drive1541(File.ReadAllBytes(Path.Combine(romPath, @"dos1541")), initRegion, cia1); - diskDrive.Insert(G64.Read(inputFile)); - break; - case @".D64": - diskDrive = new Drive1541(File.ReadAllBytes(Path.Combine(romPath, @"dos1541")), initRegion, cia1); - diskDrive.Insert(D64.Read(inputFile)); - break; - case @".PRG": - if (inputFile.Length > 2) - mediaAttached.Add(new PRGFile(inputFile, mem, cpu)); - break; - case @".CRT": - Cartridge newCart = new Cartridge(inputFile, mem); - if (newCart.valid) - { - cart = newCart; - mediaAttached.Add(cart); - } - break; - } - - diskDriveAttached = (diskDrive != null); - } - - public void PollInput() - { - input.Poll(); - signal.KeyboardNMI = input.restorePressed; - } - - public byte ReadMemory(ushort addr) - { - return mem.Read(addr); - } - - private byte ReadMemoryCPU(ushort addr) - { - if (!signal.CpuRDY || !signal.CpuAEC) - haltCPU = true; - return mem.Read(addr); - } - - public void WriteMemory(ushort addr, byte value) - { - mem.Write(addr, value); - } - - public void WriteMemoryCPU(ushort addr, byte value) - { - if (!signal.CpuAEC) - haltCPU = true; - mem.Write(addr, value); - } - } - - public class ChipSignals - { - private bool[] _CiaSerialInput = new bool[2]; - private bool[] _CiaIRQOutput = new bool[2]; - private bool _KeyboardNMIOutput; - private bool _VicAECOutput; - private bool _VicBAOutput; - private bool _VicIRQOutput; - private bool _VicLPInput; - - public bool CiaIRQ0 { get { return _CiaIRQOutput[0]; } set { _CiaIRQOutput[0] = value; } } - public bool CiaIRQ1 { get { return _CiaIRQOutput[1]; } set { _CiaIRQOutput[1] = value; } } - public bool CiaSerial0 { get { return _CiaSerialInput[0]; } } - public bool CiaSerial1 { get { return _CiaSerialInput[1]; } } - public bool CpuAEC { get { return _VicAECOutput; } } - public bool CpuIRQ { get { return _VicIRQOutput | _CiaIRQOutput[0]; } } - public bool CpuNMI { get { return _CiaIRQOutput[1] | _KeyboardNMIOutput; } } - public bool CpuRDY { get { return !_VicBAOutput; } } - public bool KeyboardNMI { get { return _KeyboardNMIOutput; } set { _KeyboardNMIOutput = value; } } - public bool LPOutput { get { return _VicLPInput; } set { _VicLPInput = value; } } - public bool VicAEC { get { return _VicAECOutput; } set { _VicAECOutput = value; } } - public bool VicBA { get { return _VicBAOutput; } set { _VicBAOutput = value; } } - public bool VicIRQ { get { return _VicIRQOutput; } set { _VicIRQOutput = value; } } - public bool VicLP { get { return _VicLPInput; } } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/C64.cs b/BizHawk.Emulation/Computers/Commodore64/C64.cs index 9b4d02cfc2..423e64ac9a 100644 --- a/BizHawk.Emulation/Computers/Commodore64/C64.cs +++ b/BizHawk.Emulation/Computers/Commodore64/C64.cs @@ -9,6 +9,10 @@ namespace BizHawk.Emulation.Computers.Commodore64 { public partial class C64 : IEmulator { + private uint cyclesPerFrame; + private string extension; + private byte[] inputFile; + public C64(GameInfo game, byte[] rom, string romextension) { inputFile = rom; @@ -17,6 +21,7 @@ namespace BizHawk.Emulation.Computers.Commodore64 CoreOutputComm = new CoreOutputComm(); CoreInputComm = new CoreInputComm(); Init(Region.PAL); + cyclesPerFrame = (uint)chips.vic.CyclesPerFrame; CoreOutputComm.UsesDriveLed = true; } @@ -52,14 +57,14 @@ namespace BizHawk.Emulation.Computers.Commodore64 // audio/video public void EndAsyncSound() { } //TODO - public ISoundProvider SoundProvider { get { return sid; } } + public ISoundProvider SoundProvider { get { return chips.sid; } } public bool StartAsyncSound() { return true; } //TODO - public ISyncSoundProvider SyncSoundProvider { get { return new SidSyncSoundProvider(sid); } } - public IVideoProvider VideoProvider { get { return vic; } } + public ISyncSoundProvider SyncSoundProvider { get { return chips.sid; } } + public IVideoProvider VideoProvider { get { return chips.vic; } } // controller public ControllerDefinition ControllerDefinition { get { return C64ControllerDefinition; } } - public IController Controller { get { return input.controller; } set { input.controller = value; } } + public IController Controller { get { return null; } set { } } public static readonly ControllerDefinition C64ControllerDefinition = new ControllerDefinition { Name = "Commodore 64 Controller", //TODO @@ -84,59 +89,23 @@ namespace BizHawk.Emulation.Computers.Commodore64 // process frame public void FrameAdvance(bool render, bool rendersound) { - int cyclesPerFrame = vic.CyclesPerFrame; - - // bizhawk interface setup - _frame++; - mem.inputWasRead = false; - - // apply any media if needed - foreach (IMedia media in mediaAttached) - { - if (!media.Loaded() && media.Ready()) - { - media.Apply(); - } - } - - // refresh the input values - PollInput(); - - // perform the cycle - for (int i = 0; i < cyclesPerFrame; i++) - { - if (!haltCPU) - { - cpu.IRQ = signal.CpuIRQ; - cpu.NMI = signal.CpuNMI; - cpu.ExecuteOne(); - } - - vic.PerformCycle(); - cia0.PerformCycle(); - signal.CiaIRQ0 = cia0.IRQ; - cia1.PerformCycle(); - signal.CiaIRQ1 = cia1.IRQ; - sid.PerformCycle(); - - if (diskDriveAttached) - diskDrive.PerformCycle(); - - if (signal.CpuAEC) - haltCPU = false; - - } - - _islag = !mem.inputWasRead; + chips.pla.InputWasRead = false; + Execute(cyclesPerFrame); + _islag = !chips.pla.InputWasRead; if (_islag) - { LagCount++; - } + _frame++; CoreOutputComm.DriveLED = DriveLED; } + private void HandleFirmwareError(string file) + { + System.Windows.Forms.MessageBox.Show("the C64 core is referencing a firmware file which could not be found. Please make sure it's in your configured C64 firmwares folder. The referenced filename is: " + file); + throw new FileNotFoundException(); + } + public byte[] SaveStateBinary() { MemoryStream ms = new MemoryStream(); @@ -149,16 +118,7 @@ namespace BizHawk.Emulation.Computers.Commodore64 private void SetupMemoryDomains() { var domains = new List(1); - domains.Add(new MemoryDomain("System Bus", 0x10000, Endian.Little, new Func(PeekMemoryInt), new Action(PokeMemoryInt))); - domains.Add(new MemoryDomain("RAM", 0x10000, Endian.Little, new Func(PeekRAM), new Action(PokeRAM))); - domains.Add(new MemoryDomain("CIA0", 0x10, Endian.Little, new Func(PeekCia0), new Action(PokeCia0))); - domains.Add(new MemoryDomain("CIA1", 0x10, Endian.Little, new Func(PeekCia1), new Action(PokeCia1))); - domains.Add(new MemoryDomain("SID", 0x20, Endian.Little, new Func(PeekSid), new Action(PokeSid))); - domains.Add(new MemoryDomain("VIC", 0x40, Endian.Little, new Func(PeekVic), new Action(PokeVic))); - domains.Add(new MemoryDomain("CRAM", 0x400, Endian.Little, new Func(PeekColorRAM), new Action(PokeColorRAM))); - domains.Add(new MemoryDomain("DISKRAM", 0x10000, Endian.Little, new Func(PeekDiskDrive), new Action(PokeDiskDrive))); - domains.Add(new MemoryDomain("DISKVIA0", 0x10, Endian.Little, new Func(PeekVia0), new Action(PokeVia0))); - domains.Add(new MemoryDomain("DISKVIA1", 0x10, Endian.Little, new Func(PeekVia1), new Action(PokeVia1))); + domains.Add(new MemoryDomain("System Bus", 0x10000, Endian.Little, new Func(Peek), new Action(Poke))); memoryDomains = domains.AsReadOnly(); } } diff --git a/BizHawk.Emulation/Computers/Commodore64/Cartridge.cs b/BizHawk.Emulation/Computers/Commodore64/Cartridge.cs deleted file mode 100644 index f165856464..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/Cartridge.cs +++ /dev/null @@ -1,199 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public class CartridgeChip - { - public int address; - public int bank; - public byte[] data; - public ushort romMask; - public int type; - } - - public partial class Cartridge : IMedia - { - public Func Read; - public Func ReadPort; - public Action WritePort; - - public List chips; - public bool exRomPin; - public bool gamePin; - public CartridgeChip selectedChip; - public int type; - public bool valid; - public int version; - - private bool loaded; - private Memory mem; - - public Cartridge(byte[] rom, Memory memory) - { - mem = memory; - chips = new List(); - - if (rom.Length >= 0x50) - { - MemoryStream source = new MemoryStream(rom); - BinaryReader reader = new BinaryReader(source); - string idString; - - // note: cartridge files store values big-endian. - - idString = new string(reader.ReadChars(16)); - if (idString == "C64 CARTRIDGE ") - { - int headerLength = 0; - headerLength = reader.ReadByte(); - headerLength <<= 8; - headerLength |= reader.ReadByte(); - headerLength <<= 8; - headerLength |= reader.ReadByte(); - headerLength <<= 8; - headerLength |= reader.ReadByte(); - - version = reader.ReadByte(); - version <<= 8; - version |= reader.ReadByte(); - - type = reader.ReadByte(); - type <<= 8; - type |= reader.ReadByte(); - - if (type != 0x0000) - { - // the emulator does not support anything other than type 0 right now - valid = false; - return; - } - - exRomPin = (reader.ReadByte() == 1); - gamePin = (reader.ReadByte() == 1); - - reader.ReadBytes(6); // reserved - reader.ReadBytes(32); // name - - // skip the rest, don't need this info - if (headerLength > 0x40) - { - reader.ReadBytes(headerLength - 0x40); - } - - while (source.Position < rom.Length) - { - string chipID = new string(reader.ReadChars(4)); - - if (chipID == "CHIP") - { - CartridgeChip chip = new CartridgeChip(); - - int packetLength; - packetLength = reader.ReadByte(); - packetLength <<= 8; - packetLength |= reader.ReadByte(); - packetLength <<= 8; - packetLength |= reader.ReadByte(); - packetLength <<= 8; - packetLength |= reader.ReadByte(); - packetLength -= 16; - - chip.type = reader.ReadByte(); - chip.type <<= 8; - chip.type |= reader.ReadByte(); - - chip.bank = reader.ReadByte(); - chip.bank <<= 8; - chip.bank |= reader.ReadByte(); - - chip.address = reader.ReadByte(); - chip.address <<= 8; - chip.address |= reader.ReadByte(); - - int size; - size = reader.ReadByte(); - size <<= 8; - size |= reader.ReadByte(); - - chip.data = reader.ReadBytes(size); - chip.romMask = (ushort)(size - 1); - - packetLength -= size; - if (packetLength > 0) - { - // discard extra bytes - reader.ReadBytes(packetLength); - } - - chips.Add(chip); - } - else - { - break; - } - } - - valid = (chips.Count > 0); - - if (valid) - UpdateMapper(); - } - reader.Close(); - source.Dispose(); - } - } - - public void Apply() - { - mem.cart = this; - UpdateRomPins(); - loaded = true; - } - - public bool Loaded() - { - return loaded; - } - - private byte ReadDummy(ushort addr) - { - return 0; - } - - public bool Ready() - { - return true; - } - - private void UpdateMapper() - { - Read = ReadDummy; - ReadPort = ReadDummy; - WritePort = WriteDummy; - - switch (type) - { - case 0x0000: - Read = Read0000; - ReadPort = ReadPort0000; - WritePort = WritePort0000; - break; - } - } - - private void UpdateRomPins() - { - mem.exRomPin = exRomPin; - mem.gamePin = gamePin; - mem.UpdateLayout(); - } - - private void WriteDummy(ushort addr, byte val) - { - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/CartridgeMappers.cs b/BizHawk.Emulation/Computers/Commodore64/CartridgeMappers.cs deleted file mode 100644 index 25c22f7ede..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/CartridgeMappers.cs +++ /dev/null @@ -1,419 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class Cartridge : IMedia - { - public int bank; - - private byte Read0000(ushort addr) - { - // standard cart, no banking - CartridgeChip currentChip = chips[0]; - return currentChip.data[addr & currentChip.romMask]; - } - - private byte Read0001(ushort addr) - { - return 0; - } - - private byte Read0002(ushort addr) - { - return 0; - } - - private byte Read0003(ushort addr) - { - return 0; - } - - private byte Read0004(ushort addr) - { - return 0; - } - - private byte Read0005(ushort addr) - { - return 0; - } - - private byte Read0006(ushort addr) - { - return 0; - } - - private byte Read0007(ushort addr) - { - return 0; - } - - private byte Read0008(ushort addr) - { - return 0; - } - - private byte Read0009(ushort addr) - { - return 0; - } - - private byte Read000A(ushort addr) - { - return 0; - } - - private byte Read000B(ushort addr) - { - return 0; - } - - private byte Read000C(ushort addr) - { - return 0; - } - - private byte Read000D(ushort addr) - { - return 0; - } - - private byte Read000E(ushort addr) - { - return 0; - } - - private byte Read000F(ushort addr) - { - return 0; - } - - private byte Read0010(ushort addr) - { - return 0; - } - - private byte Read0011(ushort addr) - { - return 0; - } - - private byte Read0012(ushort addr) - { - return 0; - } - - private byte Read0013(ushort addr) - { - - return 0; - } - - private byte Read0014(ushort addr) - { - return 0; - } - - private byte Read0015(ushort addr) - { - return 0; - } - - private byte Read0016(ushort addr) - { - return 0; - } - - private byte Read0017(ushort addr) - { - return 0; - } - - private byte Read0018(ushort addr) - { - return 0; - } - - private byte Read0019(ushort addr) - { - return 0; - } - - private byte Read001A(ushort addr) - { - return 0; - } - - private byte Read001B(ushort addr) - { - return 0; - } - - private byte ReadPort0000(ushort addr) - { - return 0; - } - - private byte ReadPort0001(ushort addr) - { - return 0; - } - - private byte ReadPort0002(ushort addr) - { - return 0; - } - - private byte ReadPort0003(ushort addr) - { - return 0; - } - - private byte ReadPort0004(ushort addr) - { - return 0; - } - - private byte ReadPort0005(ushort addr) - { - return 0; - } - - private byte ReadPort0006(ushort addr) - { - return 0; - } - - private byte ReadPort0007(ushort addr) - { - return 0; - } - - private byte ReadPort0008(ushort addr) - { - return 0; - } - - private byte ReadPort0009(ushort addr) - { - return 0; - } - - private byte ReadPort000A(ushort addr) - { - return 0; - } - - private byte ReadPort000B(ushort addr) - { - return 0; - } - - private byte ReadPort000C(ushort addr) - { - return 0; - } - - private byte ReadPort000D(ushort addr) - { - return 0; - } - - private byte ReadPort000E(ushort addr) - { - return 0; - } - - private byte ReadPort000F(ushort addr) - { - return 0; - } - - private byte ReadPort0010(ushort addr) - { - return 0; - } - - private byte ReadPort0011(ushort addr) - { - return 0; - } - - private byte ReadPort0012(ushort addr) - { - return 0; - } - - private byte ReadPort0013(ushort addr) - { - return 0; - } - - private byte ReadPort0014(ushort addr) - { - return 0; - } - - private byte ReadPort0015(ushort addr) - { - return 0; - } - - private byte ReadPort0016(ushort addr) - { - return 0; - } - - private byte ReadPort0017(ushort addr) - { - return 0; - } - - private byte ReadPort0018(ushort addr) - { - return 0; - } - - private byte ReadPort0019(ushort addr) - { - return 0; - } - - private byte ReadPort001A(ushort addr) - { - return 0; - } - - private byte ReadPort001B(ushort addr) - { - return 0; - } - - private void WritePort0000(ushort addr, byte val) - { - } - - private void WritePort0001(ushort addr, byte val) - { - } - - private void WritePort0002(ushort addr, byte val) - { - } - - private void WritePort0003(ushort addr, byte val) - { - } - - private void WritePort0004(ushort addr, byte val) - { - } - - private void WritePort0005(ushort addr, byte val) - { - } - - private void WritePort0006(ushort addr, byte val) - { - } - - private void WritePort0007(ushort addr, byte val) - { - } - - private void WritePort0008(ushort addr, byte val) - { - } - - private void WritePort0009(ushort addr, byte val) - { - } - - private void WritePort000A(ushort addr, byte val) - { - } - - private void WritePort000B(ushort addr, byte val) - { - } - - private void WritePort000C(ushort addr, byte val) - { - } - - private void WritePort000D(ushort addr, byte val) - { - } - - private void WritePort000E(ushort addr, byte val) - { - } - - private void WritePort000F(ushort addr, byte val) - { - } - - private void WritePort0010(ushort addr, byte val) - { - } - - private void WritePort0011(ushort addr, byte val) - { - } - - private void WritePort0012(ushort addr, byte val) - { - } - - private void WritePort0013(ushort addr, byte val) - { - bank = (val & 0x7F) % chips.Count; - if ((bank & 0x80) != 0x00) - { - exRomPin = false; - gamePin = false; - } - else - { - exRomPin = true; - gamePin = false; - } - UpdateRomPins(); - } - - private void WritePort0014(ushort addr, byte val) - { - } - - private void WritePort0015(ushort addr, byte val) - { - } - - private void WritePort0016(ushort addr, byte val) - { - } - - private void WritePort0017(ushort addr, byte val) - { - } - - private void WritePort0018(ushort addr, byte val) - { - } - - private void WritePort0019(ushort addr, byte val) - { - } - - private void WritePort001A(ushort addr, byte val) - { - } - - private void WritePort001B(ushort addr, byte val) - { - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/Cia.cs b/BizHawk.Emulation/Computers/Commodore64/Cia.cs deleted file mode 100644 index 2f2b69f7a0..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/Cia.cs +++ /dev/null @@ -1,652 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public class CiaRegs - { - public bool ALARM; // alarm enabled - public int ALARM10; // alarm 10ths of a second - public int ALARMHR; // alarm hours - public int ALARMMIN; // alarm minutes - public bool ALARMPM; // alarm AM/PM - public int ALARMSEC; // alarm seconds - public bool CNT; // external counter bit input - public bool EIALARM; // enable alarm interrupt (internal) - public bool EIFLG; // enable flag pin interrupt (internal) - public bool EISP; // enable shift register interrupt (internal) - public bool[] EIT = new bool[2]; // enable timer interrupt (internal) - public bool FLG; // external flag bit input - public bool IALARM; // alarm interrupt triggered - public bool IFLG; // interrupt triggered on FLAG pin - public int[] INMODE = new int[2]; // timer input mode - public bool IRQ; // interrupt triggered - public bool ISP; // shift register interrupt - public bool[] IT = new bool[2]; // timer interrupt - public bool[] LOAD = new bool[2]; // force load timer - public bool[] OUTMODE = new bool[2]; // timer output mode - public bool[] PBON = new bool[2]; // port bit modify on - public bool[] RUNMODE = new bool[2]; // running mode - public int SDR; // serial shift register - public int SDRCOUNT; // serial shift register bit count - public bool SPMODE; // shift register mode - public bool[] START = new bool[2]; // timer enabled - public int[] T = new int[2]; // timer counter - public bool[] TICK = new bool[2]; // execute timer tick - public int[] TLATCH = new int[2]; // timer latch (internal) - public int TOD10; // time of day 10ths of a second - public bool TODIN; // time of day/alarm set - public int TODHR; // time of day hour - public int TODMIN; // time of day minute - public bool TODPM; // time of day AM/PM - public bool TODREADLATCH; // read latch (internal) - public int TODREADLATCH10; // tod read latch (internal) - public int TODREADLATCHSEC; // tod read latch (internal) - public int TODREADLATCHMIN; // tod read latch (internal) - public int TODREADLATCHHR; // tod read latch (internal) - public int TODSEC; // time of day seconds - - public DataPortBus[] ports; - - public DataPortConnector[] connectors; - - public CiaRegs() - { - ports = new DataPortBus[2]; - ports[0] = new DataPortBus(); - ports[1] = new DataPortBus(); - connectors = new DataPortConnector[2]; - connectors[0] = ports[0].Connect(); - connectors[1] = ports[1].Connect(); - HardReset(); - } - - public byte this[int addr] - { - get - { - // value of open bits - int result = 0x00; - - addr &= 0x0F; - switch (addr) - { - case 0x00: - result = connectors[0].Data; - break; - case 0x01: - result = connectors[1].Data; - break; - case 0x02: - result = connectors[0].Direction; - break; - case 0x03: - result = connectors[1].Direction; - break; - case 0x04: - result = (T[0] & 0xFF); - break; - case 0x05: - result = ((T[0] >> 8) & 0xFF); - break; - case 0x06: - result = (T[1] & 0xFF); - break; - case 0x07: - result = ((T[1] >> 8) & 0xFF); - break; - case 0x08: - result |= (TOD10 & 0x0F); - break; - case 0x09: - result &= 0x80; - result |= (TODSEC & 0x7F); - break; - case 0x0A: - result &= 0x80; - result |= (TODMIN & 0x7F); - break; - case 0x0B: - result &= 0x40; - result |= ((TODHR & 0x3F) | (TODPM ? 0x80 : 0x00)); - break; - case 0x0C: - result = SDR; - break; - case 0x0D: - result &= 0x9F; - result |= (IT[0] ? 0x01 : 0x00); - result |= (IT[1] ? 0x02 : 0x00); - result |= (IALARM ? 0x04 : 0x00); - result |= (ISP ? 0x08 : 0x00); - result |= (IFLG ? 0x10 : 0x00); - result |= (IRQ ? 0x80 : 0x00); - break; - case 0x0E: - result = (START[0] ? 0x01 : 0x00); - result = (PBON[0] ? 0x02 : 0x00); - result = (OUTMODE[0] ? 0x04 : 0x00); - result = (RUNMODE[0] ? 0x08 : 0x00); - result = (LOAD[0] ? 0x10 : 0x00); - result = ((INMODE[0] & 0x01) << 5); - result = (SPMODE ? 0x40 : 0x00); - result = (TODIN ? 0x80 : 0x00); - break; - case 0x0F: - result = (START[1] ? 0x01 : 0x00); - result = (PBON[1] ? 0x02 : 0x00); - result = (OUTMODE[1] ? 0x04 : 0x00); - result = (RUNMODE[1] ? 0x08 : 0x00); - result = (LOAD[1] ? 0x10 : 0x00); - result = ((INMODE[1] & 0x03) << 5); - result = (ALARM ? 0x80 : 0x00); - break; - } - - return (byte)(result & 0xFF); - } - - set - { - byte val = value; - addr &= 0x0F; - switch (addr) - { - case 0x00: - connectors[0].Data = val; - break; - case 0x01: - connectors[1].Data = val; - break; - case 0x02: - connectors[0].Direction = val; - break; - case 0x03: - connectors[1].Direction = val; - break; - case 0x04: - T[0] &= 0xFF00; - T[0] |= val; - break; - case 0x05: - T[0] &= 0x00FF; - T[0] |= ((int)val << 8); - break; - case 0x06: - T[1] &= 0xFF00; - T[1] |= val; - break; - case 0x07: - T[1] &= 0x00FF; - T[1] |= ((int)val << 8); - break; - case 0x08: - TOD10 = val & 0x0F; - break; - case 0x09: - TODSEC = val & 0x7F; - break; - case 0x0A: - TODMIN = val & 0x7F; - break; - case 0x0B: - val &= 0x9F; - TODHR = val; - TODPM = ((val & 0x80) != 0x00); - break; - case 0x0C: - SDR = val; - break; - case 0x0D: - IT[0] = ((val & 0x01) != 0x00); - IT[1] = ((val & 0x02) != 0x00); - IALARM = ((val & 0x04) != 0x00); - ISP = ((val & 0x08) != 0x00); - IFLG = ((val & 0x10) != 0x00); - IRQ = ((val & 0x80) != 0x00); - break; - case 0x0E: - START[0] = ((val & 0x01) != 0x00); - PBON[0] = ((val & 0x02) != 0x00); - OUTMODE[0] = ((val & 0x04) != 0x00); - RUNMODE[0] = ((val & 0x08) != 0x00); - LOAD[0] = ((val & 0x10) != 0x00); - INMODE[0] = ((val & 0x20) >> 5); - SPMODE = ((val & 0x40) != 0x00); - TODIN = ((val & 0x80) != 0x00); - break; - case 0x0F: - START[1] = ((val & 0x01) != 0x00); - PBON[1] = ((val & 0x02) != 0x00); - OUTMODE[1] = ((val & 0x04) != 0x00); - RUNMODE[1] = ((val & 0x08) != 0x00); - LOAD[1] = ((val & 0x10) != 0x00); - INMODE[1] = ((val & 0x60) >> 5); - ALARM = ((val & 0x80) != 0x00); - break; - } - } - } - - public void HardReset() - { - // power on state - for (int i = 0; i < 0x10; i++) - this[i] = 0x00; - - TLATCH[0] = 0xFFFF; - TLATCH[1] = 0xFFFF; - T[0] = TLATCH[0]; - T[1] = TLATCH[1]; - - this[0x0B] = 0x01; - - connectors[0].Latch = 0xFF; - connectors[1].Latch = 0xFF; - connectors[0].Direction = 0xFF; - connectors[1].Direction = 0xFF; - } - } - - public partial class Cia - { - public int intMask; - public bool lastCNT; - public byte[] outputBitMask = new byte[] { 0x40, 0x80 }; - private CiaRegs regs = new CiaRegs(); - public int todCounter; - public int todFrequency; - public bool[] underflow; - - public Func ReadSerial; - public Action WriteSerial; - - public Cia(Region newRegion) - { - ReadSerial = ReadSerialDummy; - WriteSerial = WriteSerialDummy; - switch (newRegion) - { - case Region.NTSC: - todFrequency = 14318181 / 14 / 10; - break; - case Region.PAL: - todFrequency = 14318181 / 18 / 10; - break; - } - HardReset(); - } - - private void AdvanceTOD() - { - bool overflow; - int tenths = regs.TOD10; - int seconds = regs.TODSEC; - int minutes = regs.TODMIN; - int hours = regs.TODHR; - bool ampm = regs.TODPM; - todCounter = todFrequency; - - tenths = BCDAdd(tenths, 1, out overflow); - if (tenths >= 10) - { - tenths = 0; - seconds = BCDAdd(seconds, 1, out overflow); - if (overflow) - { - seconds = 0; - minutes = BCDAdd(minutes, 1, out overflow); - if (overflow) - { - minutes = 0; - hours = BCDAdd(hours, 1, out overflow); - if (hours > 12) - { - hours = 1; - ampm = !ampm; - } - } - } - } - - regs.TOD10 = tenths; - regs.TODSEC = seconds; - regs.TODMIN = minutes; - regs.TODHR = hours; - regs.TODPM = ampm; - } - - public void AttachWriteHook(int index, Action act) - { - regs.ports[index].AttachWriteHook(act); - } - - private int BCDAdd(int i, int j, out bool overflow) - { - int lo; - int hi; - int result; - - lo = (i & 0x0F) + (j & 0x0F); - hi = (i & 0x70) + (j & 0x70); - if (lo > 0x09) - { - hi += 0x10; - lo += 0x06; - } - if (hi > 0x50) - { - hi += 0xA0; - } - overflow = hi >= 0x60; - result = (hi & 0x70) + (lo & 0x0F); - return result; - } - - public DataPortConnector ConnectPort(int index) - { - return regs.ports[index].Connect(); - } - - public DataPortConnector ConnectSerialPort(int index) - { - DataPortConnector result = regs.ports[index].Connect(); - regs.ports[index].AttachInputConverter(result, new DataPortSerialInputConverter()); - regs.ports[index].AttachOutputConverter(result, new DataPortSerialOutputConverter()); - return result; - } - - public void HardReset() - { - regs.HardReset(); - underflow = new bool[2]; - todCounter = todFrequency; - } - - public bool IRQ - { - get - { - return regs.IRQ; - } - } - - public byte Peek(int addr) - { - addr &= 0xF; - return regs[addr]; - } - - public void PerformCycle() - { - // process time of day counter - todCounter--; - if (todCounter <= 0) - AdvanceTOD(); - - for (int i = 0; i < 2; i++) - { - if (regs.START[i]) - { - TimerTick(i); - if (regs.PBON[i]) - { - // output the clock data to port B - - if (regs.OUTMODE[i]) - { - // clear bit if set - regs[0x01] &= (byte)~outputBitMask[i]; - } - if (underflow[i]) - { - if (regs.OUTMODE[i]) - { - // toggle bit - regs[0x01] ^= outputBitMask[i]; - } - else - { - // set for a cycle - regs[0x01] |= outputBitMask[i]; - } - } - } - } - } - - lastCNT = regs.CNT; - regs.CNT = false; - UpdateInterrupt(); - } - - public void Poke(int addr, byte val) - { - addr &= 0xF; - regs[addr] = val; - } - - public byte Read(ushort addr) - { - byte result; - addr &= 0xF; - - switch (addr) - { - case 0x08: - regs.TODREADLATCH = false; - return (byte)regs.TODREADLATCH10; - case 0x09: - if (!regs.TODREADLATCH) - return regs[addr]; - else - return (byte)regs.TODREADLATCHSEC; - case 0x0A: - if (!regs.TODREADLATCH) - return regs[addr]; - else - return (byte)regs.TODREADLATCHMIN; - case 0x0B: - regs.TODREADLATCH = true; - regs.TODREADLATCH10 = regs.TOD10; - regs.TODREADLATCHSEC = regs.TODSEC; - regs.TODREADLATCHMIN = regs.TODMIN; - regs.TODREADLATCHHR = regs.TODHR; - return (byte)regs.TODREADLATCHHR; - case 0x0D: - // reading this reg clears it - result = regs[0x0D]; - regs[0x0D] = 0x00; - UpdateInterrupt(); - return result; - default: - return regs[addr]; - } - } - - private bool ReadSerialDummy() - { - return false; - } - - public void TimerDec(int index) - { - int timer = regs.T[index]; - timer--; - if (timer < 0) - { - underflow[index] = true; - if (regs.RUNMODE[index]) - { - // one shot timer - regs.START[index] = false; - } - timer = regs.TLATCH[index]; - } - else - { - underflow[index] = false; - } - - regs.IT[index] |= underflow[index]; - regs.T[index] = timer & 0xFFFF; - } - - public void TimerTick(int index) - { - switch (regs.INMODE[index]) - { - case 0: - regs.TICK[index] = true; - break; - case 1: - regs.TICK[index] |= (regs.CNT && !lastCNT); - break; - case 2: - regs.TICK[index] |= underflow[0]; - break; - case 3: - regs.TICK[index] |= (regs.CNT && !lastCNT) || underflow[0]; - break; - } - if (regs.TICK[index]) - { - TimerDec(index); - regs.TICK[index] = false; - } - } - - public void UpdateInterrupt() - { - bool irq = false; - irq |= (regs.EIT[0] & regs.IT[0]); - irq |= (regs.EIT[1] & regs.IT[1]); - irq |= (regs.EIFLG & regs.IFLG); - irq |= (regs.EISP & regs.ISP); - irq |= (regs.EIALARM & regs.IALARM); - regs.IRQ = irq; - } - - public void Write(ushort addr, byte val) - { - addr &= 0xF; - switch (addr) - { - case 0x04: - regs.TLATCH[0] &= 0xFF00; - regs.TLATCH[0] |= val; - if (regs.LOAD[0]) - regs.T[0] = regs.TLATCH[0]; - break; - case 0x05: - regs.TLATCH[0] &= 0xFF; - regs.TLATCH[0] |= (int)val << 8; - if (regs.LOAD[0] || !regs.START[0]) - regs.T[0] = regs.TLATCH[0]; - break; - case 0x06: - regs.TLATCH[1] &= 0xFF00; - regs.TLATCH[1] |= val; - if (regs.LOAD[1]) - regs.T[1] = regs.TLATCH[1]; - break; - case 0x07: - regs.TLATCH[1] &= 0xFF; - regs.TLATCH[1] |= (int)val << 8; - if (regs.LOAD[1] || !regs.START[1]) - regs.T[1] = regs.TLATCH[1]; - break; - case 0x08: - if (regs.ALARM) - regs.ALARM10 = val & 0x0F; - else - regs[addr] = val; - break; - case 0x09: - if (regs.ALARM) - regs.ALARMSEC = val & 0x7F; - else - regs[addr] = val; - break; - case 0x0A: - if (regs.ALARM) - regs.ALARMMIN = val & 0x7F; - else - regs[addr] = val; - break; - case 0x0B: - if (regs.ALARM) - { - regs.ALARMHR = val & 0x1F; - regs.ALARMPM = ((val & 0x80) != 0x00); - } - else - { - regs[addr] = val; - } - break; - case 0x0D: - intMask &= ~val; - if ((val & 0x80) != 0x00) - intMask ^= val; - regs.EIT[0] = ((intMask & 0x01) != 0x00); - regs.EIT[1] = ((intMask & 0x02) != 0x00); - regs.EIALARM = ((intMask & 0x04) != 0x00); - regs.EISP = ((intMask & 0x08) != 0x00); - regs.EIFLG = ((intMask & 0x10) != 0x00); - UpdateInterrupt(); - break; - default: - regs[addr] = val; - break; - } - - } - - public void WriteCNT(bool val) - { - if (!lastCNT && val) - { - if (!regs.SPMODE) - { - // read bit into shift register - bool inputBit = ReadSerial(); - regs.SDR = ((regs.SDR << 1) | (inputBit ? 0x01 : 0x00)) & 0xFF; - - regs.SDRCOUNT = (regs.SDRCOUNT - 1) & 0x7; - if (regs.SDRCOUNT == 0) - { - regs.ISP = true; - } - } - else - { - // write bit out from shift register - bool outputBit = ((regs.SDR & 0x01) != 0); - regs.SDR >>= 1; - WriteSerial(outputBit); - - regs.SDRCOUNT = (regs.SDRCOUNT - 1) & 0x7; - if (regs.SDRCOUNT == 0) - { - regs.ISP = true; - } - } - } - regs.CNT = val; - } - - public void WriteFLG(bool val) - { - regs.FLG = val; - regs.IFLG |= val; - } - - private void WriteSerialDummy(bool val) - { - // do nothing - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/CiaState.cs b/BizHawk.Emulation/Computers/Commodore64/CiaState.cs deleted file mode 100644 index 35ff24310e..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/CiaState.cs +++ /dev/null @@ -1,89 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class Cia - { - public void SyncState(Serializer ser) - { - ser.Sync("ALARM", ref regs.ALARM); - ser.Sync("ALARM10", ref regs.ALARM10); - ser.Sync("ALARMHR", ref regs.ALARMHR); - ser.Sync("ALARMMIN", ref regs.ALARMMIN); - ser.Sync("ALARMPM", ref regs.ALARMPM); - ser.Sync("ALARMSEC", ref regs.ALARMSEC); - ser.Sync("CNT", ref regs.CNT); - ser.Sync("EIALARM", ref regs.EIALARM); - ser.Sync("EIFLG", ref regs.EIFLG); - ser.Sync("EISP", ref regs.EISP); - ser.Sync("EIT0", ref regs.EIT[0]); - ser.Sync("EIT1", ref regs.EIT[1]); - ser.Sync("FLG", ref regs.FLG); - ser.Sync("IALARM", ref regs.IALARM); - ser.Sync("IFLG", ref regs.IFLG); - ser.Sync("INMODE0", ref regs.INMODE[0]); - ser.Sync("INMODE1", ref regs.INMODE[1]); - ser.Sync("IRQ", ref regs.IRQ); - ser.Sync("ISP", ref regs.ISP); - ser.Sync("IT0", ref regs.IT[0]); - ser.Sync("IT1", ref regs.IT[1]); - ser.Sync("LOAD0", ref regs.LOAD[0]); - ser.Sync("LOAD1", ref regs.LOAD[1]); - ser.Sync("OUTMODE0", ref regs.OUTMODE[0]); - ser.Sync("OUTMODE1", ref regs.OUTMODE[1]); - ser.Sync("PBON0", ref regs.PBON[0]); - ser.Sync("PBON1", ref regs.PBON[1]); - ser.Sync("RUNMODE0", ref regs.RUNMODE[0]); - ser.Sync("RUNMODE1", ref regs.RUNMODE[1]); - ser.Sync("SDR", ref regs.SDR); - ser.Sync("SDRCOUNT", ref regs.SDRCOUNT); - ser.Sync("SPMODE", ref regs.SPMODE); - ser.Sync("START0", ref regs.START[0]); - ser.Sync("START1", ref regs.START[1]); - ser.Sync("T0", ref regs.T[0]); - ser.Sync("T1", ref regs.T[1]); - ser.Sync("TICK0", ref regs.TICK[0]); - ser.Sync("TICK1", ref regs.TICK[1]); - ser.Sync("TLATCH0", ref regs.TLATCH[0]); - ser.Sync("TLATCH1", ref regs.TLATCH[1]); - ser.Sync("TOD10", ref regs.TOD10); - ser.Sync("TODHR", ref regs.TODHR); - ser.Sync("TODMIN", ref regs.TODMIN); - ser.Sync("TODPM", ref regs.TODPM); - ser.Sync("TODREADLATCH", ref regs.TODREADLATCH); - ser.Sync("TODREADLATCH10", ref regs.TODREADLATCH10); - ser.Sync("TODREADLATCHSEC", ref regs.TODREADLATCHSEC); - ser.Sync("TODREADLATCHMIN", ref regs.TODREADLATCHMIN); - ser.Sync("TODREADLATCHHR", ref regs.TODREADLATCHHR); - ser.Sync("TODSEC", ref regs.TODSEC); - - // ports - byte dir0 = regs.connectors[0].Direction; - byte dir1 = regs.connectors[1].Direction; - byte latch0 = regs.connectors[0].Latch; - byte latch1 = regs.connectors[0].Latch; - ser.Sync("DIR0", ref dir0); - ser.Sync("DIR1", ref dir1); - ser.Sync("PORT0", ref latch0); - ser.Sync("PORT1", ref latch1); - if (ser.IsReader) - { - regs.connectors[0].Direction = dir0; - regs.connectors[0].Latch = latch0; - regs.connectors[1].Direction = dir1; - regs.connectors[1].Latch = latch1; - } - - // state - ser.Sync("INTMASK", ref intMask); - ser.Sync("LASTCNT", ref lastCNT); - ser.Sync("TODCOUNTER", ref todCounter); - ser.Sync("TODFREQUENCY", ref todFrequency); - ser.Sync("UNDERFLOW0", ref underflow[0]); - ser.Sync("UNDERFLOW1", ref underflow[1]); - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/DataPort.cs b/BizHawk.Emulation/Computers/Commodore64/DataPort.cs deleted file mode 100644 index 5fb52a32ba..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/DataPort.cs +++ /dev/null @@ -1,371 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public class DataPortBus - { - protected bool[] connected = new bool[2]; - protected DataPortConnector[] connectors; - protected byte[] direction = new byte[2]; - protected DataPortConverter[] inputConverters; - protected byte[] latch = new byte[2]; - protected DataPortConverter[] outputConverters; - protected List servingHooks = new List(); - protected List writeHooks = new List(); - - public DataPortBus() - { - inputConverters = new DataPortConverter[2]; - inputConverters[0] = new DataPortConverter(); - inputConverters[1] = new DataPortConverter(); - outputConverters = new DataPortConverter[2]; - outputConverters[0] = new DataPortConverter(); - outputConverters[1] = new DataPortConverter(); - connectors = new DataPortConnector[2]; - connectors[0] = new DataPortConnector(ReadData0, ReadDirection0, ReadLatch0, ReadRemoteLatch0, WriteData0, WriteDirection0, WriteLatch0); - connectors[1] = new DataPortConnector(ReadData1, ReadDirection1, ReadLatch1, ReadRemoteLatch1, WriteData1, WriteDirection1, WriteLatch1); - connected[0] = false; - connected[1] = false; - direction[0] = 0x00; - direction[1] = 0x00; - latch[0] = 0x00; - latch[1] = 0x00; - } - - public void AttachInputConverter(DataPortConnector connector, DataPortConverter converter) - { - if (connector.Equals(connectors[0])) - { - inputConverters[0] = converter; - } - else if (connector.Equals(connectors[1])) - { - inputConverters[1] = converter; - } - } - - public void AttachOutputConverter(DataPortConnector connector, DataPortConverter converter) - { - if (connector.Equals(connectors[0])) - { - outputConverters[0] = converter; - } - else if (connector.Equals(connectors[1])) - { - outputConverters[1] = converter; - } - } - - public void AttachWriteHook(Action act) - { - writeHooks.Add(act); - servingHooks.Add(0); - } - - protected void ClearHooks() - { - int count = servingHooks.Count; - for (int i = 0; i < count; i++) - servingHooks[i]--; - } - - public DataPortConnector Connect() - { - if (!connected[0]) - { - connected[0] = true; - direction[0] = 0xFF; - return connectors[0]; - } - else if (!connected[1]) - { - connected[1] = true; - direction[1] = 0xFF; - return connectors[1]; - } - throw new Exception("Two connections to this bus have already been established.."); - } - - public void Connect(DataPortConnector connection) - { - if (!connected[0]) - { - connected[0] = true; - connectors[0] = connection; - } - else if (!connected[1]) - { - connected[1] = true; - connectors[1] = connection; - } - throw new Exception("Two connections to this bus have already been established.."); - } - - public void Disconnect(DataPortConnector connector) - { - if (connector.Equals(connectors[0])) - { - connected[0] = false; - latch[0] = 0; - direction[0] = 0; - } - else if (connector.Equals(connectors[1])) - { - connected[1] = false; - latch[1] = 0; - direction[1] = 0; - } - } - - protected void ExecuteWriteHooks() - { - int count = servingHooks.Count; - for (int i = 0; i < count; i++) - { - if (servingHooks[i] == 0) - { - servingHooks[i]++; - writeHooks[i](); - } - else - { - servingHooks[i]++; - } - } - ClearHooks(); - } - - protected virtual byte ReadData0() - { - byte result; - if (connected[1]) - result = (byte)((~direction[0] & latch[1]) | (direction[0] & latch[0])); - else - result = latch[0]; - return inputConverters[0].Convert(result, latch[1]); - } - - protected virtual byte ReadData1() - { - byte result; - if (connected[0]) - result = (byte)((~direction[1] & latch[0]) | (direction[1] & latch[1])); - else - result = latch[1]; - return inputConverters[1].Convert(result, latch[0]); - } - - protected virtual byte ReadDirection0() - { - return direction[0]; - } - - protected virtual byte ReadDirection1() - { - return direction[1]; - } - - protected virtual byte ReadLatch0() - { - return latch[0]; - } - - protected virtual byte ReadLatch1() - { - return latch[1]; - } - - protected virtual byte ReadRemoteLatch0() - { - return latch[1]; - } - - protected virtual byte ReadRemoteLatch1() - { - return latch[0]; - } - - protected virtual void WriteData0(byte val) - { - byte result = latch[0]; - result &= (byte)~direction[0]; - result |= (byte)(val & direction[0]); - latch[0] = outputConverters[0].Convert(result, latch[1]); - ExecuteWriteHooks(); - } - - protected virtual void WriteData1(byte val) - { - byte result = latch[1]; - result &= (byte)~direction[1]; - result |= (byte)(val & direction[1]); - latch[1] = outputConverters[1].Convert(result, latch[0]); - ExecuteWriteHooks(); - } - - protected virtual void WriteDirection0(byte val) - { - direction[0] = val; - ExecuteWriteHooks(); - } - - protected virtual void WriteDirection1(byte val) - { - direction[1] = val; - ExecuteWriteHooks(); - } - - protected virtual void WriteLatch0(byte val) - { - latch[0] = val; - } - - protected virtual void WriteLatch1(byte val) - { - latch[1] = val; - } - } - - public class DataPortConnector - { - private Func ReadData; - private Func ReadDirection; - private Func ReadLatch; - private Func ReadRemoteLatch; - private Action WriteData; - private Action WriteDirection; - private Action WriteLatch; - - public DataPortConnector() - { - ReadData = ReadDataDummy; - ReadDirection = ReadDataDummy; - ReadLatch = ReadDataDummy; - ReadRemoteLatch = ReadDataDummy; - WriteData = WriteDataDummy; - WriteDirection = WriteDataDummy; - WriteLatch = WriteDataDummy; - } - - public DataPortConnector(DataPortConnector source) - { - ReadData = source.ReadData; - ReadDirection = source.ReadDirection; - ReadLatch = source.ReadLatch; - ReadRemoteLatch = source.ReadRemoteLatch; - WriteData = source.WriteData; - WriteDirection = source.WriteDirection; - WriteLatch = source.WriteLatch; - } - - public DataPortConnector(Func newReadData, Func newReadDirection, Func newReadLatch, Func newReadRemoteLatch, Action newWriteData, Action newWriteDirection, Action newWriteLatch) - { - ReadData = newReadData; - ReadDirection = newReadDirection; - ReadLatch = newReadLatch; - ReadRemoteLatch = newReadRemoteLatch; - WriteData = newWriteData; - WriteDirection = newWriteDirection; - WriteLatch = newWriteLatch; - } - - public byte Data - { - get - { - return ReadData(); - } - set - { - WriteData(value); - } - } - - public byte Direction - { - get - { - return ReadDirection(); - } - set - { - WriteDirection(value); - } - } - - public byte Latch - { - get - { - return ReadLatch(); - } - set - { - WriteLatch(value); - } - } - - public DataPortListener Listener() - { - return new DataPortListener(ReadData, ReadDirection); - } - - private byte ReadDataDummy() - { - return 0x00; - } - - public byte RemoteLatch - { - get - { - return ReadRemoteLatch(); - } - } - - private void WriteDataDummy(byte val) - { - return; - } - } - - public class DataPortConverter - { - public virtual byte Convert(byte input, byte remote) - { - // the base converter transfers the values directly - return input; - } - } - - public class DataPortListener - { - private Func ReadData; - private Func ReadDirection; - - public DataPortListener(Func newReadData, Func newReadDirection) - { - ReadData = newReadData; - ReadDirection = newReadDirection; - } - - public byte Data - { - get - { - return ReadData(); - } - } - - public byte Direction - { - get - { - return ReadDirection(); - } - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/Input.cs b/BizHawk.Emulation/Computers/Commodore64/Input.cs deleted file mode 100644 index 41c56cff53..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/Input.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public class Input - { - static string[,] keyboardMatrix = new string[,] - { - {"Key Insert/Delete", "Key Return", "Key Cursor Left/Right", "Key F7", "Key F1", "Key F3", "Key F5", "Key Cursor Up/Down"}, - {"Key 3", "Key W", "Key A", "Key 4", "Key Z", "Key S", "Key E", "Key Left Shift"}, - {"Key 5", "Key R", "Key D", "Key 6", "Key C", "Key F", "Key T", "Key X"}, - {"Key 7", "Key Y", "Key G", "Key 8", "Key B", "Key H", "Key U", "Key V"}, - {"Key 9", "Key I", "Key J", "Key 0", "Key M", "Key K", "Key O", "Key N"}, - {"Key Plus", "Key P", "Key L", "Key Minus", "Key Period", "Key Colon", "Key At", "Key Comma"}, - {"Key Pound", "Key Asterisk", "Key Semicolon", "Key Clear/Home", "Key Right Shift", "Key Equal", "Key Up Arrow", "Key Slash"}, - {"Key 1", "Key Left Arrow", "Key Control", "Key 2", "Key Space", "Key Commodore", "Key Q", "Key Run/Stop"} - }; - - static string[,] joystickMatrix = new string[,] - { - {"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Button"}, - {"P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Button"} - }; - - public IController controller; - public bool restorePressed; - - private byte[] joystickLatch = new byte[2]; - private byte keyboardColumnData = 0xFF; - private byte[] keyboardLatch = new byte[8]; - private byte keyboardRowData = 0xFF; - private DataPortConnector[] ports; - - public Input(DataPortConnector[] newPorts) - { - ports = newPorts; - - // set full output - ports[0].Direction = 0xFF; - ports[1].Direction = 0xFF; - } - - private byte GetJoystickBits(int index) - { - byte result = 0xE0; - result |= controller[joystickMatrix[index, 0]] ? (byte)0x00 : (byte)0x01; - result |= controller[joystickMatrix[index, 1]] ? (byte)0x00 : (byte)0x02; - result |= controller[joystickMatrix[index, 2]] ? (byte)0x00 : (byte)0x04; - result |= controller[joystickMatrix[index, 3]] ? (byte)0x00 : (byte)0x08; - result |= controller[joystickMatrix[index, 4]] ? (byte)0x00 : (byte)0x10; - return result; - } - - private byte GetKeyboardBits(int row) - { - byte result; - result = controller[keyboardMatrix[row, 0]] ? (byte)0x00 : (byte)0x01; - result |= controller[keyboardMatrix[row, 1]] ? (byte)0x00 : (byte)0x02; - result |= controller[keyboardMatrix[row, 2]] ? (byte)0x00 : (byte)0x04; - result |= controller[keyboardMatrix[row, 3]] ? (byte)0x00 : (byte)0x08; - result |= controller[keyboardMatrix[row, 4]] ? (byte)0x00 : (byte)0x10; - result |= controller[keyboardMatrix[row, 5]] ? (byte)0x00 : (byte)0x20; - result |= controller[keyboardMatrix[row, 6]] ? (byte)0x00 : (byte)0x40; - result |= controller[keyboardMatrix[row, 7]] ? (byte)0x00 : (byte)0x80; - return result; - } - - public void Poll() - { - restorePressed = controller["Key Restore"]; - - for (int i = 0; i < 2; i++) - joystickLatch[i] = GetJoystickBits(i); - for (int i = 0; i < 8; i++) - keyboardLatch[i] = GetKeyboardBits(i); - UpdatePortData(); - } - - private void UpdatePortData() - { - int keyboardShift = keyboardColumnData; - byte port0result = 0xFF; - byte port1result = 0xFF; - - port0result = (byte)(joystickLatch[1]); - - for (int i = 0; i < 8; i++) - { - if ((keyboardShift & 0x01) == 0x00) - { - port1result &= keyboardLatch[i]; - } - keyboardShift >>= 1; - } - port1result &= joystickLatch[0]; - - ports[0].Data = port0result; - ports[1].Data = port1result; - } - - public void WritePortA() - { - // keyboard matrix column select - keyboardColumnData = ports[0].RemoteLatch; - UpdatePortData(); - } - - public void WritePortB() - { - // keyboard matrix row select - keyboardRowData = ports[1].RemoteLatch; - UpdatePortData(); - } - } -} \ No newline at end of file diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Chip2114.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Chip2114.cs new file mode 100644 index 0000000000..dc94d6aaf8 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Chip2114.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // used as Color RAM in C64 + + public class Chip2114 : IStandardIO + { + private byte[] ram; + + public Chip2114() + { + HardReset(); + } + + public void HardReset() + { + ram = new byte[0x400]; + } + + public byte Peek(int addr) + { + return ram[addr & 0x3FF]; + } + + public byte Peek(int addr, byte bus) + { + return (byte)(ram[addr & 0x3FF] | (bus & 0xF0)); + } + + public void Poke(int addr, byte val) + { + ram[addr & 0x3FF] = (byte)(val & 0xF); + } + + public byte Read(ushort addr) + { + return (byte)(ram[addr & 0x3FF]); + } + + public byte Read(ushort addr, byte bus) + { + return (byte)(ram[addr & 0x3FF] | (bus & 0xF0)); + } + + public void Write(ushort addr, byte val) + { + ram[addr & 0x3FF] = (byte)(val & 0xF); + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Chip23XX.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Chip23XX.cs new file mode 100644 index 0000000000..8d072685fe --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Chip23XX.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // ROM chips + // 2332: 32 kbit (4kbyte) + // 2364: 64 kbit (8kbyte) + // 23128: 128 kbit (16kbyte) + + public enum Chip23XXmodel + { + Chip2332, + Chip2364, + Chip23128 + } + + public class Chip23XX : IStandardIO + { + private uint addrMask; + private byte[] rom; + + public Chip23XX(Chip23XXmodel model, byte[] data) + { + switch (model) + { + case Chip23XXmodel.Chip2332: + rom = new byte[0x1000]; + addrMask = 0xFFF; + break; + case Chip23XXmodel.Chip2364: + rom = new byte[0x2000]; + addrMask = 0x1FFF; + break; + case Chip23XXmodel.Chip23128: + rom = new byte[0x4000]; + addrMask = 0x3FFF; + break; + default: + throw new Exception("Invalid chip model."); + } + Array.Copy(data, rom, rom.Length); + } + + public byte Peek(int addr) + { + return rom[addr & (int)addrMask]; + } + + public void Poke(int addr, byte val) + { + // do nothing (this is rom) + } + + public byte Read(ushort addr) + { + return rom[addr & addrMask]; + } + + public void Write(ushort addr, byte val) + { + // do nothing (this is rom) + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Chip4864.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Chip4864.cs new file mode 100644 index 0000000000..6b52524f5d --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Chip4864.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // DRAM for the c64 + // 4164 = 64 kbit + // 4464 = 256 kbit + // 4864 = 512 kbit + + // for purposes of simplification we'll just + // use one 4864, the C64 can use sets of 4164 or + // 4464 typically + + public class Chip4864 : IStandardIO + { + private byte[] ram; + + public Chip4864() + { + HardReset(); + } + + public void HardReset() + { + ram = new byte[0x10000]; + } + + public byte Peek(int addr) + { + return ram[addr & 0xFFFF]; + } + + public void Poke(int addr, byte val) + { + ram[addr & 0xFFFF] = val; + } + + public byte Read(ushort addr) + { + return ram[addr]; + } + + public void Write(ushort addr, byte val) + { + ram[addr] = val; + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/IStandardIO.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/IStandardIO.cs new file mode 100644 index 0000000000..c7c4647a87 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/IStandardIO.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + public interface IStandardIO + { + byte Peek(int addr); + void Poke(int addr, byte val); + byte Read(ushort addr); + void Write(ushort addr, byte val); + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6510.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6510.cs new file mode 100644 index 0000000000..9d8aee1c80 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6510.cs @@ -0,0 +1,202 @@ +using BizHawk.Emulation.CPUs.M6502; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // an extension of the 6502 processor + + public class MOS6510 : IStandardIO + { + // ------------------------------------ + + private C64Chips chips; + private MOS6502X cpu; + private bool freezeCpu; + private bool pinAEC; + private bool pinCassetteButton; + private bool pinCassetteMotor; + private bool pinCassetteOutput; + private bool pinCharen; + private bool pinIRQ; + private bool pinLoram; + private bool pinHiram; + private bool pinNMI; + private bool pinRDY; + private byte portDir; + + // ------------------------------------ + + public MOS6510(C64Chips newChips) + { + chips = newChips; + cpu = new MOS6502X(); + + // configure cpu r/w + cpu.DummyReadMemory = Read; + cpu.ReadMemory = Read; + cpu.WriteMemory = Write; + + // configure data port defaults + portDir = 0x2F; + SetPortData(0x37); + } + + public void HardReset() + { + cpu.Reset(); + cpu.FlagI = true; + cpu.BCD_Enabled = true; + cpu.PC = (ushort)(chips.pla.Read(0xFFFC) | (chips.pla.Read(0xFFFD) << 8)); + } + + // ------------------------------------ + + public void ExecutePhase1() + { + UpdatePins(); + } + + public void ExecutePhase2() + { + UpdatePins(); + + if (pinAEC && !freezeCpu) + { + // the 6502 core expects active high + // so we reverse the polarity here + cpu.NMI = !pinNMI; + cpu.IRQ = !pinIRQ; + cpu.ExecuteOne(); + } + } + + private void UpdatePins() + { + pinAEC = chips.vic.AEC; + pinIRQ = chips.vic.IRQ && chips.cia0.IRQ; + pinNMI = chips.cia1.IRQ; + pinRDY = chips.vic.BA; + + if (pinRDY) + freezeCpu = false; + } + + // ------------------------------------ + + public byte Peek(int addr) + { + if (addr == 0x0000) + return PortDirection; + else if (addr == 0x0001) + return PortData; + else + return chips.pla.Peek(addr); + } + + public void Poke(int addr, byte val) + { + if (addr == 0x0000) + portDir = val; + else if (addr == 0x0001) + SetPortData(val); + else + chips.pla.Poke(addr, val); + } + + public byte Read(ushort addr) + { + // cpu freezes after first read when RDY is low + if (!pinRDY) + freezeCpu = true; + + if (addr == 0x0000) + return PortDirection; + else if (addr == 0x0001) + return PortData; + else + return chips.pla.Read(addr); + } + + public void Write(ushort addr, byte val) + { + if (addr == 0x0000) + PortDirection = val; + else if (addr == 0x0001) + PortData = val; + else + chips.pla.Write(addr, val); + } + + // ------------------------------------ + + public bool AEC + { + get { return pinAEC; } + } + + public bool IRQ + { + get { return pinIRQ; } + } + + public bool NMI + { + get { return pinNMI; } + } + + public bool RDY + { + get { return pinRDY; } + } + + public byte PortData + { + get + { + byte result = 0x00; + + result |= pinLoram ? (byte)0x01 : (byte)0x00; + result |= pinHiram ? (byte)0x02 : (byte)0x00; + result |= pinCharen ? (byte)0x04 : (byte)0x00; + result |= pinCassetteOutput ? (byte)0x08 : (byte)0x00; + result |= pinCassetteButton ? (byte)0x10 : (byte)0x00; + result |= pinCassetteMotor ? (byte)0x20 : (byte)0x00; + + return result; + } + set + { + byte val = Port.CPUWrite(PortData, value, portDir); + SetPortData(val); + } + } + + public byte PortDirection + { + get { return portDir; } + set { portDir = value; } + } + + private void SetPortData(byte val) + { + pinCassetteOutput = ((val & 0x08) != 0); + pinCassetteButton = ((val & 0x10) != 0); + pinCassetteMotor = ((val & 0x20) != 0); + + if (!chips.pla.UltimaxMode) + { + pinLoram = ((val & 0x01) != 0); + pinHiram = ((val & 0x02) != 0); + pinCharen = ((val & 0x04) != 0); + chips.pla.LoRam = pinLoram; + chips.pla.HiRam = pinHiram; + chips.pla.Charen = pinCharen; + } + } + + // ------------------------------------ + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6522.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6522.cs new file mode 100644 index 0000000000..5138b69b57 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6522.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // via + public class MOS6522 : Timer, IStandardIO + { + // ------------------------------------ + + public void ExecutePhase1() + { + } + + public void ExecutePhase2() + { + } + + // ------------------------------------ + + public byte Peek(int addr) + { + return 0; + } + + public void Poke(int addr, byte val) + { + } + + public byte Read(ushort addr) + { + return 0; + } + + public void Write(ushort addr, byte val) + { + } + + // ------------------------------------ + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6526.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6526.cs new file mode 100644 index 0000000000..c21ddc648e --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6526.cs @@ -0,0 +1,342 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // MOS technology 6526 "CIA" + // + // emulation notes: + // * CS, R/W and RS# pins are not emulated. (not needed) + // * A low RES pin is emulated via HardReset(). + + public class MOS6526 : Timer, IStandardIO + { + // ------------------------------------ + + private enum InMode + { + Phase2, + CNT, + TimerAUnderflow, + TimerAUnderflowCNT + } + + private enum OutMode + { + Pulse, + Toggle + } + + private enum RunMode + { + Continuous, + Oneshot + } + + private enum SPMode + { + Input, + Output + } + + // ------------------------------------ + + private bool intAlarm; + private bool intFlag; + private bool intSP; + private bool[] intTimer; + private bool pinCnt; + private bool pinFlag; + private bool pinPC; + private InMode[] timerInMode; + private OutMode[] timerOutMode; + private bool[] timerPortEnable; + private byte[] tod; + private byte[] todAlarm; + private bool todAlarmPM; + private bool todPM; + private uint todCounter; + private uint todCounterLatch; + + // ------------------------------------ + + public MOS6526(Region region) + { + intTimer = new bool[2]; + timerInMode = new InMode[2]; + timerOutMode = new OutMode[2]; + timerPortEnable = new bool[2]; + tod = new byte[4]; + todAlarm = new byte[4]; + switch (region) + { + case Region.NTSC: + todCounterLatch = 14318181 / 140; + break; + case Region.PAL: + todCounterLatch = 17734472 / 180; + break; + } + HardReset(); + } + + // ------------------------------------ + + public void ExecutePhase1() + { + // unsure if the timer actually operates in ph1 + } + + public void ExecutePhase2() + { + pinPC = true; + TimerRun(0); + TimerRun(1); + } + + public void HardReset() + { + HardResetInternal(); + intTimer[0] = false; + intTimer[1] = false; + timerPortEnable[0] = false; + timerPortEnable[1] = false; + timerInMode[0] = InMode.Phase2; + timerInMode[1] = InMode.Phase2; + timerOn[0] = false; + timerOn[1] = false; + timerOutMode[0] = OutMode.Pulse; + timerOutMode[1] = OutMode.Pulse; + tod[0] = 0; + tod[1] = 0; + tod[2] = 0; + tod[3] = 0x12; + todAlarm[0] = 0; + todAlarm[1] = 0; + todAlarm[2] = 0; + todAlarm[3] = 0; + todCounter = todCounterLatch; + pinCnt = false; + pinFlag = true; + pinPC = true; + } + + // ------------------------------------ + + private byte BCDAdd(byte i, byte j, out bool overflow) + { + uint lo; + uint hi; + uint result; + + lo = (i & (uint)0x0F) + (j & (uint)0x0F); + hi = (i & (uint)0x70) + (j & (uint)0x70); + if (lo > 0x09) + { + hi += 0x10; + lo += 0x06; + } + if (hi > 0x50) + { + hi += 0xA0; + } + overflow = hi >= 0x60; + result = (hi & 0x70) + (lo & 0x0F); + return (byte)(result & 0xFF); + } + + private void TimerRun(uint index) + { + + } + + private void TODRun() + { + bool todV; + + if (todCounter == 0) + { + todCounter = todCounterLatch; + tod[0] = BCDAdd(tod[0], 1, out todV); + if (tod[0] >= 10) + { + tod[0] = 0; + tod[1] = BCDAdd(tod[1], 1, out todV); + if (todV) + { + tod[1] = 0; + tod[2] = BCDAdd(tod[2], 1, out todV); + if (todV) + { + tod[2] = 0; + tod[3] = BCDAdd(tod[3], 1, out todV); + if (tod[3] > 12) + { + tod[3] = 1; + } + else if (tod[3] == 12) + { + todPM = !todPM; + } + } + } + } + } + } + + // ------------------------------------ + + public bool CNT + { + get { return pinCnt; } + set { pinCnt = value; } + } + + public bool FLAG + { + get { return pinFlag; } + set + { + if (pinFlag && !value) + intFlag = true; + pinFlag = value; + } + } + + public bool PC + { + get { return pinPC; } + } + + public byte Peek(int addr) + { + return ReadRegister((ushort)(addr & 0xF)); + } + + public void Poke(int addr, byte val) + { + WriteRegister((ushort)(addr & 0xF), val); + } + + public byte Read(ushort addr) + { + addr &= 0xF; + byte val; + + switch (addr) + { + case 0x01: + val = ReadRegister(addr); + pinPC = false; + break; + default: + val = ReadRegister(addr); + break; + } + + return val; + } + + private byte ReadRegister(ushort addr) + { + byte val = 0x00; //unused pin value + + switch (addr) + { + case 0x0: + break; + case 0x1: + break; + case 0x2: + break; + case 0x3: + break; + case 0x4: + break; + case 0x5: + break; + case 0x6: + break; + case 0x7: + break; + case 0x8: + break; + case 0x9: + break; + case 0xA: + break; + case 0xB: + break; + case 0xC: + break; + case 0xD: + break; + case 0xE: + break; + case 0xF: + break; + } + + return val; + } + + public void Write(ushort addr, byte val) + { + addr &= 0xF; + + switch (addr) + { + case 0x1: + WriteRegister(addr, val); + pinPC = false; + break; + default: + WriteRegister(addr, val); + break; + } + } + + public void WriteRegister(ushort addr, byte val) + { + switch (addr) + { + case 0x0: + break; + case 0x1: + break; + case 0x2: + break; + case 0x3: + break; + case 0x4: + break; + case 0x5: + break; + case 0x6: + break; + case 0x7: + break; + case 0x8: + break; + case 0x9: + break; + case 0xA: + break; + case 0xB: + break; + case 0xC: + break; + case 0xD: + break; + case 0xE: + break; + case 0xF: + break; + } + } + + // ------------------------------------ + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6567.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6567.cs new file mode 100644 index 0000000000..85945d6fac --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6567.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // vic ntsc + public class MOS6567 : Vic, IStandardIO + { + static uint[][] pipeline = new uint[5][]; + + public MOS6567(C64Chips newChips) + : base(newChips, 65, 263, pipeline, 14318181 / 14) + { + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6569.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6569.cs new file mode 100644 index 0000000000..64411e1032 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6569.cs @@ -0,0 +1,332 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // vic pal + public class MOS6569 : Vic, IStandardIO + { + static uint[][] pipeline = new uint[][] + { + new uint[] // xposition + { + 0x0194, 0x0198, + 0x019C, 0x01A0, + 0x01A4, 0x01A8, + 0x01AC, 0x01B0, + 0x01B4, 0x01B8, + + 0x01BC, 0x01C0, + 0x01C4, 0x01C8, + 0x01CC, 0x01D0, + 0x01D4, 0x01D8, + 0x01DC, 0x01E0, + + 0x01E4, 0x01E8, + 0x01EC, 0x01F0, + 0x01F4, 0x0000, + 0x0004, 0x0008, + 0x000C, 0x0010, + + 0x0014, 0x0018, + 0x001C, 0x0020, + 0x0024, 0x0028, + 0x002C, 0x0030, + 0x0034, 0x0038, + + 0x003C, 0x0040, + 0x0044, 0x0048, + 0x004C, 0x0050, + 0x0054, 0x0058, + 0x005C, 0x0060, + + 0x0064, 0x0068, + 0x006C, 0x0070, + 0x0074, 0x0078, + 0x007C, 0x0080, + 0x0084, 0x0088, + + 0x008C, 0x0090, + 0x0094, 0x0098, + 0x009C, 0x00A0, + 0x00A4, 0x00A8, + 0x00AC, 0x00B0, + + 0x00B4, 0x00B8, + 0x00BC, 0x00C0, + 0x00C4, 0x00C8, + 0x00CC, 0x00D0, + 0x00D4, 0x00D8, + + 0x00DC, 0x00E0, + 0x00E4, 0x00E8, + 0x00EC, 0x00F0, + 0x00F4, 0x00F8, + 0x00FC, 0x0100, + + 0x0104, 0x0108, + 0x010C, 0x0110, + 0x0114, 0x0118, + 0x011C, 0x0120, + 0x0124, 0x0128, + + 0x012C, 0x0130, + 0x0134, 0x0138, + 0x013C, 0x0140, + 0x0144, 0x0148, + 0x014C, 0x0150, + + 0x0154, 0x0158, + 0x015C, 0x0160, + 0x0164, 0x0168, + 0x016C, 0x0170, + 0x0174, 0x0178, + + 0x017C, 0x0180, + 0x0184, 0x0188, + 0x018C, 0x0190 + }, + new uint[] // fetch (100=ref 200=c 300=g 400=i 500=none) + { + 0x0003, 0x0013, + 0x0023, 0x0033, + 0x0004, 0x0014, + 0x0024, 0x0034, + 0x0005, 0x0015, + + 0x0025, 0x0035, + 0x0006, 0x0016, + 0x0026, 0x0036, + 0x0007, 0x0017, + 0x0027, 0x0037, + + 0x0100, 0x0500, + 0x0100, 0x0500, + 0x0100, 0x0500, + 0x0100, 0x0500, + 0x0100, 0x0200, + + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0200, + 0x0300, 0x0500, + + 0x0400, 0x0500, + 0x0400, 0x0500, + 0x0000, 0x0010, + 0x0020, 0x0030, + 0x0001, 0x0011, + + 0x0021, 0x0031, + 0x0002, 0x0012, + 0x0022, 0x0032 + }, + new uint[] // BA + { + 0x0834, 0x0834, + 0x0345, 0x0345, + 0x0845, 0x0845, + 0x0456, 0x0456, + 0x0856, 0x0856, + + 0x0567, 0x0567, + 0x0867, 0x0867, + 0x0887, 0x0887, + 0x0887, 0x0887, + 0x0000, 0x0000, + + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + 0x1000, 0x1000, + + 0x0880, 0x0880, + 0x0880, 0x0880, + 0x0801, 0x0801, + 0x0012, 0x0012, + 0x0812, 0x0812, + + 0x0123, 0x0123, + 0x0823, 0x0823, + 0x0234, 0x0234 + }, + new uint[] // actions + { + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0, + 0, pipelineUpdateVc, + 0, pipelineChkSprChunch, + + 0, pipelineUpdateMcBase, + 0, pipelineChkBrdL1, + 0, pipelineChkBrdL0, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0, + 0, 0, + pipelineChkSprDma, 0, + + pipelineChkSprDma, pipelineChkBrdR0 | pipelineChkSprExp, + 0, pipelineChkBrdR1, + pipelineChkSprDisp, pipelineUpdateRc, + 0, 0, + 0, 0, + + 0, 0, + 0, 0, + 0, 0 + } + }; + + public MOS6569(C64Chips newChips) + : base(newChips, 63, 312, pipeline, 17734472 / 18) + { + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6581.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6581.cs new file mode 100644 index 0000000000..2dfb88556d --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/MOS6581.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // sid + public class MOS6581 : Sid, IStandardIO + { + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/MOSPLA.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/MOSPLA.cs new file mode 100644 index 0000000000..1052d6eb53 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/MOSPLA.cs @@ -0,0 +1,557 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // emulates the PLA + // which handles all bank switching + + public class MOSPLA : IStandardIO + { + // ------------------------------------ + + private enum PLABank + { + None, + RAM, + BasicROM, + KernalROM, + CharROM, + IO, + CartridgeLo, + CartridgeHi, + Vic, + Sid, + ColorRam, + Cia0, + Cia1, + Expansion0, + Expansion1 + } + + private struct PLACpuMap + { + public PLABank layout1000; + public PLABank layout8000; + public PLABank layoutA000; + public PLABank layoutC000; + public PLABank layoutD000; + public PLABank layoutE000; + } + + // ------------------------------------ + + private byte bus; + private C64Chips chips; + private bool cia0portRead; + private PLACpuMap map; + private bool pinCharen; + private bool pinExRom; + private bool pinGame; + private bool pinHiRam; + private bool pinLoRam; + private bool ultimax; + private Func vicBankPortRead; + + public MOSPLA(C64Chips newChips, FuncnewVicBankPortRead) + { + chips = newChips; + vicBankPortRead = newVicBankPortRead; + } + + public void HardReset() + { + pinCharen = true; + pinExRom = true; + pinGame = true; + pinHiRam = true; + pinLoRam = true; + UpdateMap(); + } + + // ------------------------------------ + + public bool Charen + { + get { return pinCharen; } + set { pinCharen = value; UpdateMap(); } + } + + public bool ExRom + { + get { return pinExRom; } + set { pinExRom = value; UpdateMap(); } + } + + public bool Game + { + get { return pinGame; } + set { pinGame = value; UpdateMap(); } + } + + public bool HiRam + { + get { return pinHiRam; } + set { pinHiRam = value; UpdateMap(); } + } + + public bool InputWasRead + { + get { return cia0portRead; } + set { cia0portRead = value; } + } + + public bool LoRam + { + get { return pinLoRam; } + set { pinLoRam = value; UpdateMap(); } + } + + public bool UltimaxMode + { + get { return ultimax; } + } + + private void UpdateMap() + { + if (ultimax) + return; + + if (pinCharen && pinHiRam && pinLoRam && pinGame && pinExRom) + { + // 11111 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.BasicROM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.IO; + map.layoutE000 = PLABank.KernalROM; + } + else if (!pinCharen && pinHiRam && pinLoRam && pinGame && pinExRom) + { + // 01111 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.BasicROM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.CharROM; + map.layoutE000 = PLABank.KernalROM; + } + else if (pinCharen && !pinHiRam && pinLoRam && pinGame) + { + // 1011X + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.RAM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.IO; + map.layoutE000 = PLABank.RAM; + } + else if (pinCharen && !pinHiRam && pinLoRam && !pinGame && !pinExRom) + { + // 10100 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.RAM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.IO; + map.layoutE000 = PLABank.RAM; + } + else if (!pinCharen && !pinHiRam && pinLoRam && pinGame) + { + // 0011X + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.RAM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.CharROM; + map.layoutE000 = PLABank.RAM; + } + else if (!pinCharen && !pinHiRam && pinLoRam && !pinGame && !pinExRom) + { + // 00100 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.RAM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.RAM; + map.layoutE000 = PLABank.RAM; + } + else if (!pinHiRam && !pinLoRam && pinGame) + { + // X001X + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.RAM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.RAM; + map.layoutE000 = PLABank.RAM; + } + else if (pinCharen && pinHiRam && !pinLoRam && pinGame) + { + // 1101X + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.RAM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.IO; + map.layoutE000 = PLABank.KernalROM; + } + else if (pinCharen && !pinHiRam && !pinLoRam && !pinExRom) + { + // 100X0 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.RAM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.IO; + map.layoutE000 = PLABank.KernalROM; + } + else if (!pinCharen && pinHiRam && !pinLoRam && pinGame) + { + // 0101X + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.RAM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.CharROM; + map.layoutE000 = PLABank.KernalROM; + } + else if (!pinCharen && !pinHiRam && !pinLoRam && !pinExRom) + { + // 000X0 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.RAM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.CharROM; + map.layoutE000 = PLABank.KernalROM; + } + else if (pinCharen && pinHiRam && pinLoRam && pinGame && !pinExRom) + { + // 11110 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.CartridgeLo; + map.layoutA000 = PLABank.BasicROM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.IO; + map.layoutE000 = PLABank.KernalROM; + } + else if (!pinCharen && pinHiRam && pinLoRam && pinGame && !pinExRom) + { + // 01110 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.CartridgeLo; + map.layoutA000 = PLABank.BasicROM; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.CharROM; + map.layoutE000 = PLABank.KernalROM; + } + else if (pinCharen && pinHiRam && !pinLoRam && !pinGame && !pinExRom) + { + // 11000 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.CartridgeHi; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.IO; + map.layoutE000 = PLABank.KernalROM; + } + else if (!pinCharen && pinHiRam && !pinLoRam && !pinGame && !pinExRom) + { + // 01000 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.RAM; + map.layoutA000 = PLABank.CartridgeHi; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.CharROM; + map.layoutE000 = PLABank.KernalROM; + } + else if (pinCharen && pinHiRam && pinLoRam && !pinGame && !pinExRom) + { + // 11100 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.CartridgeLo; + map.layoutA000 = PLABank.CartridgeHi; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.IO; + map.layoutE000 = PLABank.KernalROM; + } + else if (!pinCharen && pinHiRam && pinLoRam && !pinGame && !pinExRom) + { + // 01100 + map.layout1000 = PLABank.RAM; + map.layout8000 = PLABank.CartridgeLo; + map.layoutA000 = PLABank.CartridgeHi; + map.layoutC000 = PLABank.RAM; + map.layoutD000 = PLABank.CharROM; + map.layoutE000 = PLABank.KernalROM; + } + else if (!pinGame && pinExRom) + { + // XXX01 (ultimax) + // once in this mode, it is not supposed to change + map.layout1000 = PLABank.None; + map.layout8000 = PLABank.CartridgeLo; + map.layoutA000 = PLABank.None; + map.layoutC000 = PLABank.None; + map.layoutD000 = PLABank.IO; + map.layoutE000 = PLABank.CartridgeHi; + ultimax = true; + } + else + { + throw new Exception("Memory configuration missing from PLA, fix this!"); + } + } + + // ------------------------------------ + + private PLABank Bank(ushort addr) + { + if (addr < 0x1000) + return PLABank.RAM; + else if (addr >= 0x1000 && addr < 0x8000) + return map.layout1000; + else if (addr >= 0x8000 && addr < 0xA000) + return map.layout8000; + else if (addr >= 0xA000 && addr < 0xC000) + return map.layoutA000; + else if (addr >= 0xC000 && addr < 0xD000) + return map.layoutC000; + else if (addr >= 0xD000 && addr < 0xE000) + { + if (map.layoutD000 == PLABank.IO) + { + if (addr >= 0xD000 && addr < 0xD400) + return PLABank.Vic; + else if (addr >= 0xD400 && addr < 0xD800) + return PLABank.Sid; + else if (addr >= 0xD800 && addr < 0xDC00) + return PLABank.ColorRam; + else if (addr >= 0xDC00 && addr < 0xDD00) + return PLABank.Cia0; + else if (addr >= 0xDD00 && addr < 0xDE00) + return PLABank.Cia1; + else if (addr >= 0xDE00 && addr < 0xDF00) + return PLABank.Expansion0; + else + return PLABank.Expansion1; + } + else + { + return map.layoutD000; + } + } + else + { + return map.layoutE000; + } + } + + public byte Peek(int addr) + { + switch (Bank((ushort)(addr & 0xFFFF))) + { + case PLABank.BasicROM: + return chips.basicRom.Peek(addr); + case PLABank.CartridgeHi: + return 0; + case PLABank.CartridgeLo: + return 0; + case PLABank.CharROM: + return chips.charRom.Peek(addr); + case PLABank.Cia0: + return chips.cia0.Peek(addr); + case PLABank.Cia1: + return chips.cia1.Peek(addr); + case PLABank.ColorRam: + return chips.colorRam.Peek(addr, bus); + case PLABank.Expansion0: + return 0; + case PLABank.Expansion1: + return 0; + case PLABank.KernalROM: + return chips.kernalRom.Peek(addr); + case PLABank.None: + return 0xFF; + case PLABank.RAM: + return chips.ram.Peek(addr); + case PLABank.Sid: + return chips.sid.Peek(addr); + case PLABank.Vic: + return chips.vic.Peek(addr); + } + return 0xFF; + } + + public void Poke(int addr, byte val) + { + switch (Bank((ushort)(addr & 0xFFFF))) + { + case PLABank.BasicROM: + chips.basicRom.Poke(addr, val); + break; + case PLABank.CartridgeHi: + break; + case PLABank.CartridgeLo: + break; + case PLABank.CharROM: + chips.charRom.Poke(addr, val); + break; + case PLABank.Cia0: + chips.cia0.Poke(addr, val); + break; + case PLABank.Cia1: + chips.cia1.Poke(addr, val); + break; + case PLABank.ColorRam: + chips.colorRam.Poke(addr, val); + break; + case PLABank.Expansion0: + break; + case PLABank.Expansion1: + break; + case PLABank.KernalROM: + chips.kernalRom.Poke(addr, val); + break; + case PLABank.None: + break; + case PLABank.RAM: + chips.ram.Poke(addr, val); + break; + case PLABank.Sid: + chips.sid.Poke(addr, val); + break; + case PLABank.Vic: + chips.vic.Poke(addr, val); + break; + } + } + + public byte Read(ushort addr) + { + switch (Bank(addr)) + { + case PLABank.BasicROM: + bus = chips.basicRom.Read(addr); + break; + case PLABank.CartridgeHi: + bus = 0; + break; + case PLABank.CartridgeLo: + bus = 0; + break; + case PLABank.CharROM: + bus = chips.charRom.Read(addr); + break; + case PLABank.Cia0: + if (addr == 0xDC00 || addr == 0xDC01) + cia0portRead = true; + bus = chips.cia0.Read(addr); + break; + case PLABank.Cia1: + bus = chips.cia1.Read(addr); + break; + case PLABank.ColorRam: + bus = chips.colorRam.Read(addr, bus); + break; + case PLABank.Expansion0: + bus = 0; + break; + case PLABank.Expansion1: + bus = 0; + break; + case PLABank.KernalROM: + bus = chips.kernalRom.Read(addr); + break; + case PLABank.None: + bus = 0xFF; + break; + case PLABank.RAM: + bus = chips.ram.Read(addr); + break; + case PLABank.Sid: + bus = chips.sid.Read(addr); + break; + case PLABank.Vic: + bus = chips.vic.Read(addr); + break; + } + return bus; + } + + public byte ReadVic(ushort addr) + { + addr &= 0x3FFF; + + if (ultimax) + { + if (addr >= 0x3000) + return 0; //todo: change to ROMHI + else + return chips.ram.Read(addr); + } + else + { + if ((addr & 0x7000) == 0x1000) + { + return chips.charRom.Read(addr); + } + else + { + ushort bank = (ushort)(vicBankPortRead() & 0x3); + bank <<= 14; + addr |= bank; + return chips.ram.Read(addr); + } + } + } + + public void Write(ushort addr, byte val) + { + switch (Bank(addr)) + { + case PLABank.BasicROM: + chips.basicRom.Write(addr, val); + break; + case PLABank.CartridgeHi: + break; + case PLABank.CartridgeLo: + break; + case PLABank.CharROM: + chips.charRom.Write(addr, val); + break; + case PLABank.Cia0: + chips.cia0.Write(addr, val); + break; + case PLABank.Cia1: + chips.cia1.Write(addr, val); + break; + case PLABank.ColorRam: + chips.colorRam.Write(addr, val); + break; + case PLABank.Expansion0: + break; + case PLABank.Expansion1: + break; + case PLABank.KernalROM: + chips.kernalRom.Write(addr, val); + break; + case PLABank.None: + break; + case PLABank.RAM: + chips.ram.Write(addr, val); + break; + case PLABank.Sid: + chips.sid.Write(addr, val); + break; + case PLABank.Vic: + chips.vic.Write(addr, val); + break; + } + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Port.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Port.cs new file mode 100644 index 0000000000..fea19eb226 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Port.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + static public class Port + { + static public byte CPUWrite(byte latch, byte val, byte dir) + { + byte result; + result = (byte)(latch & ~dir); + result |= (byte)(val & dir); + return result; + } + + static public byte ExternalWrite(byte latch, byte val, byte dir) + { + byte result; + result = (byte)(latch & dir); + result |= (byte)(val & ~dir); + return result; + } + + static public PortAdapter GetAdapter(Func newRead, Action newWrite) + { + return new PortAdapter(newRead, newWrite); + } + } + + public class PortAdapter + { + private Action actWrite; + private Func funcRead; + + public PortAdapter(Func newRead, Action newWrite) + { + funcRead = newRead; + actWrite = newWrite; + } + + public byte Data + { + get + { + return funcRead(); + } + set + { + actWrite(value); + } + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Sid.SoundProvider.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Sid.SoundProvider.cs new file mode 100644 index 0000000000..844635a941 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Sid.SoundProvider.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + public abstract partial class Sid : ISoundProvider + { + public void GetSamples(short[] samples) + { + // produce no samples for now + } + + public int MaxVolume + { + get + { + return 255; + } + set + { + // no change in volume + } + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Sid.SyncSoundProvider.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Sid.SyncSoundProvider.cs new file mode 100644 index 0000000000..0521e68acc --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Sid.SyncSoundProvider.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + public abstract partial class Sid : ISyncSoundProvider + { + public void GetSamples(out short[] samples, out int nsamp) + { + samples = new short[0]; + nsamp = 0; + } + + public void DiscardSamples() + { + // todo + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Sid.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Sid.cs new file mode 100644 index 0000000000..f78c212484 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Sid.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + public abstract partial class Sid : IStandardIO + { + // ------------------------------------ + + private class Envelope + { + } + + private class Voice + { + } + + // ------------------------------------ + + public void HardReset() + { + } + + // ------------------------------------ + + public void ExecutePhase1() + { + } + + public void ExecutePhase2() + { + } + + // ------------------------------------ + + public byte Peek(int addr) + { + return 0; + } + + public void Poke(int addr, byte val) + { + } + + public byte Read(ushort addr) + { + return 0; + } + + public void Write(ushort addr, byte val) + { + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Timer.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Timer.cs new file mode 100644 index 0000000000..0d4e849820 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Timer.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + // base class for MOS Technology timer chips + + public abstract class Timer + { + protected bool pinIRQ; + protected byte[] portData; + protected byte[] portDir; + protected uint[] timer; + protected uint[] timerLatch; + protected bool[] timerOn; + + public Timer() + { + portData = new byte[2]; + portDir = new byte[2]; + timer = new uint[2]; + timerLatch = new uint[2]; + timerOn = new bool[2]; + } + + public PortAdapter Adapter0() + { + return Port.GetAdapter(ReadPort0, ExternalWritePort0); + } + + public PortAdapter Adapter1() + { + return Port.GetAdapter(ReadPort1, ExternalWritePort1); + } + + private void ExternalWritePort(uint index, byte data) + { + portData[index] = Port.ExternalWrite(portData[index], data, portDir[index]); + } + + private void ExternalWritePort0(byte data) + { + ExternalWritePort(0, data); + } + + private void ExternalWritePort1(byte data) + { + ExternalWritePort(1, data); + } + + protected void HardResetInternal() + { + timer[0] = 0xFFFF; + timer[1] = 0xFFFF; + timerLatch[0] = timer[0]; + timerLatch[1] = timer[1]; + pinIRQ = true; + portDir[0] = 0x00; + portDir[1] = 0x00; + } + + public bool IRQ + { + get + { + return pinIRQ; + } + } + + public byte ReadPort0() + { + return portData[0]; + } + + public byte ReadPort1() + { + return portData[1]; + } + + protected void SyncInternal(Serializer ser) + { + } + + private void WritePort(uint index, byte data) + { + portData[index] = Port.CPUWrite(portData[index], data, portDir[index]); + } + + public void WritePort0(byte data) + { + WritePort(0, data); + } + + public void WritePort1(byte data) + { + WritePort(1, data); + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.VideoProvider.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.VideoProvider.cs new file mode 100644 index 0000000000..68263fd1be --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.VideoProvider.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + public abstract partial class Vic : IVideoProvider + { + private int[] buf; + private int bufHeight; + private uint bufLength; + private uint bufOffset; + private int bufWidth; + + // palette + private int[] palette = + { + Colors.ARGB(0x00, 0x00, 0x00), + Colors.ARGB(0xFF, 0xFF, 0xFF), + Colors.ARGB(0x68, 0x37, 0x2B), + Colors.ARGB(0x70, 0xA4, 0xB2), + Colors.ARGB(0x6F, 0x3D, 0x86), + Colors.ARGB(0x58, 0x8D, 0x43), + Colors.ARGB(0x35, 0x28, 0x79), + Colors.ARGB(0xB8, 0xC7, 0x6F), + Colors.ARGB(0x6F, 0x4F, 0x25), + Colors.ARGB(0x43, 0x39, 0x00), + Colors.ARGB(0x9A, 0x67, 0x59), + Colors.ARGB(0x44, 0x44, 0x44), + Colors.ARGB(0x6C, 0x6C, 0x6C), + Colors.ARGB(0x9A, 0xD2, 0x84), + Colors.ARGB(0x6C, 0x5E, 0xB5), + Colors.ARGB(0x95, 0x95, 0x95) + }; + + public int BackgroundColor + { + get { return Colors.ARGB(0, 0, 0); } + } + + public int BufferHeight + { + get { return bufHeight; } + } + + public int BufferWidth + { + get { return bufWidth; } + } + + public int[] GetVideoBuffer() + { + return buf; + } + + public int VirtualWidth + { + get { return bufWidth; } + } + + private void WritePixel(uint pixel) + { + if (borderOnMain || borderOnVertical) + buf[bufOffset] = palette[borderColor]; + else + buf[bufOffset] = palette[pixel]; + + bufOffset++; + if (bufOffset == bufLength) + bufOffset = 0; + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.cs b/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.cs new file mode 100644 index 0000000000..6f3db4b3f7 --- /dev/null +++ b/BizHawk.Emulation/Computers/Commodore64/MOS/Vic.cs @@ -0,0 +1,975 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace BizHawk.Emulation.Computers.Commodore64.MOS +{ + public abstract partial class Vic : IStandardIO + { + // ------------------------------------ + + private class Sprite + { + public bool collideData; + public bool collideSprite; + public uint color; + public bool enable; + public uint mc; + public uint mcbase; + public bool multicolor; + public uint pointer; + public bool priority; + public uint sr; + public uint x; + public bool xExpand; + public uint y; + public bool yExpand; + + public void HardReset() + { + collideData = false; + collideSprite = false; + color = 0; + enable = false; + mc = 0; + mcbase = 0; + multicolor = false; + pointer = 0; + priority = false; + sr = 0; + x = 0; + xExpand = false; + y = 0; + yExpand = false; + } + } + private Sprite[] sprites; + + private uint backgroundColor0; + private uint backgroundColor1; + private uint backgroundColor2; + private uint backgroundColor3; + private uint baCount; + private bool badline; + private bool badlineEnable; + private bool bitmapMode; + private bool borderCheckLEnable; + private bool borderCheckREnable; + private uint borderColor; + private bool borderOnMain; + private bool borderOnVertical; + private uint[] bufferC; + private uint[] bufferG; + private byte bus; + private bool columnSelect; + private uint cycle; + private uint cycleIndex; + private uint dataC; + private uint dataG; + private bool displayEnable; + private bool enableIntLightPen; + private bool enableIntRaster; + private bool enableIntSpriteCollision; + private bool enableIntSpriteDataCollision; + private bool extraColorMode; + private bool idle; + private bool intLightPen; + private bool intRaster; + private bool intSpriteCollision; + private bool intSpriteDataCollision; + private uint lastRasterLine; + private uint lightPenX; + private uint lightPenY; + private bool multicolorMode; + private uint pointerCB; + private uint pointerVM; + private uint rasterInterruptLine; + private uint rasterLine; + private uint rasterX; + private uint rc; + private uint refreshCounter; + private bool rowSelect; + private uint spriteMulticolor0; + private uint spriteMulticolor1; + private uint sr; + private uint srCount; + private uint vc; + private uint vcbase; + private uint vmli; + private uint xScroll; + private uint yScroll; + + // ------------------------------------ + + private C64Chips chips; + private int cyclesPerSec; + private bool pinAEC; + private bool pinBA; + private bool pinIRQ; + private uint[][] pipeline; + private uint totalCycles; + private uint totalLines; + + // ------------------------------------ + + public Vic(C64Chips newChips, uint newCycles, uint newLines, uint[][] newPipeline, int newCyclesPerSec) + { + chips = newChips; + totalCycles = newCycles; + totalLines = newLines; + pipeline = newPipeline; + cyclesPerSec = newCyclesPerSec; + + bufWidth = (int)(totalCycles * 8); + bufHeight = (int)(totalLines); + buf = new int[bufWidth * bufHeight]; + bufLength = (uint)buf.Length; + + sprites = new Sprite[8]; + for (uint i = 0; i < 8; i++) + sprites[i] = new Sprite(); + + bufferC = new uint[40]; + bufferG = new uint[40]; + } + + public void HardReset() + { + pinAEC = true; + pinBA = true; + pinIRQ = false; + + bufOffset = 0; + + backgroundColor0 = 0; + backgroundColor1 = 0; + backgroundColor2 = 0; + backgroundColor3 = 0; + baCount = 4; + badline = false; + badlineEnable = false; + bitmapMode = false; + borderCheckLEnable = false; + borderCheckREnable = false; + borderColor = 0; + borderOnMain = true; + borderOnVertical = true; + columnSelect = false; + displayEnable = false; + enableIntLightPen = false; + enableIntRaster = false; + enableIntSpriteCollision = false; + enableIntSpriteDataCollision = false; + extraColorMode = false; + idle = true; + intLightPen = false; + intRaster = false; + intSpriteCollision = false; + intSpriteDataCollision = false; + lastRasterLine = 0; + lightPenX = 0; + lightPenY = 0; + multicolorMode = false; + pointerCB = 0; + pointerVM = 0; + rasterInterruptLine = 0; + rasterLine = 0; + rasterX = 0; + rc = 7; + refreshCounter = 0xFF; + rowSelect = false; + spriteMulticolor0 = 0; + spriteMulticolor1 = 0; + sr = 0; + srCount = 0; + vc = 0; + vcbase = 0; + vmli = 0; + xScroll = 0; + yScroll = 0; + + for (uint i = 0; i < 8; i++) + sprites[i].HardReset(); + + for (uint i = 0; i < 40; i++) + { + bufferC[i] = 0; + bufferG[i] = 0; + } + } + + private void UpdateBA() + { + if (pinBA) + baCount = 4; + else if (baCount > 0) + baCount--; + } + + private void UpdatePins() + { + pinIRQ = !( + (enableIntRaster & intRaster) | + (enableIntSpriteDataCollision & intSpriteDataCollision) | + (enableIntSpriteCollision & intSpriteCollision) | + (enableIntLightPen & intLightPen)); + } + + // ------------------------------------ + + protected const uint pipelineUpdateVc = 1; + protected const uint pipelineChkSprChunch = 2; + protected const uint pipelineUpdateMcBase = 4; + protected const uint pipelineChkBrdL1 = 8; + protected const uint pipelineChkBrdL0 = 16; + protected const uint pipelineChkSprDma = 32; + protected const uint pipelineChkBrdR0 = 64; + protected const uint pipelineChkSprExp = 128; + protected const uint pipelineChkBrdR1 = 256; + protected const uint pipelineChkSprDisp = 512; + protected const uint pipelineUpdateRc = 1024; + + // ------------------------------------ + + public void ExecutePhase1() + { + // always assert access over the bus in ph1 + pinAEC = false; + + // raster IRQ compare + if ((cycle == 0 && rasterLine > 0) || (cycle == 1 && rasterLine == 0)) + { + if (rasterLine != lastRasterLine) + if (rasterLine == rasterInterruptLine) + intRaster = true; + lastRasterLine = rasterLine; + } + + // display enable compare + if (rasterLine == 0x030) + badlineEnable |= displayEnable; + + // badline compare + if (badlineEnable && rasterLine >= 0x030 && rasterLine < 0x0F7 && ((rasterLine & 0x7) == yScroll)) + badline = true; + + if (badline) + idle = false; + + ParseCycle(); + + Render(); + + // must always come last + UpdatePins(); + } + + public void ExecutePhase2() + { + ParseCycle(); + + // advance cycle and optionally raster line + cycle++; + if (cycle == totalCycles) + { + vcbase = 0; + cycleIndex = 0; + cycle = 0; + rasterLine++; + if (rasterLine == totalLines) + rasterLine = 0; + } + + // if the BA counter is nonzero, allow CPU bus access + UpdateBA(); + if (baCount > 0) + pinAEC = true; + + Render(); + + // must always come last + UpdatePins(); + } + + private void ParseCycle() + { + ushort addr = 0x3FFF; + uint cycleBAsprite0; + uint cycleBAsprite1; + uint cycleBAsprite2; + uint cycleFetchSpriteIndex; + uint fetch = pipeline[1][cycleIndex]; + uint ba = pipeline[2][cycleIndex]; + uint act = pipeline[3][cycleIndex]; + + // apply X location + rasterX = pipeline[0][cycleIndex]; + + // perform fetch + switch (fetch & 0xFF00) + { + case 0x0100: + // fetch R + refreshCounter = (refreshCounter - 1) & 0xFF; + addr = (ushort)(0x3F00 | refreshCounter); + bus = chips.pla.ReadVic(addr); + break; + case 0x0200: + // fetch C + if (!idle) + { + if (badline) + { + addr = (ushort)((pointerVM << 10) | vc); + bus = chips.pla.ReadVic(addr); + dataC = bus; + } + else + { + dataC = bufferC[vmli]; + } + } + else + { + dataC = 0; + } + break; + case 0x0300: + // fetch G + if (idle) + addr = 0x3FFF; + else + { + if (bitmapMode) + addr = (ushort)(rc | (vc << 3) | ((pointerCB & 0x4) << 11)); + else + addr = (ushort)(rc | (dataG << 3) | (pointerCB << 9)); + } + if (extraColorMode) + addr &= 0x39FF; + bus = chips.pla.ReadVic(addr); + dataG = bus; + vmli++; + vc++; + break; + case 0x0400: + // fetch I + addr = (extraColorMode ? (ushort)0x39FF : (ushort)0x3FFF); + bus = chips.pla.ReadVic(addr); + dataG = bus; + dataC = 0; + break; + case 0x0500: + // no fetch + break; + default: + cycleFetchSpriteIndex = (fetch & 0x7); + switch (fetch & 0xF0) + { + case 0x00: + // fetch P + addr = (ushort)(0x1F8 | (pointerVM << 10) | cycleFetchSpriteIndex); + bus = chips.pla.ReadVic(addr); + sprites[cycleFetchSpriteIndex].pointer = bus; + break; + case 0x10: + case 0x20: + case 0x30: + // fetch S + addr = (ushort)(sprites[cycleFetchSpriteIndex].mc | sprites[cycleFetchSpriteIndex].pointer << 6); + bus = chips.pla.ReadVic(addr); + sprites[cycleFetchSpriteIndex].sr <<= 8; + sprites[cycleFetchSpriteIndex].sr |= bus; + break; + } + break; + } + + // perform BA flag manipulation + switch (ba) + { + case 0x0000: + pinBA = true; + break; + case 0x1000: + pinBA = !badline; + break; + default: + cycleBAsprite0 = ba & 0x000F; + cycleBAsprite1 = ba & 0x00F0; + cycleBAsprite2 = ba & 0x0F00; + if ((cycleBAsprite0 < 8 && sprites[cycleBAsprite0].enable) || + (cycleBAsprite1 < 8 && sprites[cycleBAsprite1].enable) || + (cycleBAsprite2 < 8 && sprites[cycleBAsprite2].enable)) + pinBA = false; + break; + } + + // perform actions + borderCheckLEnable = false; + borderCheckREnable = false; + + if (!columnSelect && (act & pipelineChkBrdL0) != 0) + borderCheckLEnable = true; + if (columnSelect && (act & pipelineChkBrdL1) != 0) + borderCheckLEnable = true; + if (!columnSelect && (act & pipelineChkBrdR0) != 0) + borderCheckREnable = true; + if (columnSelect && (act & pipelineChkBrdR1) != 0) + borderCheckREnable = true; + if ((act & pipelineChkSprChunch) != 0) + { + } + if ((act & pipelineChkSprDisp) != 0) + { + } + if ((act & pipelineChkSprDma) != 0) + { + } + if ((act & pipelineChkSprExp) != 0) + { + } + if ((act & pipelineUpdateMcBase) != 0) + { + } + if ((act & pipelineUpdateRc) != 0) + { + if (rc == 7) + { + idle = true; + vcbase = vc; + } + if (!idle) + rc++; + } + if ((act & pipelineUpdateVc) != 0) + { + vc = vcbase; + vmli = 0; + if (badline) + rc = 0; + } + + cycleIndex++; + } + + private void Render() + { + if (borderCheckLEnable) + { + } + if (borderCheckREnable) + { + } + WritePixel(0); + WritePixel(0); + WritePixel(0); + WritePixel(0); + } + + // ------------------------------------ + + public bool AEC { get { return pinAEC; } } + public bool BA { get { return pinBA; } } + public bool IRQ { get { return pinIRQ; } } + + // ------------------------------------ + + public int CyclesPerFrame + { + get + { + return (int)(totalCycles * totalLines); + } + } + + public int CyclesPerSecond + { + get + { + return cyclesPerSec; + } + } + + // ------------------------------------ + + public byte Peek(int addr) + { + return ReadRegister((ushort)(addr & 0x3F)); + } + + public void Poke(int addr, byte val) + { + WriteRegister((ushort)(addr & 0x3F), val); + } + + public byte Read(ushort addr) + { + byte result; + addr &= 0x3F; + + switch (addr) + { + case 0x1E: + case 0x1F: + // reading clears these + result = ReadRegister(addr); + WriteRegister(addr, 0); + break; + default: + result = ReadRegister((ushort)(addr & 0x3F)); + break; + } + return result; + } + + private byte ReadRegister(ushort addr) + { + byte result = 0xFF; //unused bit value + + switch (addr) + { + case 0x00: + case 0x02: + case 0x04: + case 0x06: + case 0x08: + case 0x0A: + case 0x0C: + case 0x0E: + result = (byte)(sprites[addr >> 1].x & 0xFF); + break; + case 0x01: + case 0x03: + case 0x05: + case 0x07: + case 0x09: + case 0x0B: + case 0x0D: + case 0x0F: + result = (byte)(sprites[addr >> 1].y & 0xFF); + break; + case 0x10: + result = (byte)( + ((sprites[0].x >> 8) & 0x01) | + ((sprites[1].x >> 7) & 0x02) | + ((sprites[2].x >> 6) & 0x04) | + ((sprites[3].x >> 5) & 0x08) | + ((sprites[4].x >> 4) & 0x10) | + ((sprites[5].x >> 3) & 0x20) | + ((sprites[6].x >> 2) & 0x40) | + ((sprites[7].x >> 1) & 0x80) + ); + break; + case 0x11: + result = (byte)( + (byte)(yScroll & 0x7) | + (rowSelect ? (byte)0x08 : (byte)0x00) | + (displayEnable ? (byte)0x10 : (byte)0x00) | + (bitmapMode ? (byte)0x20 : (byte)0x00) | + (extraColorMode ? (byte)0x40 : (byte)0x00) | + (byte)((rasterLine & 0x100) >> 1) + ); + break; + case 0x12: + result = (byte)(rasterLine & 0xFF); + break; + case 0x13: + result = (byte)(lightPenX & 0xFF); + break; + case 0x14: + result = (byte)(lightPenY & 0xFF); + break; + case 0x15: + result = (byte)( + (sprites[0].enable ? 0x01 : 0x00) | + (sprites[1].enable ? 0x02 : 0x00) | + (sprites[2].enable ? 0x04 : 0x00) | + (sprites[3].enable ? 0x08 : 0x00) | + (sprites[4].enable ? 0x10 : 0x00) | + (sprites[5].enable ? 0x20 : 0x00) | + (sprites[6].enable ? 0x40 : 0x00) | + (sprites[7].enable ? 0x80 : 0x00) + ); + break; + case 0x16: + result &= 0xBF; + result |= (byte)( + (byte)(xScroll & 0x7) | + (columnSelect ? (byte)0x08 : (byte)0x00) | + (multicolorMode ? (byte)0x10 : (byte)0x00) + ); + break; + case 0x17: + result = (byte)( + (sprites[0].yExpand ? 0x01 : 0x00) | + (sprites[1].yExpand ? 0x02 : 0x00) | + (sprites[2].yExpand ? 0x04 : 0x00) | + (sprites[3].yExpand ? 0x08 : 0x00) | + (sprites[4].yExpand ? 0x10 : 0x00) | + (sprites[5].yExpand ? 0x20 : 0x00) | + (sprites[6].yExpand ? 0x40 : 0x00) | + (sprites[7].yExpand ? 0x80 : 0x00) + ); + break; + case 0x18: + result &= 0xFE; + result |= (byte)( + ((pointerVM & 0xF) << 4) | + ((pointerCB & 0x7) << 1) + ); + break; + case 0x19: + result &= 0x70; + result |= (byte)( + (intRaster ? 0x01 : 0x00) | + (intSpriteDataCollision ? 0x02 : 0x00) | + (intSpriteCollision ? 0x04 : 0x00) | + (intLightPen ? 0x08 : 0x00) | + (pinIRQ ? 0x00 : 0x80) + ); + break; + case 0x1A: + result &= 0xF0; + result |= (byte)( + (enableIntRaster ? 0x01 : 0x00) | + (enableIntSpriteDataCollision ? 0x02 : 0x00) | + (enableIntSpriteCollision ? 0x04 : 0x00) | + (enableIntLightPen ? 0x08 : 0x00) + ); + break; + case 0x1B: + result = (byte)( + (sprites[0].priority ? 0x01 : 0x00) | + (sprites[1].priority ? 0x02 : 0x00) | + (sprites[2].priority ? 0x04 : 0x00) | + (sprites[3].priority ? 0x08 : 0x00) | + (sprites[4].priority ? 0x10 : 0x00) | + (sprites[5].priority ? 0x20 : 0x00) | + (sprites[6].priority ? 0x40 : 0x00) | + (sprites[7].priority ? 0x80 : 0x00) + ); + break; + case 0x1C: + result = (byte)( + (sprites[0].multicolor ? 0x01 : 0x00) | + (sprites[1].multicolor ? 0x02 : 0x00) | + (sprites[2].multicolor ? 0x04 : 0x00) | + (sprites[3].multicolor ? 0x08 : 0x00) | + (sprites[4].multicolor ? 0x10 : 0x00) | + (sprites[5].multicolor ? 0x20 : 0x00) | + (sprites[6].multicolor ? 0x40 : 0x00) | + (sprites[7].multicolor ? 0x80 : 0x00) + ); + break; + case 0x1D: + result = (byte)( + (sprites[0].xExpand ? 0x01 : 0x00) | + (sprites[1].xExpand ? 0x02 : 0x00) | + (sprites[2].xExpand ? 0x04 : 0x00) | + (sprites[3].xExpand ? 0x08 : 0x00) | + (sprites[4].xExpand ? 0x10 : 0x00) | + (sprites[5].xExpand ? 0x20 : 0x00) | + (sprites[6].xExpand ? 0x40 : 0x00) | + (sprites[7].xExpand ? 0x80 : 0x00) + ); + break; + case 0x1E: + result = (byte)( + (sprites[0].collideSprite ? 0x01 : 0x00) | + (sprites[1].collideSprite ? 0x02 : 0x00) | + (sprites[2].collideSprite ? 0x04 : 0x00) | + (sprites[3].collideSprite ? 0x08 : 0x00) | + (sprites[4].collideSprite ? 0x10 : 0x00) | + (sprites[5].collideSprite ? 0x20 : 0x00) | + (sprites[6].collideSprite ? 0x40 : 0x00) | + (sprites[7].collideSprite ? 0x80 : 0x00) + ); + break; + case 0x1F: + result = (byte)( + (sprites[0].collideData ? 0x01 : 0x00) | + (sprites[1].collideData ? 0x02 : 0x00) | + (sprites[2].collideData ? 0x04 : 0x00) | + (sprites[3].collideData ? 0x08 : 0x00) | + (sprites[4].collideData ? 0x10 : 0x00) | + (sprites[5].collideData ? 0x20 : 0x00) | + (sprites[6].collideData ? 0x40 : 0x00) | + (sprites[7].collideData ? 0x80 : 0x00) + ); + break; + case 0x20: + result &= 0xF0; + result |= (byte)(borderColor & 0x0F); + break; + case 0x21: + result &= 0xF0; + result |= (byte)(backgroundColor0 & 0x0F); + break; + case 0x22: + result &= 0xF0; + result |= (byte)(backgroundColor1 & 0x0F); + break; + case 0x23: + result &= 0xF0; + result |= (byte)(backgroundColor2 & 0x0F); + break; + case 0x24: + result &= 0xF0; + result |= (byte)(backgroundColor3 & 0x0F); + break; + case 0x25: + result &= 0xF0; + result |= (byte)(spriteMulticolor0 & 0x0F); + break; + case 0x26: + result &= 0xF0; + result |= (byte)(spriteMulticolor1 & 0x0F); + break; + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + result &= 0xF0; + result |= (byte)(sprites[addr - 0x27].color & 0xF); + break; + default: + // not connected + break; + } + + return result; + } + + public void Write(ushort addr, byte val) + { + addr &= 0x3F; + switch (addr) + { + case 0x19: + // interrupts are cleared by writing a 1 + if ((val & 0x01) != 0) + intRaster = false; + if ((val & 0x02) != 0) + intSpriteDataCollision = false; + if ((val & 0x04) != 0) + intSpriteCollision = false; + if ((val & 0x08) != 0) + intLightPen = false; + break; + case 0x1E: + case 0x1F: + // can't write to these + break; + case 0x2F: + case 0x30: + case 0x31: + case 0x32: + case 0x33: + case 0x34: + case 0x35: + case 0x36: + case 0x37: + case 0x38: + case 0x39: + case 0x3A: + case 0x3B: + case 0x3C: + case 0x3D: + case 0x3E: + case 0x3F: + // not connected + break; + default: + WriteRegister(addr, val); + break; + } + } + + private void WriteRegister(ushort addr, byte val) + { + switch (addr) + { + case 0x00: + case 0x02: + case 0x04: + case 0x06: + case 0x08: + case 0x0A: + case 0x0C: + case 0x0E: + sprites[addr >> 1].x &= 0x100; + sprites[addr >> 1].x |= val; + break; + case 0x01: + case 0x03: + case 0x05: + case 0x07: + case 0x09: + case 0x0B: + case 0x0D: + case 0x0F: + sprites[addr >> 1].y = val; + break; + case 0x10: + sprites[0].x = (sprites[0].x & 0xFF) | ((uint)(val & 0x01) << 8); + sprites[1].x = (sprites[1].x & 0xFF) | ((uint)(val & 0x02) << 7); + sprites[2].x = (sprites[2].x & 0xFF) | ((uint)(val & 0x04) << 6); + sprites[3].x = (sprites[3].x & 0xFF) | ((uint)(val & 0x08) << 5); + sprites[4].x = (sprites[4].x & 0xFF) | ((uint)(val & 0x10) << 4); + sprites[5].x = (sprites[5].x & 0xFF) | ((uint)(val & 0x20) << 3); + sprites[6].x = (sprites[6].x & 0xFF) | ((uint)(val & 0x40) << 2); + sprites[7].x = (sprites[7].x & 0xFF) | ((uint)(val & 0x80) << 1); + break; + case 0x11: + yScroll = (val & (uint)0x07); + rowSelect = ((val & 0x08) != 0); + displayEnable = ((val & 0x10) != 0); + bitmapMode = ((val & 0x20) != 0); + extraColorMode = ((val & 0x40) != 0); + rasterInterruptLine &= 0xFF; + rasterInterruptLine |= (uint)(val & 0x80) << 1; + break; + case 0x12: + rasterInterruptLine &= 0x100; + rasterInterruptLine |= val; + break; + case 0x13: + lightPenX = val; + break; + case 0x14: + lightPenY = val; + break; + case 0x15: + sprites[0].enable = ((val & 0x01) != 0); + sprites[1].enable = ((val & 0x02) != 0); + sprites[2].enable = ((val & 0x04) != 0); + sprites[3].enable = ((val & 0x08) != 0); + sprites[4].enable = ((val & 0x10) != 0); + sprites[5].enable = ((val & 0x20) != 0); + sprites[6].enable = ((val & 0x40) != 0); + sprites[7].enable = ((val & 0x80) != 0); + break; + case 0x16: + xScroll = (val & (uint)0x07); + columnSelect = ((val & 0x08) != 0); + multicolorMode = ((val & 0x10) != 0); + break; + case 0x17: + sprites[0].yExpand = ((val & 0x01) != 0); + sprites[1].yExpand = ((val & 0x02) != 0); + sprites[2].yExpand = ((val & 0x04) != 0); + sprites[3].yExpand = ((val & 0x08) != 0); + sprites[4].yExpand = ((val & 0x10) != 0); + sprites[5].yExpand = ((val & 0x20) != 0); + sprites[6].yExpand = ((val & 0x40) != 0); + sprites[7].yExpand = ((val & 0x80) != 0); + break; + case 0x18: + pointerVM = (uint)((val >> 4) & 0xF); + pointerCB = (uint)((val >> 1) & 0x7); + break; + case 0x19: + intRaster = ((val & 0x01) != 0); + intSpriteDataCollision = ((val & 0x02) != 0); + intSpriteCollision = ((val & 0x04) != 0); + intLightPen = ((val & 0x08) != 0); + break; + case 0x1A: + enableIntRaster = ((val & 0x01) != 0); + enableIntSpriteDataCollision = ((val & 0x02) != 0); + enableIntSpriteCollision = ((val & 0x04) != 0); + enableIntLightPen = ((val & 0x08) != 0); + break; + case 0x1B: + sprites[0].priority = ((val & 0x01) != 0); + sprites[1].priority = ((val & 0x02) != 0); + sprites[2].priority = ((val & 0x04) != 0); + sprites[3].priority = ((val & 0x08) != 0); + sprites[4].priority = ((val & 0x10) != 0); + sprites[5].priority = ((val & 0x20) != 0); + sprites[6].priority = ((val & 0x40) != 0); + sprites[7].priority = ((val & 0x80) != 0); + break; + case 0x1C: + sprites[0].multicolor = ((val & 0x01) != 0); + sprites[1].multicolor = ((val & 0x02) != 0); + sprites[2].multicolor = ((val & 0x04) != 0); + sprites[3].multicolor = ((val & 0x08) != 0); + sprites[4].multicolor = ((val & 0x10) != 0); + sprites[5].multicolor = ((val & 0x20) != 0); + sprites[6].multicolor = ((val & 0x40) != 0); + sprites[7].multicolor = ((val & 0x80) != 0); + break; + case 0x1D: + sprites[0].xExpand = ((val & 0x01) != 0); + sprites[1].xExpand = ((val & 0x02) != 0); + sprites[2].xExpand = ((val & 0x04) != 0); + sprites[3].xExpand = ((val & 0x08) != 0); + sprites[4].xExpand = ((val & 0x10) != 0); + sprites[5].xExpand = ((val & 0x20) != 0); + sprites[6].xExpand = ((val & 0x40) != 0); + sprites[7].xExpand = ((val & 0x80) != 0); + break; + case 0x1E: + sprites[0].collideSprite = ((val & 0x01) != 0); + sprites[1].collideSprite = ((val & 0x02) != 0); + sprites[2].collideSprite = ((val & 0x04) != 0); + sprites[3].collideSprite = ((val & 0x08) != 0); + sprites[4].collideSprite = ((val & 0x10) != 0); + sprites[5].collideSprite = ((val & 0x20) != 0); + sprites[6].collideSprite = ((val & 0x40) != 0); + sprites[7].collideSprite = ((val & 0x80) != 0); + break; + case 0x1F: + sprites[0].collideData = ((val & 0x01) != 0); + sprites[1].collideData = ((val & 0x02) != 0); + sprites[2].collideData = ((val & 0x04) != 0); + sprites[3].collideData = ((val & 0x08) != 0); + sprites[4].collideData = ((val & 0x10) != 0); + sprites[5].collideData = ((val & 0x20) != 0); + sprites[6].collideData = ((val & 0x40) != 0); + sprites[7].collideData = ((val & 0x80) != 0); + break; + case 0x20: + borderColor = (uint)(val & 0xF); + break; + case 0x21: + backgroundColor0 = (uint)(val & 0xF); + break; + case 0x22: + backgroundColor1 = (uint)(val & 0xF); + break; + case 0x23: + backgroundColor2 = (uint)(val & 0xF); + break; + case 0x24: + backgroundColor3 = (uint)(val & 0xF); + break; + case 0x25: + spriteMulticolor0 = (uint)(val & 0xF); + break; + case 0x26: + spriteMulticolor1 = (uint)(val & 0xF); + break; + case 0x27: + case 0x28: + case 0x29: + case 0x2A: + case 0x2B: + case 0x2C: + case 0x2D: + case 0x2E: + sprites[addr - 0x27].color = (uint)(val & 0xF); + break; + default: + break; + } + } + } +} diff --git a/BizHawk.Emulation/Computers/Commodore64/D64.cs b/BizHawk.Emulation/Computers/Commodore64/Media/D64.cs similarity index 100% rename from BizHawk.Emulation/Computers/Commodore64/D64.cs rename to BizHawk.Emulation/Computers/Commodore64/Media/D64.cs diff --git a/BizHawk.Emulation/Computers/Commodore64/Disk.cs b/BizHawk.Emulation/Computers/Commodore64/Media/Disk.cs similarity index 100% rename from BizHawk.Emulation/Computers/Commodore64/Disk.cs rename to BizHawk.Emulation/Computers/Commodore64/Media/Disk.cs diff --git a/BizHawk.Emulation/Computers/Commodore64/G64.cs b/BizHawk.Emulation/Computers/Commodore64/Media/G64.cs similarity index 100% rename from BizHawk.Emulation/Computers/Commodore64/G64.cs rename to BizHawk.Emulation/Computers/Commodore64/Media/G64.cs diff --git a/BizHawk.Emulation/Computers/Commodore64/MemBus.cs b/BizHawk.Emulation/Computers/Commodore64/MemBus.cs deleted file mode 100644 index 1a8284992d..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/MemBus.cs +++ /dev/null @@ -1,635 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public enum MemoryDesignation - { - Disabled, - RAM, - Basic, - Kernal, - IO, - Character, - ROMLo, - ROMHi, - Vic, - Sid, - ColorRam, - Cia0, - Cia1, - Expansion0, - Expansion1 - } - - public class MemoryLayout - { - public MemoryDesignation Mem1000 = MemoryDesignation.RAM; - public MemoryDesignation Mem8000 = MemoryDesignation.RAM; - public MemoryDesignation MemA000 = MemoryDesignation.RAM; - public MemoryDesignation MemC000 = MemoryDesignation.RAM; - public MemoryDesignation MemD000 = MemoryDesignation.RAM; - public MemoryDesignation MemE000 = MemoryDesignation.RAM; - } - - public class Memory - { - // chips - public Cia cia0; - public Cia cia1; - public VicII vic; - public Sid sid; - - // storage - public Cartridge cart; - - // roms - public byte[] basicRom; - public byte[] charRom; - public bool exRomPin = true; - public bool gamePin = true; - public byte[] kernalRom; - public MemoryLayout layout; - - // ram - public byte[] colorRam; - public byte[] ram; - public bool vicCharEnabled; - public ushort vicOffset; - - // registers - public byte busData; - public bool inputWasRead; - public bool readTrigger = true; - public bool writeTrigger = true; - - // ports - public DataPortConnector cpuIO; - public DataPortConnector cpuPort; - public DataPortBus cpuPortBus = new DataPortBus(); - - void HandleFirmwareError(string file) - { - System.Windows.Forms.MessageBox.Show("the C64 core is referencing a firmware file which could not be found. Please make sure it's in your configured C64 firmwares folder. The referenced filename is: " + file); - throw new FileNotFoundException(); - } - - public Memory(string sourceFolder, VicII newVic, Sid newSid, Cia newCia0, Cia newCia1) - { - string basicFile = "basic"; - string charFile = "chargen"; - string kernalFile = "kernal"; - - string basicPath = Path.Combine(sourceFolder, basicFile); - string charPath = Path.Combine(sourceFolder, charFile); - string kernalPath = Path.Combine(sourceFolder, kernalFile); - - if (!File.Exists(basicPath)) HandleFirmwareError(basicFile); - if (!File.Exists(charPath)) HandleFirmwareError(charFile); - if (!File.Exists(kernalPath)) HandleFirmwareError(kernalFile); - - basicRom = File.ReadAllBytes(basicPath); - charRom = File.ReadAllBytes(charPath); - kernalRom = File.ReadAllBytes(kernalPath); - - vic = newVic; - sid = newSid; - cia0 = newCia0; - cia1 = newCia1; - - cpuPort = cpuPortBus.Connect(); - cpuPort.Latch = 0x00; - cpuPort.Direction = 0x1F; - cpuPortBus.AttachWriteHook(UpdateLayout); - - cpuIO = cpuPortBus.Connect(); - cpuIO.Latch = 0x17; - - cia1.AttachWriteHook(0, UpdateVicOffset); - HardReset(); - } - - public byte this[ushort index] - { - get - { - return ram[index]; - } - set - { - ram[index] = value; - } - } - - public MemoryDesignation GetDesignation(ushort addr) - { - MemoryDesignation result; - - if (addr < 0x1000) - { - result = MemoryDesignation.RAM; - } - else if (addr < 0x8000) - { - result = layout.Mem1000; - } - else if (addr < 0xA000) - { - result = layout.Mem8000; - } - else if (addr < 0xC000) - { - result = layout.MemA000; - } - else if (addr < 0xD000) - { - result = layout.MemC000; - } - else if (addr < 0xE000) - { - result = layout.MemD000; - } - else - { - result = layout.MemE000; - } - - if (result == MemoryDesignation.IO) - { - addr &= 0x0FFF; - if (addr < 0x0400) - { - result = MemoryDesignation.Vic; - } - else if (addr < 0x0800) - { - result = MemoryDesignation.Sid; - } - else if (addr < 0x0C00) - { - result = MemoryDesignation.ColorRam; - } - else if (addr < 0x0D00) - { - result = MemoryDesignation.Cia0; - } - else if (addr < 0x0E00) - { - result = MemoryDesignation.Cia1; - } - else if (addr < 0x0F00) - { - result = MemoryDesignation.Expansion0; - } - else - { - result = MemoryDesignation.Expansion1; - } - } - - return result; - } - - public void HardReset() - { - layout = new MemoryLayout(); - - ram = new byte[0x10000]; - colorRam = new byte[0x1000]; - WipeMemory(); - - cpuPort.Direction = 0x2F; - cpuPort.Data = 0x37; - - UpdateVicOffset(); - } - - public byte Peek(ushort addr) - { - byte result; - - if (addr == 0x0000) - { - result = cpuPort.Direction; - } - else if (addr == 0x0001) - { - result = cpuPort.Data; - } - else - { - MemoryDesignation des = GetDesignation(addr); - - switch (des) - { - case MemoryDesignation.Basic: - result = basicRom[addr & 0x1FFF]; - break; - case MemoryDesignation.Character: - result = charRom[addr & 0x0FFF]; - break; - case MemoryDesignation.Vic: - result = vic.Peek(addr & 0x3F); - break; - case MemoryDesignation.Sid: - result = sid.Peek(addr & 0x1F); - break; - case MemoryDesignation.ColorRam: - result = (byte)(colorRam[addr & 0x03FF] | (busData & 0xF0)); - break; - case MemoryDesignation.Cia0: - result = cia0.Peek(addr & 0x0F); - break; - case MemoryDesignation.Cia1: - result = cia1.Peek(addr & 0x0F); - break; - case MemoryDesignation.Expansion0: - result = 0; - break; - case MemoryDesignation.Expansion1: - result = 0; - break; - case MemoryDesignation.Kernal: - result = kernalRom[addr & 0x1FFF]; - break; - case MemoryDesignation.RAM: - result = ram[addr]; - break; - case MemoryDesignation.ROMHi: - result = cart.chips[cart.bank].data[addr & cart.chips[cart.bank].romMask]; - break; - case MemoryDesignation.ROMLo: - result = cart.chips[cart.bank].data[addr & cart.chips[cart.bank].romMask]; - break; - default: - return 0; - } - } - - busData = result; - return result; - } - - public byte PeekRam(int addr) - { - return ram[addr & 0xFFFF]; - } - - public void Poke(ushort addr, byte val) - { - return; - /* - if (addr == 0x0000) - { - cpuPort.Direction = val; - } - else if (addr == 0x0001) - { - cpuPort.Data = val; - UpdateLayout(); - } - else - { - MemoryDesignation des = GetDesignation(addr); - - switch (des) - { - case MemoryDesignation.Vic: - vic.Poke(addr, val); - break; - case MemoryDesignation.Sid: - sid.Poke(addr, val); - break; - case MemoryDesignation.ColorRam: - colorRam[addr & 0x03FF] = (byte)(val & 0x0F); - break; - case MemoryDesignation.Cia0: - cia0.Poke(addr, val); - break; - case MemoryDesignation.Cia1: - cia1.Poke(addr, val); - break; - case MemoryDesignation.Expansion0: - if (cart != null) - cart.WritePort(addr, val); - break; - case MemoryDesignation.Expansion1: - break; - case MemoryDesignation.RAM: - break; - default: - break; - } - - // write through to ram - if (des != MemoryDesignation.Disabled) - { - ram[addr] = val; - } - } - */ - } - - public void PokeRam(int addr, byte val) - { - ram[addr & 0xFFFF] = val; - } - - public byte Read(ushort addr) - { - byte result; - - if (addr == 0x0000) - { - result = cpuPort.Direction; - } - else if (addr == 0x0001) - { - result = cpuPort.Data; - } - else - { - MemoryDesignation des = GetDesignation(addr); - - switch (des) - { - case MemoryDesignation.Basic: - result = basicRom[addr & 0x1FFF]; - break; - case MemoryDesignation.Character: - result = charRom[addr & 0x0FFF]; - break; - case MemoryDesignation.Vic: - result = vic.Read(addr); - break; - case MemoryDesignation.Sid: - result = sid.Read(addr); - break; - case MemoryDesignation.ColorRam: - result = ReadColorRam(addr); - break; - case MemoryDesignation.Cia0: - if ((addr & 0xF) < 0x02) - inputWasRead = true; - result = cia0.Read(addr); - break; - case MemoryDesignation.Cia1: - result = cia1.Read(addr); - break; - case MemoryDesignation.Expansion0: - if (cart != null) - result = cart.ReadPort(addr); - else - result = 0; - break; - case MemoryDesignation.Expansion1: - result = 0; - break; - case MemoryDesignation.Kernal: - result = kernalRom[addr & 0x1FFF]; - break; - case MemoryDesignation.RAM: - result = ram[addr]; - break; - case MemoryDesignation.ROMHi: - result = cart.Read(addr); - break; - case MemoryDesignation.ROMLo: - result = cart.Read(addr); - break; - default: - return 0; - } - } - - busData = result; - return result; - } - - public byte ReadColorRam(ushort addr) - { - return (byte)((busData & 0xF0) | (colorRam[addr & 0x03FF])); - } - - public void SyncState(Serializer ser) - { - ser.Sync("BUSDATA", ref busData); - ser.Sync("EXROMPIN", ref exRomPin); - ser.Sync("GAMEPIN", ref gamePin); - ser.Sync("INPUTWASREAD", ref inputWasRead); - - ser.Sync("COLORRAM", ref colorRam, false); - ser.Sync("RAM", ref ram, false); - - byte cpuData = cpuPort.Latch; - byte cpuDir = cpuPort.Direction; - ser.Sync("CPUPORT", ref cpuData); - ser.Sync("CPUDIR", ref cpuDir); - - if (ser.IsReader) - { - cpuPort.Latch = cpuData; - cpuPort.Direction = cpuDir; - UpdateLayout(); - UpdateVicOffset(); - } - } - - public void UpdateLayout() - { - byte cpuData = cpuPort.Data; - bool loRom = ((cpuData & 0x01) != 0); - bool hiRom = ((cpuData & 0x02) != 0); - bool ioEnable = ((cpuData & 0x04) != 0); - - if (loRom && hiRom && gamePin && exRomPin) - { - layout.Mem1000 = MemoryDesignation.RAM; - layout.Mem8000 = MemoryDesignation.RAM; - layout.MemA000 = MemoryDesignation.Basic; - layout.MemC000 = MemoryDesignation.RAM; - layout.MemD000 = ioEnable ? MemoryDesignation.IO : MemoryDesignation.Character; - layout.MemE000 = MemoryDesignation.Kernal; - } - else if (loRom && !hiRom && gamePin) - { - layout.Mem1000 = MemoryDesignation.RAM; - layout.Mem8000 = MemoryDesignation.RAM; - layout.MemA000 = MemoryDesignation.RAM; - layout.MemC000 = MemoryDesignation.RAM; - layout.MemD000 = ioEnable ? MemoryDesignation.IO : MemoryDesignation.Character; - layout.MemE000 = MemoryDesignation.RAM; - } - else if (loRom && !hiRom && !exRomPin && !gamePin) - { - layout.Mem1000 = MemoryDesignation.RAM; - layout.Mem8000 = MemoryDesignation.RAM; - layout.MemA000 = MemoryDesignation.RAM; - layout.MemC000 = MemoryDesignation.RAM; - layout.MemD000 = ioEnable ? MemoryDesignation.IO : MemoryDesignation.RAM; - layout.MemE000 = MemoryDesignation.RAM; - } - else if ((!loRom && hiRom && gamePin) || (!loRom && !hiRom && !exRomPin)) - { - layout.Mem1000 = MemoryDesignation.RAM; - layout.Mem8000 = MemoryDesignation.RAM; - layout.MemA000 = MemoryDesignation.RAM; - layout.MemC000 = MemoryDesignation.RAM; - layout.MemD000 = ioEnable ? MemoryDesignation.IO : MemoryDesignation.Character; - layout.MemE000 = MemoryDesignation.Kernal; - } - else if (!loRom && !hiRom && gamePin) - { - layout.Mem1000 = MemoryDesignation.RAM; - layout.Mem8000 = MemoryDesignation.RAM; - layout.MemA000 = MemoryDesignation.RAM; - layout.MemC000 = MemoryDesignation.RAM; - layout.MemD000 = MemoryDesignation.RAM; - layout.MemE000 = MemoryDesignation.RAM; - } - else if (loRom && hiRom && gamePin && !exRomPin) - { - layout.Mem1000 = MemoryDesignation.RAM; - layout.Mem8000 = MemoryDesignation.ROMLo; - layout.MemA000 = MemoryDesignation.Basic; - layout.MemC000 = MemoryDesignation.RAM; - layout.MemD000 = ioEnable ? MemoryDesignation.IO : MemoryDesignation.Character; - layout.MemE000 = MemoryDesignation.Kernal; - } - else if (!loRom && hiRom && !gamePin && !exRomPin) - { - layout.Mem1000 = MemoryDesignation.RAM; - layout.Mem8000 = MemoryDesignation.RAM; - layout.MemA000 = MemoryDesignation.ROMHi; - layout.MemC000 = MemoryDesignation.RAM; - layout.MemD000 = ioEnable ? MemoryDesignation.IO : MemoryDesignation.Character; - layout.MemE000 = MemoryDesignation.Kernal; - } - else if (loRom && hiRom && !gamePin && !exRomPin) - { - layout.Mem1000 = MemoryDesignation.RAM; - layout.Mem8000 = MemoryDesignation.ROMLo; - layout.MemA000 = MemoryDesignation.ROMHi; - layout.MemC000 = MemoryDesignation.RAM; - layout.MemD000 = ioEnable ? MemoryDesignation.IO : MemoryDesignation.Character; - layout.MemE000 = MemoryDesignation.Kernal; - } - else if (!gamePin && exRomPin) - { - layout.Mem1000 = MemoryDesignation.Disabled; - layout.Mem8000 = MemoryDesignation.ROMLo; - layout.MemA000 = MemoryDesignation.Disabled; - layout.MemC000 = MemoryDesignation.Disabled; - layout.MemD000 = MemoryDesignation.IO; - layout.MemE000 = MemoryDesignation.ROMHi; - } - } - - private void UpdateVicOffset() - { - switch (cia1.Peek(0x00) & 0x03) - { - case 0: - vicCharEnabled = false; - vicOffset = 0xC000; - break; - case 1: - vicCharEnabled = true; - vicOffset = 0x8000; - break; - case 2: - vicCharEnabled = false; - vicOffset = 0x4000; - break; - default: - vicCharEnabled = true; - vicOffset = 0x0000; - break; - } - } - - public byte VicRead(ushort addr) - { - addr = (ushort)(addr & 0x3FFF); - if (vicCharEnabled && (addr >= 0x1000 && addr < 0x2000)) - { - return charRom[addr & 0x0FFF]; - } - else - { - return ram[addr | vicOffset]; - } - } - - public void WipeMemory() - { - // memory is striped in sections 00/FF - for (int i = 0; i < 0x10000; i += 0x80) - { - for (int j = 0; j < 0x40; j++) - ram[i + j] = 0x00; - for (int j = 0x40; j < 0x80; j++) - ram[i + j] = 0xFF; - } - for (int i = 0; i < 0x1000; i++) - { - colorRam[i] = 0x0E; - } - } - - public void Write(ushort addr, byte val) - { - if (addr == 0x0000) - { - cpuPort.Direction = val; - } - else if (addr == 0x0001) - { - cpuPort.Data = val; - } - else - { - MemoryDesignation des = GetDesignation(addr); - - switch (des) - { - case MemoryDesignation.Vic: - vic.Write(addr, val); - break; - case MemoryDesignation.Sid: - sid.Write(addr, val); - break; - case MemoryDesignation.ColorRam: - colorRam[addr & 0x03FF] = (byte)(val & 0x0F); - break; - case MemoryDesignation.Cia0: - cia0.Write(addr, val); - break; - case MemoryDesignation.Cia1: - cia1.Write(addr, val); - break; - case MemoryDesignation.Expansion0: - if (cart != null) - cart.WritePort(addr, val); - break; - case MemoryDesignation.Expansion1: - break; - case MemoryDesignation.RAM: - break; - default: - break; - } - - // write through to ram - if (des != MemoryDesignation.Disabled) - { - ram[addr] = val; - } - } - busData = val; - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/IMedia.cs b/BizHawk.Emulation/Computers/Commodore64/Memory.cs similarity index 63% rename from BizHawk.Emulation/Computers/Commodore64/IMedia.cs rename to BizHawk.Emulation/Computers/Commodore64/Memory.cs index 2e1e89f70e..0120cd5eda 100644 --- a/BizHawk.Emulation/Computers/Commodore64/IMedia.cs +++ b/BizHawk.Emulation/Computers/Commodore64/Memory.cs @@ -5,10 +5,7 @@ using System.Text; namespace BizHawk.Emulation.Computers.Commodore64 { - public interface IMedia + class Memory { - void Apply(); - bool Loaded(); - bool Ready(); } } diff --git a/BizHawk.Emulation/Computers/Commodore64/PRGFile.cs b/BizHawk.Emulation/Computers/Commodore64/PRGFile.cs deleted file mode 100644 index 30e9a8f4ca..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/PRGFile.cs +++ /dev/null @@ -1,58 +0,0 @@ -using BizHawk.Emulation.CPUs.M6502; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public class PRGFile : IMedia - { - private MOS6502X cpu; - private byte[] data; - private bool loaded; - private Memory mem; - - public PRGFile(byte[] file, Memory checkMem, MOS6502X targetCpu) - { - cpu = targetCpu; - mem = checkMem; - data = file; - } - - public void Apply() - { - int address = data[1]; - address <<= 8; - address |= data[0]; - - int count = data.Length; - - for (int i = 2; i < count; i++) - { - mem.Write((ushort)(address & 0xFFFF), data[i]); - address++; - } - loaded = true; - } - - public bool Loaded() - { - return loaded; - } - - public bool Ready() - { - // wait for READY. to be on display - return ( - mem[0x04C8] == 0x12 && - mem[0x04C9] == 0x05 && - mem[0x04CA] == 0x01 && - mem[0x04CB] == 0x04 && - mem[0x04CC] == 0x19 && - mem[0x04CD] == 0x2E && - mem[0x04CE] == 0x20 - ); - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/SerialCable.cs b/BizHawk.Emulation/Computers/Commodore64/SerialCable.cs deleted file mode 100644 index 01488bb752..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/SerialCable.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public class DataPortSerialInputConverter : DataPortConverter - { - public override byte Convert(byte local, byte remote) - { - int via = (local & 0x70); - via |= ((remote & 0x08) == 0) ? 0x80 : 0x00; //CIA ATNOUT - VIA ATNIN - via |= ((remote & 0x10) == 0) ? 0x04 : 0x00; //CIA CLKOUT - VIA CLKIN - via |= ((remote & 0x20) == 0) ? 0x01 : 0x00; //CIA DATOUT - VIA DATIN - via |= ((remote & 0x40) == 0) ? 0x08 : 0x00; //CIA CLKIN - VIA CLKOUT - via |= ((remote & 0x80) == 0) ? 0x02 : 0x00; //CIA DATIN - VIA DATOUT - return (byte)via; - } - } - - public class DataPortSerialOutputConverter : DataPortConverter - { - public override byte Convert(byte local, byte remote) - { - int cia = (remote & 0x7); - cia |= ((local & 0x01) == 0) ? 0x20 : 0x00; //VIA DATIN - CIA DATOUT - cia |= ((local & 0x02) == 0) ? 0x80 : 0x00; //VIA DATOUT - CIA DATIN - cia |= ((local & 0x04) == 0) ? 0x10 : 0x00; //VIA CLKIN - CIA CLKOUT - cia |= ((local & 0x08) == 0) ? 0x40 : 0x00; //VIA CLKOUT - CIA CLKIN - cia |= ((local & 0x80) == 0) ? 0x08 : 0x00; //VIA DATIN - CIA DATOUT - return (byte)cia; - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/Sid.cs b/BizHawk.Emulation/Computers/Commodore64/Sid.cs deleted file mode 100644 index 26c40366a8..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/Sid.cs +++ /dev/null @@ -1,305 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public enum SidMode - { - Sid6581, - Sid8580 - } - - public class VoiceRegs - { - public EnvelopeGenerator Envelope; - public WaveformGenerator Generator; - public WaveformGenerator SyncSource; - - public int EnvelopeLatch; - public int GeneratorLatch; - - public VoiceRegs() - { - Envelope = new EnvelopeGenerator(); - Generator = new WaveformGenerator(); - } - - public void Clock() - { - Generator.Clock(); - GeneratorLatch = Generator.Output(SyncSource); - Envelope.Clock(); - EnvelopeLatch = Envelope.Output; - } - - public short Output() - { - int result = (GeneratorLatch * EnvelopeLatch) >> 4; - result -= 32768; - if (result > 32767) - result = 32767; - else if (result < -32768) - result = -32768; - return (short)result; - } - - public void Reset() - { - Generator.Reset(); - Envelope.Reset(); - } - } - - public class SidRegs - { - public bool BP; - public bool D3; - public int FC; - public bool[] FILT = new bool[3]; - public bool FILTEX; - public bool HP; - public bool LP; - public int POTX; - public int POTY; - public int RES; - public int VOL; - - public VoiceRegs[] Voices; - - public SidRegs() - { - Voices = new VoiceRegs[3]; - Voices[0] = new VoiceRegs(); - Voices[1] = new VoiceRegs(); - Voices[2] = new VoiceRegs(); - - Voices[0].SyncSource = Voices[2].Generator; - Voices[1].SyncSource = Voices[0].Generator; - Voices[2].SyncSource = Voices[1].Generator; - } - - public byte this[int addr] - { - - get - { - int result; - - addr &= 0x1F; - switch (addr) - { - case 0x19: - result = POTX; - break; - case 0x1A: - result = POTY; - break; - case 0x1B: - result = Voices[2].GeneratorLatch >> 4; - break; - case 0x1C: - result = Voices[2].EnvelopeLatch; - break; - default: - result = 0; - break; - } - return (byte)(result & 0xFF); - } - set - { - int val = value; - int index; - - addr &= 0x1F; - switch (addr) - { - case 0x00: - case 0x07: - case 0x0E: - index = addr / 7; - Voices[index].Generator.Frequency &= 0xFF00; - Voices[index].Generator.Frequency |= value; - break; - case 0x01: - case 0x08: - case 0x0F: - index = addr / 7; - Voices[index].Generator.Frequency &= 0xFF; - Voices[index].Generator.Frequency |= (int)value << 8; - break; - case 0x02: - case 0x09: - case 0x10: - index = addr / 7; - Voices[index].Generator.PulseWidth &= 0x0F00; - Voices[index].Generator.PulseWidth |= value; - break; - case 0x03: - case 0x0A: - case 0x11: - index = addr / 7; - Voices[index].Generator.PulseWidth &= 0xFF; - Voices[index].Generator.PulseWidth |= (int)(value & 0xF) << 8; - break; - case 0x04: - case 0x0B: - case 0x12: - index = addr / 7; - Voices[index].Generator.Control = value; - Voices[index].Envelope.Gate = ((value & 0x01) != 0x00); - break; - case 0x05: - case 0x0C: - case 0x13: - index = addr / 7; - Voices[index].Envelope.Attack = (value >> 4); - Voices[index].Envelope.Decay = (value & 0xF); - break; - case 0x06: - case 0x0D: - case 0x14: - index = addr / 7; - Voices[index].Envelope.Sustain = (value >> 4); - Voices[index].Envelope.Release = (value & 0xF); - break; - case 0x15: - FC &= 0x7F8; - FC |= val & 0x7; - break; - case 0x16: - FC &= 0x7; - FC |= val << 3; - break; - case 0x17: - FILT[0] = ((val & 0x01) != 0x00); - FILT[1] = ((val & 0x02) != 0x00); - FILT[2] = ((val & 0x04) != 0x00); - FILTEX = ((val & 0x08) != 0x00); - RES = (val >> 4); - break; - case 0x18: - VOL = (val & 0xF); - LP = ((val & 0x10) != 0x00); - BP = ((val & 0x20) != 0x00); - HP = ((val & 0x40) != 0x00); - D3 = ((val & 0x80) != 0x00); - break; - } - } - } - - } - - public partial class Sid : ISoundProvider - { - private int[] syncIndex = { 2, 0, 1 }; - - private VoiceRegs[] voices; - - public Func ReadPotX; - public Func ReadPotY; - - public int clock; - public int cyclesPerSample; - public int output; - public SidRegs regs; - - public Sid(Region newRegion, int sampleRate) - { - ReadPotX = DummyReadPot; - ReadPotY = DummyReadPot; - switch (newRegion) - { - case Region.NTSC: - cyclesPerSample = 14318181 / 14 / sampleRate; - break; - case Region.PAL: - cyclesPerSample = 17734472 / 18 / sampleRate; - break; - } - InitSound(sampleRate); - HardReset(); - } - - private int DummyReadPot() - { - return 0; - } - - public void HardReset() - { - regs = new SidRegs(); - voices = regs.Voices; - } - - public byte Peek(int addr) - { - return regs[addr & 0x1F]; - } - - public void PerformCycle() - { - // process each voice - voices[0].Clock(); - voices[1].Clock(); - voices[2].Clock(); - - // sync voices - voices[0].Generator.Synchronize(voices[1].Generator, voices[2].Generator); - voices[1].Generator.Synchronize(voices[2].Generator, voices[0].Generator); - voices[2].Generator.Synchronize(voices[0].Generator, voices[1].Generator); - - // finalize sample and put into buffer - SubmitSample(); - - // query pots every 512 cycles - if ((clock & 0x1FF) == 0x000) - { - regs.POTX = ReadPotX() & 0xFF; - regs.POTY = ReadPotY() & 0xFF; - } - - clock = (clock + 1) & 0xFFFFFF; - } - - public void Poke(int addr, byte val) - { - regs[addr & 0x1F] = val; - } - - public byte Read(ushort addr) - { - addr &= 0x1F; - switch (addr) - { - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - // can only read these regs - return regs[addr]; - default: - return 0; - } - } - - public void Write(ushort addr, byte val) - { - addr &= 0x1F; - switch (addr) - { - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - // can't write these regs - break; - default: - regs[addr] = val; - break; - } - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/SidEnvelopeGenerator.cs b/BizHawk.Emulation/Computers/Commodore64/SidEnvelopeGenerator.cs deleted file mode 100644 index 49c98b114e..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/SidEnvelopeGenerator.cs +++ /dev/null @@ -1,255 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - - // constants for the EnvelopeGenerator and calculation - // methods are based from the libsidplayfp residfp library. - - public partial class EnvelopeGenerator - { - public enum EnvelopeState - { - Attack, Decay, Release - } - - // value table for the envelope shift register - static int[] adsrTable = new int[] - { - 0x7F00, 0x0006, 0x003C, 0x0330, - 0x20C0, 0x6755, 0x3800, 0x500E, - 0x1212, 0x0222, 0x1848, 0x59B8, - 0x3840, 0x77E2, 0x7625, 0x0A93 - }; - - int attack; - int decay; - bool gate; - int release; - int sustain; - - public byte envelopeCounter; - public bool envelopeProcessEnabled; - public int exponentialCounter; - public int exponentialCounterPeriod; - public bool freeze; - public int lfsr; - public int rate; - public EnvelopeState state; - - public EnvelopeGenerator() - { - Reset(); - } - - public int Attack - { - get - { - return attack; - } - set - { - attack = value; - if (state == EnvelopeState.Attack) - rate = adsrTable[attack]; - } - } - - public void Clock() - { - if (envelopeProcessEnabled) - { - envelopeProcessEnabled = false; - envelopeCounter--; - UpdateExponentialCounter(); - } - - if (lfsr != rate) - { - int feedback = ((lfsr >> 14) ^ (lfsr >> 13)) & 0x01; - lfsr = ((lfsr << 1) & 0x7FFF) | feedback; - return; - } - - lfsr = 0x7FFF; - - if ((state == EnvelopeState.Attack) || (++exponentialCounter == exponentialCounterPeriod)) - { - exponentialCounter = 0; - if (!freeze) - { - switch (state) - { - case EnvelopeState.Attack: - ++envelopeCounter; - if (envelopeCounter == 0xFF) - { - state = EnvelopeState.Decay; - rate = adsrTable[decay]; - } - break; - case EnvelopeState.Decay: - if (envelopeCounter == ((sustain << 4) | sustain)) - { - return; - } - if (exponentialCounterPeriod != 1) - { - envelopeProcessEnabled = true; - return; - } - envelopeCounter--; - break; - case EnvelopeState.Release: - if (exponentialCounterPeriod != 1) - { - envelopeProcessEnabled = true; - return; - } - envelopeCounter--; - break; - } - - UpdateExponentialCounter(); - } - } - } - - public int Decay - { - get - { - return decay; - } - set - { - decay = value; - if (state == EnvelopeState.Decay) - rate = adsrTable[decay]; - } - } - - public bool Gate - { - get - { - return gate; - } - set - { - bool gateThis = value; - - if (!gate && gateThis) - { - state = EnvelopeState.Attack; - rate = adsrTable[attack]; - freeze = false; - envelopeProcessEnabled = false; - } - else if (gate && !gateThis) - { - state = EnvelopeState.Release; - rate = adsrTable[release]; - } - - gate = gateThis; - } - } - - public short Output - { - get - { - return envelopeCounter; - } - } - - public int Release - { - get - { - return release; - } - set - { - release = value; - if (state == EnvelopeState.Release) - rate = adsrTable[release]; - } - } - - public void Reset() - { - attack = 0; - decay = 0; - sustain = 0; - release = 0; - gate = false; - - envelopeCounter = 0; - envelopeProcessEnabled = false; - exponentialCounter = 0; - exponentialCounterPeriod = 1; - - lfsr = 0x7FFF; - state = EnvelopeState.Release; - rate = adsrTable[release]; - freeze = true; - } - - public void SetState(int stateAtk, int stateDcy, int stateSus, int stateRls, bool stateGate, EnvelopeState stateState) - { - attack = stateAtk; - decay = stateDcy; - sustain = stateSus; - release = stateRls; - gate = stateGate; - state = stateState; - } - - public int Sustain - { - get - { - return sustain; - } - set - { - sustain = value; - } - } - - private void UpdateExponentialCounter() - { - switch (envelopeCounter) - { - case 0x00: - exponentialCounterPeriod = 1; - freeze = true; - break; - case 0x06: - exponentialCounterPeriod = 30; - break; - case 0x0E: - exponentialCounterPeriod = 16; - break; - case 0x1A: - exponentialCounterPeriod = 8; - break; - case 0x36: - exponentialCounterPeriod = 4; - break; - case 0x5D: - exponentialCounterPeriod = 2; - break; - case 0xFF: - exponentialCounterPeriod = 1; - break; - } - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/SidSoundProvider.cs b/BizHawk.Emulation/Computers/Commodore64/SidSoundProvider.cs deleted file mode 100644 index 8def5b465f..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/SidSoundProvider.cs +++ /dev/null @@ -1,143 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class Sid : ISoundProvider - { - private short[] sampleBuffer; - private int sampleBufferCapacity; - private int sampleBufferCount; - private int sampleBufferIndex; - private int sampleBufferReadIndex; - private int sampleCounter; - - public void DiscardSamples() - { - sampleBuffer = new short[sampleBufferCapacity]; - ResetBuffer(); - } - - public short[] GetAllSamples() - { - if (sampleBufferCount > 0) - { - short[] samples = new short[sampleBufferCount]; - GetSamples(samples); - return samples; - } - else - { - return new short[] { }; - } - } - - public void GetSamples(short[] samples) - { - int count = samples.Length; - int copied = 0; - - while (copied < count) - { - samples[copied] = sampleBuffer[sampleBufferReadIndex]; - if (sampleBufferIndex != sampleBufferReadIndex) - sampleBufferReadIndex++; - copied++; - if (sampleBufferReadIndex == sampleBufferCapacity) - sampleBufferReadIndex = 0; - } - - // catch buffer up - sampleBufferReadIndex = sampleBufferIndex; - sampleBufferCount = 0; - } - - private void InitSound(int initSampleRate) - { - sampleBufferCapacity = initSampleRate; - DiscardSamples(); - } - - public int MaxVolume - { - get - { - return 0; - } - set - { - } - } - - private void ResetBuffer() - { - sampleBufferReadIndex = 0; - sampleBufferIndex = 0; - } - - private void SubmitSample() - { - if (sampleCounter == 0) - { - int mixer; - - mixer = voices[0].Output(); - mixer += voices[1].Output(); - if (!regs.D3 || !regs.FILT[2]) - mixer += voices[2].Output(); - - // apply volume - mixer *= regs.VOL; - mixer >>= 4; - - // apply filter - // (todo) - - // the mixer is very loud at this point, let's make it quieter - mixer /= 4; - - if (mixer > 32767) - mixer = 326767; - else if (mixer < -32768) - mixer = -32768; - - short output = (short)mixer; - - // run twice since the buffer expects stereo sound (I THINK) - for (int i = 0; i < 2; i++) - { - sampleBufferIndex++; - sampleBufferCount++; - if (sampleBufferIndex == sampleBufferCapacity) - sampleBufferIndex = 0; - sampleBuffer[sampleBufferIndex] = output; - } - sampleCounter = cyclesPerSample; - } - sampleCounter--; - } - } - - public class SidSyncSoundProvider : ISyncSoundProvider - { - private Sid sid; - - public SidSyncSoundProvider(Sid source) - { - sid = source; - } - - public void DiscardSamples() - { - sid.DiscardSamples(); - } - - public void GetSamples(out short[] samples, out int nsamp) - { - samples = sid.GetAllSamples(); - nsamp = samples.Length / 2; - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/SidState.cs b/BizHawk.Emulation/Computers/Commodore64/SidState.cs deleted file mode 100644 index 40a2e5baf0..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/SidState.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class Sid : ISoundProvider - { - public void SyncState(Serializer ser) - { - // voices - for (int i = 0; i < 3; i++) - { - string iTag = i.ToString(); - ser.Sync("GENACCUM" + iTag, ref regs.Voices[i].Generator.accumulator); - ser.Sync("GENFOTTL" + iTag, ref regs.Voices[i].Generator.floatingOutputTtl); - ser.Sync("GENMSBRISING" + iTag, ref regs.Voices[i].Generator.msbRising); - ser.Sync("GENNOISEOUT" + iTag, ref regs.Voices[i].Generator.noiseOutput); - ser.Sync("GENPULSEOUT" + iTag, ref regs.Voices[i].Generator.pulseOutput); - ser.Sync("GENSR" + iTag, ref regs.Voices[i].Generator.shiftRegister); - ser.Sync("GENSRDELAY" + iTag, ref regs.Voices[i].Generator.shiftRegisterDelay); - ser.Sync("GENSRRESETDELAY" + iTag, ref regs.Voices[i].Generator.shiftRegisterResetDelay); - ser.Sync("GENWAVEFORMOUT" + iTag, ref regs.Voices[i].Generator.waveformOutput); - - ser.Sync("ENVCOUNTER" + iTag, ref regs.Voices[i].Envelope.envelopeCounter); - ser.Sync("ENVENABLE" + iTag, ref regs.Voices[i].Envelope.envelopeProcessEnabled); - ser.Sync("ENVEXPCOUNTER" + iTag, ref regs.Voices[i].Envelope.exponentialCounter); - ser.Sync("ENVEXPCOUNTERPERIOD" + iTag, ref regs.Voices[i].Envelope.exponentialCounterPeriod); - ser.Sync("ENVFREEZE" + iTag, ref regs.Voices[i].Envelope.freeze); - ser.Sync("ENVLFSR" + iTag, ref regs.Voices[i].Envelope.lfsr); - ser.Sync("ENVRATE" + iTag, ref regs.Voices[i].Envelope.rate); - - byte control = regs.Voices[i].Generator.Control; - int freq = regs.Voices[i].Generator.Frequency; - int pw = regs.Voices[i].Generator.PulseWidth; - int attack = regs.Voices[i].Envelope.Attack; - int decay = regs.Voices[i].Envelope.Decay; - int sustain = regs.Voices[i].Envelope.Sustain; - int release = regs.Voices[i].Envelope.Release; - bool gate = regs.Voices[i].Envelope.Gate; - int state = (int)regs.Voices[i].Envelope.state; - - ser.Sync("GENCONTROL" + iTag, ref control); - ser.Sync("GENFREQ" + iTag, ref freq); - ser.Sync("GENPW" + iTag, ref pw); - ser.Sync("ENVATTACK" + iTag, ref attack); - ser.Sync("ENVDECAY" + iTag, ref decay); - ser.Sync("ENVSUSTAIN" + iTag, ref sustain); - ser.Sync("ENVRELEASE" + iTag, ref release); - ser.Sync("ENVGATE" + iTag, ref gate); - ser.Sync("ENVSTATE" + iTag, ref state); - - if (ser.IsReader) - { - regs.Voices[i].Generator.SetState(control, freq, pw); - regs.Voices[i].Envelope.SetState(attack, decay, sustain, release, gate, (EnvelopeGenerator.EnvelopeState)state); - } - } - - // regs - ser.Sync("BP", ref regs.BP); - ser.Sync("D3", ref regs.D3); - ser.Sync("FC", ref regs.FC); - ser.Sync("FILT0", ref regs.FILT[0]); - ser.Sync("FILT1", ref regs.FILT[1]); - ser.Sync("FILT2", ref regs.FILT[2]); - ser.Sync("FILTEX", ref regs.FILTEX); - ser.Sync("HP", ref regs.HP); - ser.Sync("LP", ref regs.LP); - ser.Sync("POTX", ref regs.POTX); - ser.Sync("POTY", ref regs.POTY); - ser.Sync("RES", ref regs.RES); - ser.Sync("VOL", ref regs.VOL); - - // vars - ser.Sync("CLOCK", ref clock); - ser.Sync("CYCLESPERSAMPLE", ref cyclesPerSample); - ser.Sync("OUTPUT", ref output); - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/SidWaveformCalculator.cs b/BizHawk.Emulation/Computers/Commodore64/SidWaveformCalculator.cs deleted file mode 100644 index 9f2ff6f182..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/SidWaveformCalculator.cs +++ /dev/null @@ -1,4125 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class WaveformGenerator - { - private static short[][] WaveformSamples = new short[][] { - new short[] { - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF - }, - new short[] { - 0x000, 0x002, 0x004, 0x006, 0x008, 0x00A, 0x00C, 0x00E, - 0x010, 0x012, 0x014, 0x016, 0x018, 0x01A, 0x01C, 0x01E, - 0x020, 0x022, 0x024, 0x026, 0x028, 0x02A, 0x02C, 0x02E, - 0x030, 0x032, 0x034, 0x036, 0x038, 0x03A, 0x03C, 0x03E, - 0x040, 0x042, 0x044, 0x046, 0x048, 0x04A, 0x04C, 0x04E, - 0x050, 0x052, 0x054, 0x056, 0x058, 0x05A, 0x05C, 0x05E, - 0x060, 0x062, 0x064, 0x066, 0x068, 0x06A, 0x06C, 0x06E, - 0x070, 0x072, 0x074, 0x076, 0x078, 0x07A, 0x07C, 0x07E, - 0x080, 0x082, 0x084, 0x086, 0x088, 0x08A, 0x08C, 0x08E, - 0x090, 0x092, 0x094, 0x096, 0x098, 0x09A, 0x09C, 0x09E, - 0x0A0, 0x0A2, 0x0A4, 0x0A6, 0x0A8, 0x0AA, 0x0AC, 0x0AE, - 0x0B0, 0x0B2, 0x0B4, 0x0B6, 0x0B8, 0x0BA, 0x0BC, 0x0BE, - 0x0C0, 0x0C2, 0x0C4, 0x0C6, 0x0C8, 0x0CA, 0x0CC, 0x0CE, - 0x0D0, 0x0D2, 0x0D4, 0x0D6, 0x0D8, 0x0DA, 0x0DC, 0x0DE, - 0x0E0, 0x0E2, 0x0E4, 0x0E6, 0x0E8, 0x0EA, 0x0EC, 0x0EE, - 0x0F0, 0x0F2, 0x0F4, 0x0F6, 0x0F8, 0x0FA, 0x0FC, 0x0FE, - 0x100, 0x102, 0x104, 0x106, 0x108, 0x10A, 0x10C, 0x10E, - 0x110, 0x112, 0x114, 0x116, 0x118, 0x11A, 0x11C, 0x11E, - 0x120, 0x122, 0x124, 0x126, 0x128, 0x12A, 0x12C, 0x12E, - 0x130, 0x132, 0x134, 0x136, 0x138, 0x13A, 0x13C, 0x13E, - 0x140, 0x142, 0x144, 0x146, 0x148, 0x14A, 0x14C, 0x14E, - 0x150, 0x152, 0x154, 0x156, 0x158, 0x15A, 0x15C, 0x15E, - 0x160, 0x162, 0x164, 0x166, 0x168, 0x16A, 0x16C, 0x16E, - 0x170, 0x172, 0x174, 0x176, 0x178, 0x17A, 0x17C, 0x17E, - 0x180, 0x182, 0x184, 0x186, 0x188, 0x18A, 0x18C, 0x18E, - 0x190, 0x192, 0x194, 0x196, 0x198, 0x19A, 0x19C, 0x19E, - 0x1A0, 0x1A2, 0x1A4, 0x1A6, 0x1A8, 0x1AA, 0x1AC, 0x1AE, - 0x1B0, 0x1B2, 0x1B4, 0x1B6, 0x1B8, 0x1BA, 0x1BC, 0x1BE, - 0x1C0, 0x1C2, 0x1C4, 0x1C6, 0x1C8, 0x1CA, 0x1CC, 0x1CE, - 0x1D0, 0x1D2, 0x1D4, 0x1D6, 0x1D8, 0x1DA, 0x1DC, 0x1DE, - 0x1E0, 0x1E2, 0x1E4, 0x1E6, 0x1E8, 0x1EA, 0x1EC, 0x1EE, - 0x1F0, 0x1F2, 0x1F4, 0x1F6, 0x1F8, 0x1FA, 0x1FC, 0x1FE, - 0x200, 0x202, 0x204, 0x206, 0x208, 0x20A, 0x20C, 0x20E, - 0x210, 0x212, 0x214, 0x216, 0x218, 0x21A, 0x21C, 0x21E, - 0x220, 0x222, 0x224, 0x226, 0x228, 0x22A, 0x22C, 0x22E, - 0x230, 0x232, 0x234, 0x236, 0x238, 0x23A, 0x23C, 0x23E, - 0x240, 0x242, 0x244, 0x246, 0x248, 0x24A, 0x24C, 0x24E, - 0x250, 0x252, 0x254, 0x256, 0x258, 0x25A, 0x25C, 0x25E, - 0x260, 0x262, 0x264, 0x266, 0x268, 0x26A, 0x26C, 0x26E, - 0x270, 0x272, 0x274, 0x276, 0x278, 0x27A, 0x27C, 0x27E, - 0x280, 0x282, 0x284, 0x286, 0x288, 0x28A, 0x28C, 0x28E, - 0x290, 0x292, 0x294, 0x296, 0x298, 0x29A, 0x29C, 0x29E, - 0x2A0, 0x2A2, 0x2A4, 0x2A6, 0x2A8, 0x2AA, 0x2AC, 0x2AE, - 0x2B0, 0x2B2, 0x2B4, 0x2B6, 0x2B8, 0x2BA, 0x2BC, 0x2BE, - 0x2C0, 0x2C2, 0x2C4, 0x2C6, 0x2C8, 0x2CA, 0x2CC, 0x2CE, - 0x2D0, 0x2D2, 0x2D4, 0x2D6, 0x2D8, 0x2DA, 0x2DC, 0x2DE, - 0x2E0, 0x2E2, 0x2E4, 0x2E6, 0x2E8, 0x2EA, 0x2EC, 0x2EE, - 0x2F0, 0x2F2, 0x2F4, 0x2F6, 0x2F8, 0x2FA, 0x2FC, 0x2FE, - 0x300, 0x302, 0x304, 0x306, 0x308, 0x30A, 0x30C, 0x30E, - 0x310, 0x312, 0x314, 0x316, 0x318, 0x31A, 0x31C, 0x31E, - 0x320, 0x322, 0x324, 0x326, 0x328, 0x32A, 0x32C, 0x32E, - 0x330, 0x332, 0x334, 0x336, 0x338, 0x33A, 0x33C, 0x33E, - 0x340, 0x342, 0x344, 0x346, 0x348, 0x34A, 0x34C, 0x34E, - 0x350, 0x352, 0x354, 0x356, 0x358, 0x35A, 0x35C, 0x35E, - 0x360, 0x362, 0x364, 0x366, 0x368, 0x36A, 0x36C, 0x36E, - 0x370, 0x372, 0x374, 0x376, 0x378, 0x37A, 0x37C, 0x37E, - 0x380, 0x382, 0x384, 0x386, 0x388, 0x38A, 0x38C, 0x38E, - 0x390, 0x392, 0x394, 0x396, 0x398, 0x39A, 0x39C, 0x39E, - 0x3A0, 0x3A2, 0x3A4, 0x3A6, 0x3A8, 0x3AA, 0x3AC, 0x3AE, - 0x3B0, 0x3B2, 0x3B4, 0x3B6, 0x3B8, 0x3BA, 0x3BC, 0x3BE, - 0x3C0, 0x3C2, 0x3C4, 0x3C6, 0x3C8, 0x3CA, 0x3CC, 0x3CE, - 0x3D0, 0x3D2, 0x3D4, 0x3D6, 0x3D8, 0x3DA, 0x3DC, 0x3DE, - 0x3E0, 0x3E2, 0x3E4, 0x3E6, 0x3E8, 0x3EA, 0x3EC, 0x3EE, - 0x3F0, 0x3F2, 0x3F4, 0x3F6, 0x3F8, 0x3FA, 0x3FC, 0x3FE, - 0x400, 0x402, 0x404, 0x406, 0x408, 0x40A, 0x40C, 0x40E, - 0x410, 0x412, 0x414, 0x416, 0x418, 0x41A, 0x41C, 0x41E, - 0x420, 0x422, 0x424, 0x426, 0x428, 0x42A, 0x42C, 0x42E, - 0x430, 0x432, 0x434, 0x436, 0x438, 0x43A, 0x43C, 0x43E, - 0x440, 0x442, 0x444, 0x446, 0x448, 0x44A, 0x44C, 0x44E, - 0x450, 0x452, 0x454, 0x456, 0x458, 0x45A, 0x45C, 0x45E, - 0x460, 0x462, 0x464, 0x466, 0x468, 0x46A, 0x46C, 0x46E, - 0x470, 0x472, 0x474, 0x476, 0x478, 0x47A, 0x47C, 0x47E, - 0x480, 0x482, 0x484, 0x486, 0x488, 0x48A, 0x48C, 0x48E, - 0x490, 0x492, 0x494, 0x496, 0x498, 0x49A, 0x49C, 0x49E, - 0x4A0, 0x4A2, 0x4A4, 0x4A6, 0x4A8, 0x4AA, 0x4AC, 0x4AE, - 0x4B0, 0x4B2, 0x4B4, 0x4B6, 0x4B8, 0x4BA, 0x4BC, 0x4BE, - 0x4C0, 0x4C2, 0x4C4, 0x4C6, 0x4C8, 0x4CA, 0x4CC, 0x4CE, - 0x4D0, 0x4D2, 0x4D4, 0x4D6, 0x4D8, 0x4DA, 0x4DC, 0x4DE, - 0x4E0, 0x4E2, 0x4E4, 0x4E6, 0x4E8, 0x4EA, 0x4EC, 0x4EE, - 0x4F0, 0x4F2, 0x4F4, 0x4F6, 0x4F8, 0x4FA, 0x4FC, 0x4FE, - 0x500, 0x502, 0x504, 0x506, 0x508, 0x50A, 0x50C, 0x50E, - 0x510, 0x512, 0x514, 0x516, 0x518, 0x51A, 0x51C, 0x51E, - 0x520, 0x522, 0x524, 0x526, 0x528, 0x52A, 0x52C, 0x52E, - 0x530, 0x532, 0x534, 0x536, 0x538, 0x53A, 0x53C, 0x53E, - 0x540, 0x542, 0x544, 0x546, 0x548, 0x54A, 0x54C, 0x54E, - 0x550, 0x552, 0x554, 0x556, 0x558, 0x55A, 0x55C, 0x55E, - 0x560, 0x562, 0x564, 0x566, 0x568, 0x56A, 0x56C, 0x56E, - 0x570, 0x572, 0x574, 0x576, 0x578, 0x57A, 0x57C, 0x57E, - 0x580, 0x582, 0x584, 0x586, 0x588, 0x58A, 0x58C, 0x58E, - 0x590, 0x592, 0x594, 0x596, 0x598, 0x59A, 0x59C, 0x59E, - 0x5A0, 0x5A2, 0x5A4, 0x5A6, 0x5A8, 0x5AA, 0x5AC, 0x5AE, - 0x5B0, 0x5B2, 0x5B4, 0x5B6, 0x5B8, 0x5BA, 0x5BC, 0x5BE, - 0x5C0, 0x5C2, 0x5C4, 0x5C6, 0x5C8, 0x5CA, 0x5CC, 0x5CE, - 0x5D0, 0x5D2, 0x5D4, 0x5D6, 0x5D8, 0x5DA, 0x5DC, 0x5DE, - 0x5E0, 0x5E2, 0x5E4, 0x5E6, 0x5E8, 0x5EA, 0x5EC, 0x5EE, - 0x5F0, 0x5F2, 0x5F4, 0x5F6, 0x5F8, 0x5FA, 0x5FC, 0x5FE, - 0x600, 0x602, 0x604, 0x606, 0x608, 0x60A, 0x60C, 0x60E, - 0x610, 0x612, 0x614, 0x616, 0x618, 0x61A, 0x61C, 0x61E, - 0x620, 0x622, 0x624, 0x626, 0x628, 0x62A, 0x62C, 0x62E, - 0x630, 0x632, 0x634, 0x636, 0x638, 0x63A, 0x63C, 0x63E, - 0x640, 0x642, 0x644, 0x646, 0x648, 0x64A, 0x64C, 0x64E, - 0x650, 0x652, 0x654, 0x656, 0x658, 0x65A, 0x65C, 0x65E, - 0x660, 0x662, 0x664, 0x666, 0x668, 0x66A, 0x66C, 0x66E, - 0x670, 0x672, 0x674, 0x676, 0x678, 0x67A, 0x67C, 0x67E, - 0x680, 0x682, 0x684, 0x686, 0x688, 0x68A, 0x68C, 0x68E, - 0x690, 0x692, 0x694, 0x696, 0x698, 0x69A, 0x69C, 0x69E, - 0x6A0, 0x6A2, 0x6A4, 0x6A6, 0x6A8, 0x6AA, 0x6AC, 0x6AE, - 0x6B0, 0x6B2, 0x6B4, 0x6B6, 0x6B8, 0x6BA, 0x6BC, 0x6BE, - 0x6C0, 0x6C2, 0x6C4, 0x6C6, 0x6C8, 0x6CA, 0x6CC, 0x6CE, - 0x6D0, 0x6D2, 0x6D4, 0x6D6, 0x6D8, 0x6DA, 0x6DC, 0x6DE, - 0x6E0, 0x6E2, 0x6E4, 0x6E6, 0x6E8, 0x6EA, 0x6EC, 0x6EE, - 0x6F0, 0x6F2, 0x6F4, 0x6F6, 0x6F8, 0x6FA, 0x6FC, 0x6FE, - 0x700, 0x702, 0x704, 0x706, 0x708, 0x70A, 0x70C, 0x70E, - 0x710, 0x712, 0x714, 0x716, 0x718, 0x71A, 0x71C, 0x71E, - 0x720, 0x722, 0x724, 0x726, 0x728, 0x72A, 0x72C, 0x72E, - 0x730, 0x732, 0x734, 0x736, 0x738, 0x73A, 0x73C, 0x73E, - 0x740, 0x742, 0x744, 0x746, 0x748, 0x74A, 0x74C, 0x74E, - 0x750, 0x752, 0x754, 0x756, 0x758, 0x75A, 0x75C, 0x75E, - 0x760, 0x762, 0x764, 0x766, 0x768, 0x76A, 0x76C, 0x76E, - 0x770, 0x772, 0x774, 0x776, 0x778, 0x77A, 0x77C, 0x77E, - 0x780, 0x782, 0x784, 0x786, 0x788, 0x78A, 0x78C, 0x78E, - 0x790, 0x792, 0x794, 0x796, 0x798, 0x79A, 0x79C, 0x79E, - 0x7A0, 0x7A2, 0x7A4, 0x7A6, 0x7A8, 0x7AA, 0x7AC, 0x7AE, - 0x7B0, 0x7B2, 0x7B4, 0x7B6, 0x7B8, 0x7BA, 0x7BC, 0x7BE, - 0x7C0, 0x7C2, 0x7C4, 0x7C6, 0x7C8, 0x7CA, 0x7CC, 0x7CE, - 0x7D0, 0x7D2, 0x7D4, 0x7D6, 0x7D8, 0x7DA, 0x7DC, 0x7DE, - 0x7E0, 0x7E2, 0x7E4, 0x7E6, 0x7E8, 0x7EA, 0x7EC, 0x7EE, - 0x7F0, 0x7F2, 0x7F4, 0x7F6, 0x7F8, 0x7FA, 0x7FC, 0x7FE, - 0x800, 0x802, 0x804, 0x806, 0x808, 0x80A, 0x80C, 0x80E, - 0x810, 0x812, 0x814, 0x816, 0x818, 0x81A, 0x81C, 0x81E, - 0x820, 0x822, 0x824, 0x826, 0x828, 0x82A, 0x82C, 0x82E, - 0x830, 0x832, 0x834, 0x836, 0x838, 0x83A, 0x83C, 0x83E, - 0x840, 0x842, 0x844, 0x846, 0x848, 0x84A, 0x84C, 0x84E, - 0x850, 0x852, 0x854, 0x856, 0x858, 0x85A, 0x85C, 0x85E, - 0x860, 0x862, 0x864, 0x866, 0x868, 0x86A, 0x86C, 0x86E, - 0x870, 0x872, 0x874, 0x876, 0x878, 0x87A, 0x87C, 0x87E, - 0x880, 0x882, 0x884, 0x886, 0x888, 0x88A, 0x88C, 0x88E, - 0x890, 0x892, 0x894, 0x896, 0x898, 0x89A, 0x89C, 0x89E, - 0x8A0, 0x8A2, 0x8A4, 0x8A6, 0x8A8, 0x8AA, 0x8AC, 0x8AE, - 0x8B0, 0x8B2, 0x8B4, 0x8B6, 0x8B8, 0x8BA, 0x8BC, 0x8BE, - 0x8C0, 0x8C2, 0x8C4, 0x8C6, 0x8C8, 0x8CA, 0x8CC, 0x8CE, - 0x8D0, 0x8D2, 0x8D4, 0x8D6, 0x8D8, 0x8DA, 0x8DC, 0x8DE, - 0x8E0, 0x8E2, 0x8E4, 0x8E6, 0x8E8, 0x8EA, 0x8EC, 0x8EE, - 0x8F0, 0x8F2, 0x8F4, 0x8F6, 0x8F8, 0x8FA, 0x8FC, 0x8FE, - 0x900, 0x902, 0x904, 0x906, 0x908, 0x90A, 0x90C, 0x90E, - 0x910, 0x912, 0x914, 0x916, 0x918, 0x91A, 0x91C, 0x91E, - 0x920, 0x922, 0x924, 0x926, 0x928, 0x92A, 0x92C, 0x92E, - 0x930, 0x932, 0x934, 0x936, 0x938, 0x93A, 0x93C, 0x93E, - 0x940, 0x942, 0x944, 0x946, 0x948, 0x94A, 0x94C, 0x94E, - 0x950, 0x952, 0x954, 0x956, 0x958, 0x95A, 0x95C, 0x95E, - 0x960, 0x962, 0x964, 0x966, 0x968, 0x96A, 0x96C, 0x96E, - 0x970, 0x972, 0x974, 0x976, 0x978, 0x97A, 0x97C, 0x97E, - 0x980, 0x982, 0x984, 0x986, 0x988, 0x98A, 0x98C, 0x98E, - 0x990, 0x992, 0x994, 0x996, 0x998, 0x99A, 0x99C, 0x99E, - 0x9A0, 0x9A2, 0x9A4, 0x9A6, 0x9A8, 0x9AA, 0x9AC, 0x9AE, - 0x9B0, 0x9B2, 0x9B4, 0x9B6, 0x9B8, 0x9BA, 0x9BC, 0x9BE, - 0x9C0, 0x9C2, 0x9C4, 0x9C6, 0x9C8, 0x9CA, 0x9CC, 0x9CE, - 0x9D0, 0x9D2, 0x9D4, 0x9D6, 0x9D8, 0x9DA, 0x9DC, 0x9DE, - 0x9E0, 0x9E2, 0x9E4, 0x9E6, 0x9E8, 0x9EA, 0x9EC, 0x9EE, - 0x9F0, 0x9F2, 0x9F4, 0x9F6, 0x9F8, 0x9FA, 0x9FC, 0x9FE, - 0xA00, 0xA02, 0xA04, 0xA06, 0xA08, 0xA0A, 0xA0C, 0xA0E, - 0xA10, 0xA12, 0xA14, 0xA16, 0xA18, 0xA1A, 0xA1C, 0xA1E, - 0xA20, 0xA22, 0xA24, 0xA26, 0xA28, 0xA2A, 0xA2C, 0xA2E, - 0xA30, 0xA32, 0xA34, 0xA36, 0xA38, 0xA3A, 0xA3C, 0xA3E, - 0xA40, 0xA42, 0xA44, 0xA46, 0xA48, 0xA4A, 0xA4C, 0xA4E, - 0xA50, 0xA52, 0xA54, 0xA56, 0xA58, 0xA5A, 0xA5C, 0xA5E, - 0xA60, 0xA62, 0xA64, 0xA66, 0xA68, 0xA6A, 0xA6C, 0xA6E, - 0xA70, 0xA72, 0xA74, 0xA76, 0xA78, 0xA7A, 0xA7C, 0xA7E, - 0xA80, 0xA82, 0xA84, 0xA86, 0xA88, 0xA8A, 0xA8C, 0xA8E, - 0xA90, 0xA92, 0xA94, 0xA96, 0xA98, 0xA9A, 0xA9C, 0xA9E, - 0xAA0, 0xAA2, 0xAA4, 0xAA6, 0xAA8, 0xAAA, 0xAAC, 0xAAE, - 0xAB0, 0xAB2, 0xAB4, 0xAB6, 0xAB8, 0xABA, 0xABC, 0xABE, - 0xAC0, 0xAC2, 0xAC4, 0xAC6, 0xAC8, 0xACA, 0xACC, 0xACE, - 0xAD0, 0xAD2, 0xAD4, 0xAD6, 0xAD8, 0xADA, 0xADC, 0xADE, - 0xAE0, 0xAE2, 0xAE4, 0xAE6, 0xAE8, 0xAEA, 0xAEC, 0xAEE, - 0xAF0, 0xAF2, 0xAF4, 0xAF6, 0xAF8, 0xAFA, 0xAFC, 0xAFE, - 0xB00, 0xB02, 0xB04, 0xB06, 0xB08, 0xB0A, 0xB0C, 0xB0E, - 0xB10, 0xB12, 0xB14, 0xB16, 0xB18, 0xB1A, 0xB1C, 0xB1E, - 0xB20, 0xB22, 0xB24, 0xB26, 0xB28, 0xB2A, 0xB2C, 0xB2E, - 0xB30, 0xB32, 0xB34, 0xB36, 0xB38, 0xB3A, 0xB3C, 0xB3E, - 0xB40, 0xB42, 0xB44, 0xB46, 0xB48, 0xB4A, 0xB4C, 0xB4E, - 0xB50, 0xB52, 0xB54, 0xB56, 0xB58, 0xB5A, 0xB5C, 0xB5E, - 0xB60, 0xB62, 0xB64, 0xB66, 0xB68, 0xB6A, 0xB6C, 0xB6E, - 0xB70, 0xB72, 0xB74, 0xB76, 0xB78, 0xB7A, 0xB7C, 0xB7E, - 0xB80, 0xB82, 0xB84, 0xB86, 0xB88, 0xB8A, 0xB8C, 0xB8E, - 0xB90, 0xB92, 0xB94, 0xB96, 0xB98, 0xB9A, 0xB9C, 0xB9E, - 0xBA0, 0xBA2, 0xBA4, 0xBA6, 0xBA8, 0xBAA, 0xBAC, 0xBAE, - 0xBB0, 0xBB2, 0xBB4, 0xBB6, 0xBB8, 0xBBA, 0xBBC, 0xBBE, - 0xBC0, 0xBC2, 0xBC4, 0xBC6, 0xBC8, 0xBCA, 0xBCC, 0xBCE, - 0xBD0, 0xBD2, 0xBD4, 0xBD6, 0xBD8, 0xBDA, 0xBDC, 0xBDE, - 0xBE0, 0xBE2, 0xBE4, 0xBE6, 0xBE8, 0xBEA, 0xBEC, 0xBEE, - 0xBF0, 0xBF2, 0xBF4, 0xBF6, 0xBF8, 0xBFA, 0xBFC, 0xBFE, - 0xC00, 0xC02, 0xC04, 0xC06, 0xC08, 0xC0A, 0xC0C, 0xC0E, - 0xC10, 0xC12, 0xC14, 0xC16, 0xC18, 0xC1A, 0xC1C, 0xC1E, - 0xC20, 0xC22, 0xC24, 0xC26, 0xC28, 0xC2A, 0xC2C, 0xC2E, - 0xC30, 0xC32, 0xC34, 0xC36, 0xC38, 0xC3A, 0xC3C, 0xC3E, - 0xC40, 0xC42, 0xC44, 0xC46, 0xC48, 0xC4A, 0xC4C, 0xC4E, - 0xC50, 0xC52, 0xC54, 0xC56, 0xC58, 0xC5A, 0xC5C, 0xC5E, - 0xC60, 0xC62, 0xC64, 0xC66, 0xC68, 0xC6A, 0xC6C, 0xC6E, - 0xC70, 0xC72, 0xC74, 0xC76, 0xC78, 0xC7A, 0xC7C, 0xC7E, - 0xC80, 0xC82, 0xC84, 0xC86, 0xC88, 0xC8A, 0xC8C, 0xC8E, - 0xC90, 0xC92, 0xC94, 0xC96, 0xC98, 0xC9A, 0xC9C, 0xC9E, - 0xCA0, 0xCA2, 0xCA4, 0xCA6, 0xCA8, 0xCAA, 0xCAC, 0xCAE, - 0xCB0, 0xCB2, 0xCB4, 0xCB6, 0xCB8, 0xCBA, 0xCBC, 0xCBE, - 0xCC0, 0xCC2, 0xCC4, 0xCC6, 0xCC8, 0xCCA, 0xCCC, 0xCCE, - 0xCD0, 0xCD2, 0xCD4, 0xCD6, 0xCD8, 0xCDA, 0xCDC, 0xCDE, - 0xCE0, 0xCE2, 0xCE4, 0xCE6, 0xCE8, 0xCEA, 0xCEC, 0xCEE, - 0xCF0, 0xCF2, 0xCF4, 0xCF6, 0xCF8, 0xCFA, 0xCFC, 0xCFE, - 0xD00, 0xD02, 0xD04, 0xD06, 0xD08, 0xD0A, 0xD0C, 0xD0E, - 0xD10, 0xD12, 0xD14, 0xD16, 0xD18, 0xD1A, 0xD1C, 0xD1E, - 0xD20, 0xD22, 0xD24, 0xD26, 0xD28, 0xD2A, 0xD2C, 0xD2E, - 0xD30, 0xD32, 0xD34, 0xD36, 0xD38, 0xD3A, 0xD3C, 0xD3E, - 0xD40, 0xD42, 0xD44, 0xD46, 0xD48, 0xD4A, 0xD4C, 0xD4E, - 0xD50, 0xD52, 0xD54, 0xD56, 0xD58, 0xD5A, 0xD5C, 0xD5E, - 0xD60, 0xD62, 0xD64, 0xD66, 0xD68, 0xD6A, 0xD6C, 0xD6E, - 0xD70, 0xD72, 0xD74, 0xD76, 0xD78, 0xD7A, 0xD7C, 0xD7E, - 0xD80, 0xD82, 0xD84, 0xD86, 0xD88, 0xD8A, 0xD8C, 0xD8E, - 0xD90, 0xD92, 0xD94, 0xD96, 0xD98, 0xD9A, 0xD9C, 0xD9E, - 0xDA0, 0xDA2, 0xDA4, 0xDA6, 0xDA8, 0xDAA, 0xDAC, 0xDAE, - 0xDB0, 0xDB2, 0xDB4, 0xDB6, 0xDB8, 0xDBA, 0xDBC, 0xDBE, - 0xDC0, 0xDC2, 0xDC4, 0xDC6, 0xDC8, 0xDCA, 0xDCC, 0xDCE, - 0xDD0, 0xDD2, 0xDD4, 0xDD6, 0xDD8, 0xDDA, 0xDDC, 0xDDE, - 0xDE0, 0xDE2, 0xDE4, 0xDE6, 0xDE8, 0xDEA, 0xDEC, 0xDEE, - 0xDF0, 0xDF2, 0xDF4, 0xDF6, 0xDF8, 0xDFA, 0xDFC, 0xDFE, - 0xE00, 0xE02, 0xE04, 0xE06, 0xE08, 0xE0A, 0xE0C, 0xE0E, - 0xE10, 0xE12, 0xE14, 0xE16, 0xE18, 0xE1A, 0xE1C, 0xE1E, - 0xE20, 0xE22, 0xE24, 0xE26, 0xE28, 0xE2A, 0xE2C, 0xE2E, - 0xE30, 0xE32, 0xE34, 0xE36, 0xE38, 0xE3A, 0xE3C, 0xE3E, - 0xE40, 0xE42, 0xE44, 0xE46, 0xE48, 0xE4A, 0xE4C, 0xE4E, - 0xE50, 0xE52, 0xE54, 0xE56, 0xE58, 0xE5A, 0xE5C, 0xE5E, - 0xE60, 0xE62, 0xE64, 0xE66, 0xE68, 0xE6A, 0xE6C, 0xE6E, - 0xE70, 0xE72, 0xE74, 0xE76, 0xE78, 0xE7A, 0xE7C, 0xE7E, - 0xE80, 0xE82, 0xE84, 0xE86, 0xE88, 0xE8A, 0xE8C, 0xE8E, - 0xE90, 0xE92, 0xE94, 0xE96, 0xE98, 0xE9A, 0xE9C, 0xE9E, - 0xEA0, 0xEA2, 0xEA4, 0xEA6, 0xEA8, 0xEAA, 0xEAC, 0xEAE, - 0xEB0, 0xEB2, 0xEB4, 0xEB6, 0xEB8, 0xEBA, 0xEBC, 0xEBE, - 0xEC0, 0xEC2, 0xEC4, 0xEC6, 0xEC8, 0xECA, 0xECC, 0xECE, - 0xED0, 0xED2, 0xED4, 0xED6, 0xED8, 0xEDA, 0xEDC, 0xEDE, - 0xEE0, 0xEE2, 0xEE4, 0xEE6, 0xEE8, 0xEEA, 0xEEC, 0xEEE, - 0xEF0, 0xEF2, 0xEF4, 0xEF6, 0xEF8, 0xEFA, 0xEFC, 0xEFE, - 0xF00, 0xF02, 0xF04, 0xF06, 0xF08, 0xF0A, 0xF0C, 0xF0E, - 0xF10, 0xF12, 0xF14, 0xF16, 0xF18, 0xF1A, 0xF1C, 0xF1E, - 0xF20, 0xF22, 0xF24, 0xF26, 0xF28, 0xF2A, 0xF2C, 0xF2E, - 0xF30, 0xF32, 0xF34, 0xF36, 0xF38, 0xF3A, 0xF3C, 0xF3E, - 0xF40, 0xF42, 0xF44, 0xF46, 0xF48, 0xF4A, 0xF4C, 0xF4E, - 0xF50, 0xF52, 0xF54, 0xF56, 0xF58, 0xF5A, 0xF5C, 0xF5E, - 0xF60, 0xF62, 0xF64, 0xF66, 0xF68, 0xF6A, 0xF6C, 0xF6E, - 0xF70, 0xF72, 0xF74, 0xF76, 0xF78, 0xF7A, 0xF7C, 0xF7E, - 0xF80, 0xF82, 0xF84, 0xF86, 0xF88, 0xF8A, 0xF8C, 0xF8E, - 0xF90, 0xF92, 0xF94, 0xF96, 0xF98, 0xF9A, 0xF9C, 0xF9E, - 0xFA0, 0xFA2, 0xFA4, 0xFA6, 0xFA8, 0xFAA, 0xFAC, 0xFAE, - 0xFB0, 0xFB2, 0xFB4, 0xFB6, 0xFB8, 0xFBA, 0xFBC, 0xFBE, - 0xFC0, 0xFC2, 0xFC4, 0xFC6, 0xFC8, 0xFCA, 0xFCC, 0xFCE, - 0xFD0, 0xFD2, 0xFD4, 0xFD6, 0xFD8, 0xFDA, 0xFDC, 0xFDE, - 0xFE0, 0xFE2, 0xFE4, 0xFE6, 0xFE8, 0xFEA, 0xFEC, 0xFEE, - 0xFF0, 0xFF2, 0xFF4, 0xFF6, 0xFF8, 0xFFA, 0xFFC, 0xFFE, - 0xFFE, 0xFFC, 0xFFA, 0xFF8, 0xFF6, 0xFF4, 0xFF2, 0xFF0, - 0xFEE, 0xFEC, 0xFEA, 0xFE8, 0xFE6, 0xFE4, 0xFE2, 0xFE0, - 0xFDE, 0xFDC, 0xFDA, 0xFD8, 0xFD6, 0xFD4, 0xFD2, 0xFD0, - 0xFCE, 0xFCC, 0xFCA, 0xFC8, 0xFC6, 0xFC4, 0xFC2, 0xFC0, - 0xFBE, 0xFBC, 0xFBA, 0xFB8, 0xFB6, 0xFB4, 0xFB2, 0xFB0, - 0xFAE, 0xFAC, 0xFAA, 0xFA8, 0xFA6, 0xFA4, 0xFA2, 0xFA0, - 0xF9E, 0xF9C, 0xF9A, 0xF98, 0xF96, 0xF94, 0xF92, 0xF90, - 0xF8E, 0xF8C, 0xF8A, 0xF88, 0xF86, 0xF84, 0xF82, 0xF80, - 0xF7E, 0xF7C, 0xF7A, 0xF78, 0xF76, 0xF74, 0xF72, 0xF70, - 0xF6E, 0xF6C, 0xF6A, 0xF68, 0xF66, 0xF64, 0xF62, 0xF60, - 0xF5E, 0xF5C, 0xF5A, 0xF58, 0xF56, 0xF54, 0xF52, 0xF50, - 0xF4E, 0xF4C, 0xF4A, 0xF48, 0xF46, 0xF44, 0xF42, 0xF40, - 0xF3E, 0xF3C, 0xF3A, 0xF38, 0xF36, 0xF34, 0xF32, 0xF30, - 0xF2E, 0xF2C, 0xF2A, 0xF28, 0xF26, 0xF24, 0xF22, 0xF20, - 0xF1E, 0xF1C, 0xF1A, 0xF18, 0xF16, 0xF14, 0xF12, 0xF10, - 0xF0E, 0xF0C, 0xF0A, 0xF08, 0xF06, 0xF04, 0xF02, 0xF00, - 0xEFE, 0xEFC, 0xEFA, 0xEF8, 0xEF6, 0xEF4, 0xEF2, 0xEF0, - 0xEEE, 0xEEC, 0xEEA, 0xEE8, 0xEE6, 0xEE4, 0xEE2, 0xEE0, - 0xEDE, 0xEDC, 0xEDA, 0xED8, 0xED6, 0xED4, 0xED2, 0xED0, - 0xECE, 0xECC, 0xECA, 0xEC8, 0xEC6, 0xEC4, 0xEC2, 0xEC0, - 0xEBE, 0xEBC, 0xEBA, 0xEB8, 0xEB6, 0xEB4, 0xEB2, 0xEB0, - 0xEAE, 0xEAC, 0xEAA, 0xEA8, 0xEA6, 0xEA4, 0xEA2, 0xEA0, - 0xE9E, 0xE9C, 0xE9A, 0xE98, 0xE96, 0xE94, 0xE92, 0xE90, - 0xE8E, 0xE8C, 0xE8A, 0xE88, 0xE86, 0xE84, 0xE82, 0xE80, - 0xE7E, 0xE7C, 0xE7A, 0xE78, 0xE76, 0xE74, 0xE72, 0xE70, - 0xE6E, 0xE6C, 0xE6A, 0xE68, 0xE66, 0xE64, 0xE62, 0xE60, - 0xE5E, 0xE5C, 0xE5A, 0xE58, 0xE56, 0xE54, 0xE52, 0xE50, - 0xE4E, 0xE4C, 0xE4A, 0xE48, 0xE46, 0xE44, 0xE42, 0xE40, - 0xE3E, 0xE3C, 0xE3A, 0xE38, 0xE36, 0xE34, 0xE32, 0xE30, - 0xE2E, 0xE2C, 0xE2A, 0xE28, 0xE26, 0xE24, 0xE22, 0xE20, - 0xE1E, 0xE1C, 0xE1A, 0xE18, 0xE16, 0xE14, 0xE12, 0xE10, - 0xE0E, 0xE0C, 0xE0A, 0xE08, 0xE06, 0xE04, 0xE02, 0xE00, - 0xDFE, 0xDFC, 0xDFA, 0xDF8, 0xDF6, 0xDF4, 0xDF2, 0xDF0, - 0xDEE, 0xDEC, 0xDEA, 0xDE8, 0xDE6, 0xDE4, 0xDE2, 0xDE0, - 0xDDE, 0xDDC, 0xDDA, 0xDD8, 0xDD6, 0xDD4, 0xDD2, 0xDD0, - 0xDCE, 0xDCC, 0xDCA, 0xDC8, 0xDC6, 0xDC4, 0xDC2, 0xDC0, - 0xDBE, 0xDBC, 0xDBA, 0xDB8, 0xDB6, 0xDB4, 0xDB2, 0xDB0, - 0xDAE, 0xDAC, 0xDAA, 0xDA8, 0xDA6, 0xDA4, 0xDA2, 0xDA0, - 0xD9E, 0xD9C, 0xD9A, 0xD98, 0xD96, 0xD94, 0xD92, 0xD90, - 0xD8E, 0xD8C, 0xD8A, 0xD88, 0xD86, 0xD84, 0xD82, 0xD80, - 0xD7E, 0xD7C, 0xD7A, 0xD78, 0xD76, 0xD74, 0xD72, 0xD70, - 0xD6E, 0xD6C, 0xD6A, 0xD68, 0xD66, 0xD64, 0xD62, 0xD60, - 0xD5E, 0xD5C, 0xD5A, 0xD58, 0xD56, 0xD54, 0xD52, 0xD50, - 0xD4E, 0xD4C, 0xD4A, 0xD48, 0xD46, 0xD44, 0xD42, 0xD40, - 0xD3E, 0xD3C, 0xD3A, 0xD38, 0xD36, 0xD34, 0xD32, 0xD30, - 0xD2E, 0xD2C, 0xD2A, 0xD28, 0xD26, 0xD24, 0xD22, 0xD20, - 0xD1E, 0xD1C, 0xD1A, 0xD18, 0xD16, 0xD14, 0xD12, 0xD10, - 0xD0E, 0xD0C, 0xD0A, 0xD08, 0xD06, 0xD04, 0xD02, 0xD00, - 0xCFE, 0xCFC, 0xCFA, 0xCF8, 0xCF6, 0xCF4, 0xCF2, 0xCF0, - 0xCEE, 0xCEC, 0xCEA, 0xCE8, 0xCE6, 0xCE4, 0xCE2, 0xCE0, - 0xCDE, 0xCDC, 0xCDA, 0xCD8, 0xCD6, 0xCD4, 0xCD2, 0xCD0, - 0xCCE, 0xCCC, 0xCCA, 0xCC8, 0xCC6, 0xCC4, 0xCC2, 0xCC0, - 0xCBE, 0xCBC, 0xCBA, 0xCB8, 0xCB6, 0xCB4, 0xCB2, 0xCB0, - 0xCAE, 0xCAC, 0xCAA, 0xCA8, 0xCA6, 0xCA4, 0xCA2, 0xCA0, - 0xC9E, 0xC9C, 0xC9A, 0xC98, 0xC96, 0xC94, 0xC92, 0xC90, - 0xC8E, 0xC8C, 0xC8A, 0xC88, 0xC86, 0xC84, 0xC82, 0xC80, - 0xC7E, 0xC7C, 0xC7A, 0xC78, 0xC76, 0xC74, 0xC72, 0xC70, - 0xC6E, 0xC6C, 0xC6A, 0xC68, 0xC66, 0xC64, 0xC62, 0xC60, - 0xC5E, 0xC5C, 0xC5A, 0xC58, 0xC56, 0xC54, 0xC52, 0xC50, - 0xC4E, 0xC4C, 0xC4A, 0xC48, 0xC46, 0xC44, 0xC42, 0xC40, - 0xC3E, 0xC3C, 0xC3A, 0xC38, 0xC36, 0xC34, 0xC32, 0xC30, - 0xC2E, 0xC2C, 0xC2A, 0xC28, 0xC26, 0xC24, 0xC22, 0xC20, - 0xC1E, 0xC1C, 0xC1A, 0xC18, 0xC16, 0xC14, 0xC12, 0xC10, - 0xC0E, 0xC0C, 0xC0A, 0xC08, 0xC06, 0xC04, 0xC02, 0xC00, - 0xBFE, 0xBFC, 0xBFA, 0xBF8, 0xBF6, 0xBF4, 0xBF2, 0xBF0, - 0xBEE, 0xBEC, 0xBEA, 0xBE8, 0xBE6, 0xBE4, 0xBE2, 0xBE0, - 0xBDE, 0xBDC, 0xBDA, 0xBD8, 0xBD6, 0xBD4, 0xBD2, 0xBD0, - 0xBCE, 0xBCC, 0xBCA, 0xBC8, 0xBC6, 0xBC4, 0xBC2, 0xBC0, - 0xBBE, 0xBBC, 0xBBA, 0xBB8, 0xBB6, 0xBB4, 0xBB2, 0xBB0, - 0xBAE, 0xBAC, 0xBAA, 0xBA8, 0xBA6, 0xBA4, 0xBA2, 0xBA0, - 0xB9E, 0xB9C, 0xB9A, 0xB98, 0xB96, 0xB94, 0xB92, 0xB90, - 0xB8E, 0xB8C, 0xB8A, 0xB88, 0xB86, 0xB84, 0xB82, 0xB80, - 0xB7E, 0xB7C, 0xB7A, 0xB78, 0xB76, 0xB74, 0xB72, 0xB70, - 0xB6E, 0xB6C, 0xB6A, 0xB68, 0xB66, 0xB64, 0xB62, 0xB60, - 0xB5E, 0xB5C, 0xB5A, 0xB58, 0xB56, 0xB54, 0xB52, 0xB50, - 0xB4E, 0xB4C, 0xB4A, 0xB48, 0xB46, 0xB44, 0xB42, 0xB40, - 0xB3E, 0xB3C, 0xB3A, 0xB38, 0xB36, 0xB34, 0xB32, 0xB30, - 0xB2E, 0xB2C, 0xB2A, 0xB28, 0xB26, 0xB24, 0xB22, 0xB20, - 0xB1E, 0xB1C, 0xB1A, 0xB18, 0xB16, 0xB14, 0xB12, 0xB10, - 0xB0E, 0xB0C, 0xB0A, 0xB08, 0xB06, 0xB04, 0xB02, 0xB00, - 0xAFE, 0xAFC, 0xAFA, 0xAF8, 0xAF6, 0xAF4, 0xAF2, 0xAF0, - 0xAEE, 0xAEC, 0xAEA, 0xAE8, 0xAE6, 0xAE4, 0xAE2, 0xAE0, - 0xADE, 0xADC, 0xADA, 0xAD8, 0xAD6, 0xAD4, 0xAD2, 0xAD0, - 0xACE, 0xACC, 0xACA, 0xAC8, 0xAC6, 0xAC4, 0xAC2, 0xAC0, - 0xABE, 0xABC, 0xABA, 0xAB8, 0xAB6, 0xAB4, 0xAB2, 0xAB0, - 0xAAE, 0xAAC, 0xAAA, 0xAA8, 0xAA6, 0xAA4, 0xAA2, 0xAA0, - 0xA9E, 0xA9C, 0xA9A, 0xA98, 0xA96, 0xA94, 0xA92, 0xA90, - 0xA8E, 0xA8C, 0xA8A, 0xA88, 0xA86, 0xA84, 0xA82, 0xA80, - 0xA7E, 0xA7C, 0xA7A, 0xA78, 0xA76, 0xA74, 0xA72, 0xA70, - 0xA6E, 0xA6C, 0xA6A, 0xA68, 0xA66, 0xA64, 0xA62, 0xA60, - 0xA5E, 0xA5C, 0xA5A, 0xA58, 0xA56, 0xA54, 0xA52, 0xA50, - 0xA4E, 0xA4C, 0xA4A, 0xA48, 0xA46, 0xA44, 0xA42, 0xA40, - 0xA3E, 0xA3C, 0xA3A, 0xA38, 0xA36, 0xA34, 0xA32, 0xA30, - 0xA2E, 0xA2C, 0xA2A, 0xA28, 0xA26, 0xA24, 0xA22, 0xA20, - 0xA1E, 0xA1C, 0xA1A, 0xA18, 0xA16, 0xA14, 0xA12, 0xA10, - 0xA0E, 0xA0C, 0xA0A, 0xA08, 0xA06, 0xA04, 0xA02, 0xA00, - 0x9FE, 0x9FC, 0x9FA, 0x9F8, 0x9F6, 0x9F4, 0x9F2, 0x9F0, - 0x9EE, 0x9EC, 0x9EA, 0x9E8, 0x9E6, 0x9E4, 0x9E2, 0x9E0, - 0x9DE, 0x9DC, 0x9DA, 0x9D8, 0x9D6, 0x9D4, 0x9D2, 0x9D0, - 0x9CE, 0x9CC, 0x9CA, 0x9C8, 0x9C6, 0x9C4, 0x9C2, 0x9C0, - 0x9BE, 0x9BC, 0x9BA, 0x9B8, 0x9B6, 0x9B4, 0x9B2, 0x9B0, - 0x9AE, 0x9AC, 0x9AA, 0x9A8, 0x9A6, 0x9A4, 0x9A2, 0x9A0, - 0x99E, 0x99C, 0x99A, 0x998, 0x996, 0x994, 0x992, 0x990, - 0x98E, 0x98C, 0x98A, 0x988, 0x986, 0x984, 0x982, 0x980, - 0x97E, 0x97C, 0x97A, 0x978, 0x976, 0x974, 0x972, 0x970, - 0x96E, 0x96C, 0x96A, 0x968, 0x966, 0x964, 0x962, 0x960, - 0x95E, 0x95C, 0x95A, 0x958, 0x956, 0x954, 0x952, 0x950, - 0x94E, 0x94C, 0x94A, 0x948, 0x946, 0x944, 0x942, 0x940, - 0x93E, 0x93C, 0x93A, 0x938, 0x936, 0x934, 0x932, 0x930, - 0x92E, 0x92C, 0x92A, 0x928, 0x926, 0x924, 0x922, 0x920, - 0x91E, 0x91C, 0x91A, 0x918, 0x916, 0x914, 0x912, 0x910, - 0x90E, 0x90C, 0x90A, 0x908, 0x906, 0x904, 0x902, 0x900, - 0x8FE, 0x8FC, 0x8FA, 0x8F8, 0x8F6, 0x8F4, 0x8F2, 0x8F0, - 0x8EE, 0x8EC, 0x8EA, 0x8E8, 0x8E6, 0x8E4, 0x8E2, 0x8E0, - 0x8DE, 0x8DC, 0x8DA, 0x8D8, 0x8D6, 0x8D4, 0x8D2, 0x8D0, - 0x8CE, 0x8CC, 0x8CA, 0x8C8, 0x8C6, 0x8C4, 0x8C2, 0x8C0, - 0x8BE, 0x8BC, 0x8BA, 0x8B8, 0x8B6, 0x8B4, 0x8B2, 0x8B0, - 0x8AE, 0x8AC, 0x8AA, 0x8A8, 0x8A6, 0x8A4, 0x8A2, 0x8A0, - 0x89E, 0x89C, 0x89A, 0x898, 0x896, 0x894, 0x892, 0x890, - 0x88E, 0x88C, 0x88A, 0x888, 0x886, 0x884, 0x882, 0x880, - 0x87E, 0x87C, 0x87A, 0x878, 0x876, 0x874, 0x872, 0x870, - 0x86E, 0x86C, 0x86A, 0x868, 0x866, 0x864, 0x862, 0x860, - 0x85E, 0x85C, 0x85A, 0x858, 0x856, 0x854, 0x852, 0x850, - 0x84E, 0x84C, 0x84A, 0x848, 0x846, 0x844, 0x842, 0x840, - 0x83E, 0x83C, 0x83A, 0x838, 0x836, 0x834, 0x832, 0x830, - 0x82E, 0x82C, 0x82A, 0x828, 0x826, 0x824, 0x822, 0x820, - 0x81E, 0x81C, 0x81A, 0x818, 0x816, 0x814, 0x812, 0x810, - 0x80E, 0x80C, 0x80A, 0x808, 0x806, 0x804, 0x802, 0x800, - 0x7FE, 0x7FC, 0x7FA, 0x7F8, 0x7F6, 0x7F4, 0x7F2, 0x7F0, - 0x7EE, 0x7EC, 0x7EA, 0x7E8, 0x7E6, 0x7E4, 0x7E2, 0x7E0, - 0x7DE, 0x7DC, 0x7DA, 0x7D8, 0x7D6, 0x7D4, 0x7D2, 0x7D0, - 0x7CE, 0x7CC, 0x7CA, 0x7C8, 0x7C6, 0x7C4, 0x7C2, 0x7C0, - 0x7BE, 0x7BC, 0x7BA, 0x7B8, 0x7B6, 0x7B4, 0x7B2, 0x7B0, - 0x7AE, 0x7AC, 0x7AA, 0x7A8, 0x7A6, 0x7A4, 0x7A2, 0x7A0, - 0x79E, 0x79C, 0x79A, 0x798, 0x796, 0x794, 0x792, 0x790, - 0x78E, 0x78C, 0x78A, 0x788, 0x786, 0x784, 0x782, 0x780, - 0x77E, 0x77C, 0x77A, 0x778, 0x776, 0x774, 0x772, 0x770, - 0x76E, 0x76C, 0x76A, 0x768, 0x766, 0x764, 0x762, 0x760, - 0x75E, 0x75C, 0x75A, 0x758, 0x756, 0x754, 0x752, 0x750, - 0x74E, 0x74C, 0x74A, 0x748, 0x746, 0x744, 0x742, 0x740, - 0x73E, 0x73C, 0x73A, 0x738, 0x736, 0x734, 0x732, 0x730, - 0x72E, 0x72C, 0x72A, 0x728, 0x726, 0x724, 0x722, 0x720, - 0x71E, 0x71C, 0x71A, 0x718, 0x716, 0x714, 0x712, 0x710, - 0x70E, 0x70C, 0x70A, 0x708, 0x706, 0x704, 0x702, 0x700, - 0x6FE, 0x6FC, 0x6FA, 0x6F8, 0x6F6, 0x6F4, 0x6F2, 0x6F0, - 0x6EE, 0x6EC, 0x6EA, 0x6E8, 0x6E6, 0x6E4, 0x6E2, 0x6E0, - 0x6DE, 0x6DC, 0x6DA, 0x6D8, 0x6D6, 0x6D4, 0x6D2, 0x6D0, - 0x6CE, 0x6CC, 0x6CA, 0x6C8, 0x6C6, 0x6C4, 0x6C2, 0x6C0, - 0x6BE, 0x6BC, 0x6BA, 0x6B8, 0x6B6, 0x6B4, 0x6B2, 0x6B0, - 0x6AE, 0x6AC, 0x6AA, 0x6A8, 0x6A6, 0x6A4, 0x6A2, 0x6A0, - 0x69E, 0x69C, 0x69A, 0x698, 0x696, 0x694, 0x692, 0x690, - 0x68E, 0x68C, 0x68A, 0x688, 0x686, 0x684, 0x682, 0x680, - 0x67E, 0x67C, 0x67A, 0x678, 0x676, 0x674, 0x672, 0x670, - 0x66E, 0x66C, 0x66A, 0x668, 0x666, 0x664, 0x662, 0x660, - 0x65E, 0x65C, 0x65A, 0x658, 0x656, 0x654, 0x652, 0x650, - 0x64E, 0x64C, 0x64A, 0x648, 0x646, 0x644, 0x642, 0x640, - 0x63E, 0x63C, 0x63A, 0x638, 0x636, 0x634, 0x632, 0x630, - 0x62E, 0x62C, 0x62A, 0x628, 0x626, 0x624, 0x622, 0x620, - 0x61E, 0x61C, 0x61A, 0x618, 0x616, 0x614, 0x612, 0x610, - 0x60E, 0x60C, 0x60A, 0x608, 0x606, 0x604, 0x602, 0x600, - 0x5FE, 0x5FC, 0x5FA, 0x5F8, 0x5F6, 0x5F4, 0x5F2, 0x5F0, - 0x5EE, 0x5EC, 0x5EA, 0x5E8, 0x5E6, 0x5E4, 0x5E2, 0x5E0, - 0x5DE, 0x5DC, 0x5DA, 0x5D8, 0x5D6, 0x5D4, 0x5D2, 0x5D0, - 0x5CE, 0x5CC, 0x5CA, 0x5C8, 0x5C6, 0x5C4, 0x5C2, 0x5C0, - 0x5BE, 0x5BC, 0x5BA, 0x5B8, 0x5B6, 0x5B4, 0x5B2, 0x5B0, - 0x5AE, 0x5AC, 0x5AA, 0x5A8, 0x5A6, 0x5A4, 0x5A2, 0x5A0, - 0x59E, 0x59C, 0x59A, 0x598, 0x596, 0x594, 0x592, 0x590, - 0x58E, 0x58C, 0x58A, 0x588, 0x586, 0x584, 0x582, 0x580, - 0x57E, 0x57C, 0x57A, 0x578, 0x576, 0x574, 0x572, 0x570, - 0x56E, 0x56C, 0x56A, 0x568, 0x566, 0x564, 0x562, 0x560, - 0x55E, 0x55C, 0x55A, 0x558, 0x556, 0x554, 0x552, 0x550, - 0x54E, 0x54C, 0x54A, 0x548, 0x546, 0x544, 0x542, 0x540, - 0x53E, 0x53C, 0x53A, 0x538, 0x536, 0x534, 0x532, 0x530, - 0x52E, 0x52C, 0x52A, 0x528, 0x526, 0x524, 0x522, 0x520, - 0x51E, 0x51C, 0x51A, 0x518, 0x516, 0x514, 0x512, 0x510, - 0x50E, 0x50C, 0x50A, 0x508, 0x506, 0x504, 0x502, 0x500, - 0x4FE, 0x4FC, 0x4FA, 0x4F8, 0x4F6, 0x4F4, 0x4F2, 0x4F0, - 0x4EE, 0x4EC, 0x4EA, 0x4E8, 0x4E6, 0x4E4, 0x4E2, 0x4E0, - 0x4DE, 0x4DC, 0x4DA, 0x4D8, 0x4D6, 0x4D4, 0x4D2, 0x4D0, - 0x4CE, 0x4CC, 0x4CA, 0x4C8, 0x4C6, 0x4C4, 0x4C2, 0x4C0, - 0x4BE, 0x4BC, 0x4BA, 0x4B8, 0x4B6, 0x4B4, 0x4B2, 0x4B0, - 0x4AE, 0x4AC, 0x4AA, 0x4A8, 0x4A6, 0x4A4, 0x4A2, 0x4A0, - 0x49E, 0x49C, 0x49A, 0x498, 0x496, 0x494, 0x492, 0x490, - 0x48E, 0x48C, 0x48A, 0x488, 0x486, 0x484, 0x482, 0x480, - 0x47E, 0x47C, 0x47A, 0x478, 0x476, 0x474, 0x472, 0x470, - 0x46E, 0x46C, 0x46A, 0x468, 0x466, 0x464, 0x462, 0x460, - 0x45E, 0x45C, 0x45A, 0x458, 0x456, 0x454, 0x452, 0x450, - 0x44E, 0x44C, 0x44A, 0x448, 0x446, 0x444, 0x442, 0x440, - 0x43E, 0x43C, 0x43A, 0x438, 0x436, 0x434, 0x432, 0x430, - 0x42E, 0x42C, 0x42A, 0x428, 0x426, 0x424, 0x422, 0x420, - 0x41E, 0x41C, 0x41A, 0x418, 0x416, 0x414, 0x412, 0x410, - 0x40E, 0x40C, 0x40A, 0x408, 0x406, 0x404, 0x402, 0x400, - 0x3FE, 0x3FC, 0x3FA, 0x3F8, 0x3F6, 0x3F4, 0x3F2, 0x3F0, - 0x3EE, 0x3EC, 0x3EA, 0x3E8, 0x3E6, 0x3E4, 0x3E2, 0x3E0, - 0x3DE, 0x3DC, 0x3DA, 0x3D8, 0x3D6, 0x3D4, 0x3D2, 0x3D0, - 0x3CE, 0x3CC, 0x3CA, 0x3C8, 0x3C6, 0x3C4, 0x3C2, 0x3C0, - 0x3BE, 0x3BC, 0x3BA, 0x3B8, 0x3B6, 0x3B4, 0x3B2, 0x3B0, - 0x3AE, 0x3AC, 0x3AA, 0x3A8, 0x3A6, 0x3A4, 0x3A2, 0x3A0, - 0x39E, 0x39C, 0x39A, 0x398, 0x396, 0x394, 0x392, 0x390, - 0x38E, 0x38C, 0x38A, 0x388, 0x386, 0x384, 0x382, 0x380, - 0x37E, 0x37C, 0x37A, 0x378, 0x376, 0x374, 0x372, 0x370, - 0x36E, 0x36C, 0x36A, 0x368, 0x366, 0x364, 0x362, 0x360, - 0x35E, 0x35C, 0x35A, 0x358, 0x356, 0x354, 0x352, 0x350, - 0x34E, 0x34C, 0x34A, 0x348, 0x346, 0x344, 0x342, 0x340, - 0x33E, 0x33C, 0x33A, 0x338, 0x336, 0x334, 0x332, 0x330, - 0x32E, 0x32C, 0x32A, 0x328, 0x326, 0x324, 0x322, 0x320, - 0x31E, 0x31C, 0x31A, 0x318, 0x316, 0x314, 0x312, 0x310, - 0x30E, 0x30C, 0x30A, 0x308, 0x306, 0x304, 0x302, 0x300, - 0x2FE, 0x2FC, 0x2FA, 0x2F8, 0x2F6, 0x2F4, 0x2F2, 0x2F0, - 0x2EE, 0x2EC, 0x2EA, 0x2E8, 0x2E6, 0x2E4, 0x2E2, 0x2E0, - 0x2DE, 0x2DC, 0x2DA, 0x2D8, 0x2D6, 0x2D4, 0x2D2, 0x2D0, - 0x2CE, 0x2CC, 0x2CA, 0x2C8, 0x2C6, 0x2C4, 0x2C2, 0x2C0, - 0x2BE, 0x2BC, 0x2BA, 0x2B8, 0x2B6, 0x2B4, 0x2B2, 0x2B0, - 0x2AE, 0x2AC, 0x2AA, 0x2A8, 0x2A6, 0x2A4, 0x2A2, 0x2A0, - 0x29E, 0x29C, 0x29A, 0x298, 0x296, 0x294, 0x292, 0x290, - 0x28E, 0x28C, 0x28A, 0x288, 0x286, 0x284, 0x282, 0x280, - 0x27E, 0x27C, 0x27A, 0x278, 0x276, 0x274, 0x272, 0x270, - 0x26E, 0x26C, 0x26A, 0x268, 0x266, 0x264, 0x262, 0x260, - 0x25E, 0x25C, 0x25A, 0x258, 0x256, 0x254, 0x252, 0x250, - 0x24E, 0x24C, 0x24A, 0x248, 0x246, 0x244, 0x242, 0x240, - 0x23E, 0x23C, 0x23A, 0x238, 0x236, 0x234, 0x232, 0x230, - 0x22E, 0x22C, 0x22A, 0x228, 0x226, 0x224, 0x222, 0x220, - 0x21E, 0x21C, 0x21A, 0x218, 0x216, 0x214, 0x212, 0x210, - 0x20E, 0x20C, 0x20A, 0x208, 0x206, 0x204, 0x202, 0x200, - 0x1FE, 0x1FC, 0x1FA, 0x1F8, 0x1F6, 0x1F4, 0x1F2, 0x1F0, - 0x1EE, 0x1EC, 0x1EA, 0x1E8, 0x1E6, 0x1E4, 0x1E2, 0x1E0, - 0x1DE, 0x1DC, 0x1DA, 0x1D8, 0x1D6, 0x1D4, 0x1D2, 0x1D0, - 0x1CE, 0x1CC, 0x1CA, 0x1C8, 0x1C6, 0x1C4, 0x1C2, 0x1C0, - 0x1BE, 0x1BC, 0x1BA, 0x1B8, 0x1B6, 0x1B4, 0x1B2, 0x1B0, - 0x1AE, 0x1AC, 0x1AA, 0x1A8, 0x1A6, 0x1A4, 0x1A2, 0x1A0, - 0x19E, 0x19C, 0x19A, 0x198, 0x196, 0x194, 0x192, 0x190, - 0x18E, 0x18C, 0x18A, 0x188, 0x186, 0x184, 0x182, 0x180, - 0x17E, 0x17C, 0x17A, 0x178, 0x176, 0x174, 0x172, 0x170, - 0x16E, 0x16C, 0x16A, 0x168, 0x166, 0x164, 0x162, 0x160, - 0x15E, 0x15C, 0x15A, 0x158, 0x156, 0x154, 0x152, 0x150, - 0x14E, 0x14C, 0x14A, 0x148, 0x146, 0x144, 0x142, 0x140, - 0x13E, 0x13C, 0x13A, 0x138, 0x136, 0x134, 0x132, 0x130, - 0x12E, 0x12C, 0x12A, 0x128, 0x126, 0x124, 0x122, 0x120, - 0x11E, 0x11C, 0x11A, 0x118, 0x116, 0x114, 0x112, 0x110, - 0x10E, 0x10C, 0x10A, 0x108, 0x106, 0x104, 0x102, 0x100, - 0x0FE, 0x0FC, 0x0FA, 0x0F8, 0x0F6, 0x0F4, 0x0F2, 0x0F0, - 0x0EE, 0x0EC, 0x0EA, 0x0E8, 0x0E6, 0x0E4, 0x0E2, 0x0E0, - 0x0DE, 0x0DC, 0x0DA, 0x0D8, 0x0D6, 0x0D4, 0x0D2, 0x0D0, - 0x0CE, 0x0CC, 0x0CA, 0x0C8, 0x0C6, 0x0C4, 0x0C2, 0x0C0, - 0x0BE, 0x0BC, 0x0BA, 0x0B8, 0x0B6, 0x0B4, 0x0B2, 0x0B0, - 0x0AE, 0x0AC, 0x0AA, 0x0A8, 0x0A6, 0x0A4, 0x0A2, 0x0A0, - 0x09E, 0x09C, 0x09A, 0x098, 0x096, 0x094, 0x092, 0x090, - 0x08E, 0x08C, 0x08A, 0x088, 0x086, 0x084, 0x082, 0x080, - 0x07E, 0x07C, 0x07A, 0x078, 0x076, 0x074, 0x072, 0x070, - 0x06E, 0x06C, 0x06A, 0x068, 0x066, 0x064, 0x062, 0x060, - 0x05E, 0x05C, 0x05A, 0x058, 0x056, 0x054, 0x052, 0x050, - 0x04E, 0x04C, 0x04A, 0x048, 0x046, 0x044, 0x042, 0x040, - 0x03E, 0x03C, 0x03A, 0x038, 0x036, 0x034, 0x032, 0x030, - 0x02E, 0x02C, 0x02A, 0x028, 0x026, 0x024, 0x022, 0x020, - 0x01E, 0x01C, 0x01A, 0x018, 0x016, 0x014, 0x012, 0x010, - 0x00E, 0x00C, 0x00A, 0x008, 0x006, 0x004, 0x002, 0x000 - }, - new short[] { - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, - 0x008, 0x009, 0x00A, 0x00B, 0x00C, 0x00D, 0x00E, 0x00F, - 0x010, 0x011, 0x012, 0x013, 0x014, 0x015, 0x016, 0x017, - 0x018, 0x019, 0x01A, 0x01B, 0x01C, 0x01D, 0x01E, 0x01F, - 0x020, 0x021, 0x022, 0x023, 0x024, 0x025, 0x026, 0x027, - 0x028, 0x029, 0x02A, 0x02B, 0x02C, 0x02D, 0x02E, 0x02F, - 0x030, 0x031, 0x032, 0x033, 0x034, 0x035, 0x036, 0x037, - 0x038, 0x039, 0x03A, 0x03B, 0x03C, 0x03D, 0x03E, 0x03F, - 0x040, 0x041, 0x042, 0x043, 0x044, 0x045, 0x046, 0x047, - 0x048, 0x049, 0x04A, 0x04B, 0x04C, 0x04D, 0x04E, 0x04F, - 0x050, 0x051, 0x052, 0x053, 0x054, 0x055, 0x056, 0x057, - 0x058, 0x059, 0x05A, 0x05B, 0x05C, 0x05D, 0x05E, 0x05F, - 0x060, 0x061, 0x062, 0x063, 0x064, 0x065, 0x066, 0x067, - 0x068, 0x069, 0x06A, 0x06B, 0x06C, 0x06D, 0x06E, 0x06F, - 0x070, 0x071, 0x072, 0x073, 0x074, 0x075, 0x076, 0x077, - 0x078, 0x079, 0x07A, 0x07B, 0x07C, 0x07D, 0x07E, 0x07F, - 0x080, 0x081, 0x082, 0x083, 0x084, 0x085, 0x086, 0x087, - 0x088, 0x089, 0x08A, 0x08B, 0x08C, 0x08D, 0x08E, 0x08F, - 0x090, 0x091, 0x092, 0x093, 0x094, 0x095, 0x096, 0x097, - 0x098, 0x099, 0x09A, 0x09B, 0x09C, 0x09D, 0x09E, 0x09F, - 0x0A0, 0x0A1, 0x0A2, 0x0A3, 0x0A4, 0x0A5, 0x0A6, 0x0A7, - 0x0A8, 0x0A9, 0x0AA, 0x0AB, 0x0AC, 0x0AD, 0x0AE, 0x0AF, - 0x0B0, 0x0B1, 0x0B2, 0x0B3, 0x0B4, 0x0B5, 0x0B6, 0x0B7, - 0x0B8, 0x0B9, 0x0BA, 0x0BB, 0x0BC, 0x0BD, 0x0BE, 0x0BF, - 0x0C0, 0x0C1, 0x0C2, 0x0C3, 0x0C4, 0x0C5, 0x0C6, 0x0C7, - 0x0C8, 0x0C9, 0x0CA, 0x0CB, 0x0CC, 0x0CD, 0x0CE, 0x0CF, - 0x0D0, 0x0D1, 0x0D2, 0x0D3, 0x0D4, 0x0D5, 0x0D6, 0x0D7, - 0x0D8, 0x0D9, 0x0DA, 0x0DB, 0x0DC, 0x0DD, 0x0DE, 0x0DF, - 0x0E0, 0x0E1, 0x0E2, 0x0E3, 0x0E4, 0x0E5, 0x0E6, 0x0E7, - 0x0E8, 0x0E9, 0x0EA, 0x0EB, 0x0EC, 0x0ED, 0x0EE, 0x0EF, - 0x0F0, 0x0F1, 0x0F2, 0x0F3, 0x0F4, 0x0F5, 0x0F6, 0x0F7, - 0x0F8, 0x0F9, 0x0FA, 0x0FB, 0x0FC, 0x0FD, 0x0FE, 0x0FF, - 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, - 0x108, 0x109, 0x10A, 0x10B, 0x10C, 0x10D, 0x10E, 0x10F, - 0x110, 0x111, 0x112, 0x113, 0x114, 0x115, 0x116, 0x117, - 0x118, 0x119, 0x11A, 0x11B, 0x11C, 0x11D, 0x11E, 0x11F, - 0x120, 0x121, 0x122, 0x123, 0x124, 0x125, 0x126, 0x127, - 0x128, 0x129, 0x12A, 0x12B, 0x12C, 0x12D, 0x12E, 0x12F, - 0x130, 0x131, 0x132, 0x133, 0x134, 0x135, 0x136, 0x137, - 0x138, 0x139, 0x13A, 0x13B, 0x13C, 0x13D, 0x13E, 0x13F, - 0x140, 0x141, 0x142, 0x143, 0x144, 0x145, 0x146, 0x147, - 0x148, 0x149, 0x14A, 0x14B, 0x14C, 0x14D, 0x14E, 0x14F, - 0x150, 0x151, 0x152, 0x153, 0x154, 0x155, 0x156, 0x157, - 0x158, 0x159, 0x15A, 0x15B, 0x15C, 0x15D, 0x15E, 0x15F, - 0x160, 0x161, 0x162, 0x163, 0x164, 0x165, 0x166, 0x167, - 0x168, 0x169, 0x16A, 0x16B, 0x16C, 0x16D, 0x16E, 0x16F, - 0x170, 0x171, 0x172, 0x173, 0x174, 0x175, 0x176, 0x177, - 0x178, 0x179, 0x17A, 0x17B, 0x17C, 0x17D, 0x17E, 0x17F, - 0x180, 0x181, 0x182, 0x183, 0x184, 0x185, 0x186, 0x187, - 0x188, 0x189, 0x18A, 0x18B, 0x18C, 0x18D, 0x18E, 0x18F, - 0x190, 0x191, 0x192, 0x193, 0x194, 0x195, 0x196, 0x197, - 0x198, 0x199, 0x19A, 0x19B, 0x19C, 0x19D, 0x19E, 0x19F, - 0x1A0, 0x1A1, 0x1A2, 0x1A3, 0x1A4, 0x1A5, 0x1A6, 0x1A7, - 0x1A8, 0x1A9, 0x1AA, 0x1AB, 0x1AC, 0x1AD, 0x1AE, 0x1AF, - 0x1B0, 0x1B1, 0x1B2, 0x1B3, 0x1B4, 0x1B5, 0x1B6, 0x1B7, - 0x1B8, 0x1B9, 0x1BA, 0x1BB, 0x1BC, 0x1BD, 0x1BE, 0x1BF, - 0x1C0, 0x1C1, 0x1C2, 0x1C3, 0x1C4, 0x1C5, 0x1C6, 0x1C7, - 0x1C8, 0x1C9, 0x1CA, 0x1CB, 0x1CC, 0x1CD, 0x1CE, 0x1CF, - 0x1D0, 0x1D1, 0x1D2, 0x1D3, 0x1D4, 0x1D5, 0x1D6, 0x1D7, - 0x1D8, 0x1D9, 0x1DA, 0x1DB, 0x1DC, 0x1DD, 0x1DE, 0x1DF, - 0x1E0, 0x1E1, 0x1E2, 0x1E3, 0x1E4, 0x1E5, 0x1E6, 0x1E7, - 0x1E8, 0x1E9, 0x1EA, 0x1EB, 0x1EC, 0x1ED, 0x1EE, 0x1EF, - 0x1F0, 0x1F1, 0x1F2, 0x1F3, 0x1F4, 0x1F5, 0x1F6, 0x1F7, - 0x1F8, 0x1F9, 0x1FA, 0x1FB, 0x1FC, 0x1FD, 0x1FE, 0x1FF, - 0x200, 0x201, 0x202, 0x203, 0x204, 0x205, 0x206, 0x207, - 0x208, 0x209, 0x20A, 0x20B, 0x20C, 0x20D, 0x20E, 0x20F, - 0x210, 0x211, 0x212, 0x213, 0x214, 0x215, 0x216, 0x217, - 0x218, 0x219, 0x21A, 0x21B, 0x21C, 0x21D, 0x21E, 0x21F, - 0x220, 0x221, 0x222, 0x223, 0x224, 0x225, 0x226, 0x227, - 0x228, 0x229, 0x22A, 0x22B, 0x22C, 0x22D, 0x22E, 0x22F, - 0x230, 0x231, 0x232, 0x233, 0x234, 0x235, 0x236, 0x237, - 0x238, 0x239, 0x23A, 0x23B, 0x23C, 0x23D, 0x23E, 0x23F, - 0x240, 0x241, 0x242, 0x243, 0x244, 0x245, 0x246, 0x247, - 0x248, 0x249, 0x24A, 0x24B, 0x24C, 0x24D, 0x24E, 0x24F, - 0x250, 0x251, 0x252, 0x253, 0x254, 0x255, 0x256, 0x257, - 0x258, 0x259, 0x25A, 0x25B, 0x25C, 0x25D, 0x25E, 0x25F, - 0x260, 0x261, 0x262, 0x263, 0x264, 0x265, 0x266, 0x267, - 0x268, 0x269, 0x26A, 0x26B, 0x26C, 0x26D, 0x26E, 0x26F, - 0x270, 0x271, 0x272, 0x273, 0x274, 0x275, 0x276, 0x277, - 0x278, 0x279, 0x27A, 0x27B, 0x27C, 0x27D, 0x27E, 0x27F, - 0x280, 0x281, 0x282, 0x283, 0x284, 0x285, 0x286, 0x287, - 0x288, 0x289, 0x28A, 0x28B, 0x28C, 0x28D, 0x28E, 0x28F, - 0x290, 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297, - 0x298, 0x299, 0x29A, 0x29B, 0x29C, 0x29D, 0x29E, 0x29F, - 0x2A0, 0x2A1, 0x2A2, 0x2A3, 0x2A4, 0x2A5, 0x2A6, 0x2A7, - 0x2A8, 0x2A9, 0x2AA, 0x2AB, 0x2AC, 0x2AD, 0x2AE, 0x2AF, - 0x2B0, 0x2B1, 0x2B2, 0x2B3, 0x2B4, 0x2B5, 0x2B6, 0x2B7, - 0x2B8, 0x2B9, 0x2BA, 0x2BB, 0x2BC, 0x2BD, 0x2BE, 0x2BF, - 0x2C0, 0x2C1, 0x2C2, 0x2C3, 0x2C4, 0x2C5, 0x2C6, 0x2C7, - 0x2C8, 0x2C9, 0x2CA, 0x2CB, 0x2CC, 0x2CD, 0x2CE, 0x2CF, - 0x2D0, 0x2D1, 0x2D2, 0x2D3, 0x2D4, 0x2D5, 0x2D6, 0x2D7, - 0x2D8, 0x2D9, 0x2DA, 0x2DB, 0x2DC, 0x2DD, 0x2DE, 0x2DF, - 0x2E0, 0x2E1, 0x2E2, 0x2E3, 0x2E4, 0x2E5, 0x2E6, 0x2E7, - 0x2E8, 0x2E9, 0x2EA, 0x2EB, 0x2EC, 0x2ED, 0x2EE, 0x2EF, - 0x2F0, 0x2F1, 0x2F2, 0x2F3, 0x2F4, 0x2F5, 0x2F6, 0x2F7, - 0x2F8, 0x2F9, 0x2FA, 0x2FB, 0x2FC, 0x2FD, 0x2FE, 0x2FF, - 0x300, 0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x307, - 0x308, 0x309, 0x30A, 0x30B, 0x30C, 0x30D, 0x30E, 0x30F, - 0x310, 0x311, 0x312, 0x313, 0x314, 0x315, 0x316, 0x317, - 0x318, 0x319, 0x31A, 0x31B, 0x31C, 0x31D, 0x31E, 0x31F, - 0x320, 0x321, 0x322, 0x323, 0x324, 0x325, 0x326, 0x327, - 0x328, 0x329, 0x32A, 0x32B, 0x32C, 0x32D, 0x32E, 0x32F, - 0x330, 0x331, 0x332, 0x333, 0x334, 0x335, 0x336, 0x337, - 0x338, 0x339, 0x33A, 0x33B, 0x33C, 0x33D, 0x33E, 0x33F, - 0x340, 0x341, 0x342, 0x343, 0x344, 0x345, 0x346, 0x347, - 0x348, 0x349, 0x34A, 0x34B, 0x34C, 0x34D, 0x34E, 0x34F, - 0x350, 0x351, 0x352, 0x353, 0x354, 0x355, 0x356, 0x357, - 0x358, 0x359, 0x35A, 0x35B, 0x35C, 0x35D, 0x35E, 0x35F, - 0x360, 0x361, 0x362, 0x363, 0x364, 0x365, 0x366, 0x367, - 0x368, 0x369, 0x36A, 0x36B, 0x36C, 0x36D, 0x36E, 0x36F, - 0x370, 0x371, 0x372, 0x373, 0x374, 0x375, 0x376, 0x377, - 0x378, 0x379, 0x37A, 0x37B, 0x37C, 0x37D, 0x37E, 0x37F, - 0x380, 0x381, 0x382, 0x383, 0x384, 0x385, 0x386, 0x387, - 0x388, 0x389, 0x38A, 0x38B, 0x38C, 0x38D, 0x38E, 0x38F, - 0x390, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397, - 0x398, 0x399, 0x39A, 0x39B, 0x39C, 0x39D, 0x39E, 0x39F, - 0x3A0, 0x3A1, 0x3A2, 0x3A3, 0x3A4, 0x3A5, 0x3A6, 0x3A7, - 0x3A8, 0x3A9, 0x3AA, 0x3AB, 0x3AC, 0x3AD, 0x3AE, 0x3AF, - 0x3B0, 0x3B1, 0x3B2, 0x3B3, 0x3B4, 0x3B5, 0x3B6, 0x3B7, - 0x3B8, 0x3B9, 0x3BA, 0x3BB, 0x3BC, 0x3BD, 0x3BE, 0x3BF, - 0x3C0, 0x3C1, 0x3C2, 0x3C3, 0x3C4, 0x3C5, 0x3C6, 0x3C7, - 0x3C8, 0x3C9, 0x3CA, 0x3CB, 0x3CC, 0x3CD, 0x3CE, 0x3CF, - 0x3D0, 0x3D1, 0x3D2, 0x3D3, 0x3D4, 0x3D5, 0x3D6, 0x3D7, - 0x3D8, 0x3D9, 0x3DA, 0x3DB, 0x3DC, 0x3DD, 0x3DE, 0x3DF, - 0x3E0, 0x3E1, 0x3E2, 0x3E3, 0x3E4, 0x3E5, 0x3E6, 0x3E7, - 0x3E8, 0x3E9, 0x3EA, 0x3EB, 0x3EC, 0x3ED, 0x3EE, 0x3EF, - 0x3F0, 0x3F1, 0x3F2, 0x3F3, 0x3F4, 0x3F5, 0x3F6, 0x3F7, - 0x3F8, 0x3F9, 0x3FA, 0x3FB, 0x3FC, 0x3FD, 0x3FE, 0x3FF, - 0x400, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, - 0x408, 0x409, 0x40A, 0x40B, 0x40C, 0x40D, 0x40E, 0x40F, - 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, - 0x418, 0x419, 0x41A, 0x41B, 0x41C, 0x41D, 0x41E, 0x41F, - 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427, - 0x428, 0x429, 0x42A, 0x42B, 0x42C, 0x42D, 0x42E, 0x42F, - 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, - 0x438, 0x439, 0x43A, 0x43B, 0x43C, 0x43D, 0x43E, 0x43F, - 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447, - 0x448, 0x449, 0x44A, 0x44B, 0x44C, 0x44D, 0x44E, 0x44F, - 0x450, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457, - 0x458, 0x459, 0x45A, 0x45B, 0x45C, 0x45D, 0x45E, 0x45F, - 0x460, 0x461, 0x462, 0x463, 0x464, 0x465, 0x466, 0x467, - 0x468, 0x469, 0x46A, 0x46B, 0x46C, 0x46D, 0x46E, 0x46F, - 0x470, 0x471, 0x472, 0x473, 0x474, 0x475, 0x476, 0x477, - 0x478, 0x479, 0x47A, 0x47B, 0x47C, 0x47D, 0x47E, 0x47F, - 0x480, 0x481, 0x482, 0x483, 0x484, 0x485, 0x486, 0x487, - 0x488, 0x489, 0x48A, 0x48B, 0x48C, 0x48D, 0x48E, 0x48F, - 0x490, 0x491, 0x492, 0x493, 0x494, 0x495, 0x496, 0x497, - 0x498, 0x499, 0x49A, 0x49B, 0x49C, 0x49D, 0x49E, 0x49F, - 0x4A0, 0x4A1, 0x4A2, 0x4A3, 0x4A4, 0x4A5, 0x4A6, 0x4A7, - 0x4A8, 0x4A9, 0x4AA, 0x4AB, 0x4AC, 0x4AD, 0x4AE, 0x4AF, - 0x4B0, 0x4B1, 0x4B2, 0x4B3, 0x4B4, 0x4B5, 0x4B6, 0x4B7, - 0x4B8, 0x4B9, 0x4BA, 0x4BB, 0x4BC, 0x4BD, 0x4BE, 0x4BF, - 0x4C0, 0x4C1, 0x4C2, 0x4C3, 0x4C4, 0x4C5, 0x4C6, 0x4C7, - 0x4C8, 0x4C9, 0x4CA, 0x4CB, 0x4CC, 0x4CD, 0x4CE, 0x4CF, - 0x4D0, 0x4D1, 0x4D2, 0x4D3, 0x4D4, 0x4D5, 0x4D6, 0x4D7, - 0x4D8, 0x4D9, 0x4DA, 0x4DB, 0x4DC, 0x4DD, 0x4DE, 0x4DF, - 0x4E0, 0x4E1, 0x4E2, 0x4E3, 0x4E4, 0x4E5, 0x4E6, 0x4E7, - 0x4E8, 0x4E9, 0x4EA, 0x4EB, 0x4EC, 0x4ED, 0x4EE, 0x4EF, - 0x4F0, 0x4F1, 0x4F2, 0x4F3, 0x4F4, 0x4F5, 0x4F6, 0x4F7, - 0x4F8, 0x4F9, 0x4FA, 0x4FB, 0x4FC, 0x4FD, 0x4FE, 0x4FF, - 0x500, 0x501, 0x502, 0x503, 0x504, 0x505, 0x506, 0x507, - 0x508, 0x509, 0x50A, 0x50B, 0x50C, 0x50D, 0x50E, 0x50F, - 0x510, 0x511, 0x512, 0x513, 0x514, 0x515, 0x516, 0x517, - 0x518, 0x519, 0x51A, 0x51B, 0x51C, 0x51D, 0x51E, 0x51F, - 0x520, 0x521, 0x522, 0x523, 0x524, 0x525, 0x526, 0x527, - 0x528, 0x529, 0x52A, 0x52B, 0x52C, 0x52D, 0x52E, 0x52F, - 0x530, 0x531, 0x532, 0x533, 0x534, 0x535, 0x536, 0x537, - 0x538, 0x539, 0x53A, 0x53B, 0x53C, 0x53D, 0x53E, 0x53F, - 0x540, 0x541, 0x542, 0x543, 0x544, 0x545, 0x546, 0x547, - 0x548, 0x549, 0x54A, 0x54B, 0x54C, 0x54D, 0x54E, 0x54F, - 0x550, 0x551, 0x552, 0x553, 0x554, 0x555, 0x556, 0x557, - 0x558, 0x559, 0x55A, 0x55B, 0x55C, 0x55D, 0x55E, 0x55F, - 0x560, 0x561, 0x562, 0x563, 0x564, 0x565, 0x566, 0x567, - 0x568, 0x569, 0x56A, 0x56B, 0x56C, 0x56D, 0x56E, 0x56F, - 0x570, 0x571, 0x572, 0x573, 0x574, 0x575, 0x576, 0x577, - 0x578, 0x579, 0x57A, 0x57B, 0x57C, 0x57D, 0x57E, 0x57F, - 0x580, 0x581, 0x582, 0x583, 0x584, 0x585, 0x586, 0x587, - 0x588, 0x589, 0x58A, 0x58B, 0x58C, 0x58D, 0x58E, 0x58F, - 0x590, 0x591, 0x592, 0x593, 0x594, 0x595, 0x596, 0x597, - 0x598, 0x599, 0x59A, 0x59B, 0x59C, 0x59D, 0x59E, 0x59F, - 0x5A0, 0x5A1, 0x5A2, 0x5A3, 0x5A4, 0x5A5, 0x5A6, 0x5A7, - 0x5A8, 0x5A9, 0x5AA, 0x5AB, 0x5AC, 0x5AD, 0x5AE, 0x5AF, - 0x5B0, 0x5B1, 0x5B2, 0x5B3, 0x5B4, 0x5B5, 0x5B6, 0x5B7, - 0x5B8, 0x5B9, 0x5BA, 0x5BB, 0x5BC, 0x5BD, 0x5BE, 0x5BF, - 0x5C0, 0x5C1, 0x5C2, 0x5C3, 0x5C4, 0x5C5, 0x5C6, 0x5C7, - 0x5C8, 0x5C9, 0x5CA, 0x5CB, 0x5CC, 0x5CD, 0x5CE, 0x5CF, - 0x5D0, 0x5D1, 0x5D2, 0x5D3, 0x5D4, 0x5D5, 0x5D6, 0x5D7, - 0x5D8, 0x5D9, 0x5DA, 0x5DB, 0x5DC, 0x5DD, 0x5DE, 0x5DF, - 0x5E0, 0x5E1, 0x5E2, 0x5E3, 0x5E4, 0x5E5, 0x5E6, 0x5E7, - 0x5E8, 0x5E9, 0x5EA, 0x5EB, 0x5EC, 0x5ED, 0x5EE, 0x5EF, - 0x5F0, 0x5F1, 0x5F2, 0x5F3, 0x5F4, 0x5F5, 0x5F6, 0x5F7, - 0x5F8, 0x5F9, 0x5FA, 0x5FB, 0x5FC, 0x5FD, 0x5FE, 0x5FF, - 0x600, 0x601, 0x602, 0x603, 0x604, 0x605, 0x606, 0x607, - 0x608, 0x609, 0x60A, 0x60B, 0x60C, 0x60D, 0x60E, 0x60F, - 0x610, 0x611, 0x612, 0x613, 0x614, 0x615, 0x616, 0x617, - 0x618, 0x619, 0x61A, 0x61B, 0x61C, 0x61D, 0x61E, 0x61F, - 0x620, 0x621, 0x622, 0x623, 0x624, 0x625, 0x626, 0x627, - 0x628, 0x629, 0x62A, 0x62B, 0x62C, 0x62D, 0x62E, 0x62F, - 0x630, 0x631, 0x632, 0x633, 0x634, 0x635, 0x636, 0x637, - 0x638, 0x639, 0x63A, 0x63B, 0x63C, 0x63D, 0x63E, 0x63F, - 0x640, 0x641, 0x642, 0x643, 0x644, 0x645, 0x646, 0x647, - 0x648, 0x649, 0x64A, 0x64B, 0x64C, 0x64D, 0x64E, 0x64F, - 0x650, 0x651, 0x652, 0x653, 0x654, 0x655, 0x656, 0x657, - 0x658, 0x659, 0x65A, 0x65B, 0x65C, 0x65D, 0x65E, 0x65F, - 0x660, 0x661, 0x662, 0x663, 0x664, 0x665, 0x666, 0x667, - 0x668, 0x669, 0x66A, 0x66B, 0x66C, 0x66D, 0x66E, 0x66F, - 0x670, 0x671, 0x672, 0x673, 0x674, 0x675, 0x676, 0x677, - 0x678, 0x679, 0x67A, 0x67B, 0x67C, 0x67D, 0x67E, 0x67F, - 0x680, 0x681, 0x682, 0x683, 0x684, 0x685, 0x686, 0x687, - 0x688, 0x689, 0x68A, 0x68B, 0x68C, 0x68D, 0x68E, 0x68F, - 0x690, 0x691, 0x692, 0x693, 0x694, 0x695, 0x696, 0x697, - 0x698, 0x699, 0x69A, 0x69B, 0x69C, 0x69D, 0x69E, 0x69F, - 0x6A0, 0x6A1, 0x6A2, 0x6A3, 0x6A4, 0x6A5, 0x6A6, 0x6A7, - 0x6A8, 0x6A9, 0x6AA, 0x6AB, 0x6AC, 0x6AD, 0x6AE, 0x6AF, - 0x6B0, 0x6B1, 0x6B2, 0x6B3, 0x6B4, 0x6B5, 0x6B6, 0x6B7, - 0x6B8, 0x6B9, 0x6BA, 0x6BB, 0x6BC, 0x6BD, 0x6BE, 0x6BF, - 0x6C0, 0x6C1, 0x6C2, 0x6C3, 0x6C4, 0x6C5, 0x6C6, 0x6C7, - 0x6C8, 0x6C9, 0x6CA, 0x6CB, 0x6CC, 0x6CD, 0x6CE, 0x6CF, - 0x6D0, 0x6D1, 0x6D2, 0x6D3, 0x6D4, 0x6D5, 0x6D6, 0x6D7, - 0x6D8, 0x6D9, 0x6DA, 0x6DB, 0x6DC, 0x6DD, 0x6DE, 0x6DF, - 0x6E0, 0x6E1, 0x6E2, 0x6E3, 0x6E4, 0x6E5, 0x6E6, 0x6E7, - 0x6E8, 0x6E9, 0x6EA, 0x6EB, 0x6EC, 0x6ED, 0x6EE, 0x6EF, - 0x6F0, 0x6F1, 0x6F2, 0x6F3, 0x6F4, 0x6F5, 0x6F6, 0x6F7, - 0x6F8, 0x6F9, 0x6FA, 0x6FB, 0x6FC, 0x6FD, 0x6FE, 0x6FF, - 0x700, 0x701, 0x702, 0x703, 0x704, 0x705, 0x706, 0x707, - 0x708, 0x709, 0x70A, 0x70B, 0x70C, 0x70D, 0x70E, 0x70F, - 0x710, 0x711, 0x712, 0x713, 0x714, 0x715, 0x716, 0x717, - 0x718, 0x719, 0x71A, 0x71B, 0x71C, 0x71D, 0x71E, 0x71F, - 0x720, 0x721, 0x722, 0x723, 0x724, 0x725, 0x726, 0x727, - 0x728, 0x729, 0x72A, 0x72B, 0x72C, 0x72D, 0x72E, 0x72F, - 0x730, 0x731, 0x732, 0x733, 0x734, 0x735, 0x736, 0x737, - 0x738, 0x739, 0x73A, 0x73B, 0x73C, 0x73D, 0x73E, 0x73F, - 0x740, 0x741, 0x742, 0x743, 0x744, 0x745, 0x746, 0x747, - 0x748, 0x749, 0x74A, 0x74B, 0x74C, 0x74D, 0x74E, 0x74F, - 0x750, 0x751, 0x752, 0x753, 0x754, 0x755, 0x756, 0x757, - 0x758, 0x759, 0x75A, 0x75B, 0x75C, 0x75D, 0x75E, 0x75F, - 0x760, 0x761, 0x762, 0x763, 0x764, 0x765, 0x766, 0x767, - 0x768, 0x769, 0x76A, 0x76B, 0x76C, 0x76D, 0x76E, 0x76F, - 0x770, 0x771, 0x772, 0x773, 0x774, 0x775, 0x776, 0x777, - 0x778, 0x779, 0x77A, 0x77B, 0x77C, 0x77D, 0x77E, 0x77F, - 0x780, 0x781, 0x782, 0x783, 0x784, 0x785, 0x786, 0x787, - 0x788, 0x789, 0x78A, 0x78B, 0x78C, 0x78D, 0x78E, 0x78F, - 0x790, 0x791, 0x792, 0x793, 0x794, 0x795, 0x796, 0x797, - 0x798, 0x799, 0x79A, 0x79B, 0x79C, 0x79D, 0x79E, 0x79F, - 0x7A0, 0x7A1, 0x7A2, 0x7A3, 0x7A4, 0x7A5, 0x7A6, 0x7A7, - 0x7A8, 0x7A9, 0x7AA, 0x7AB, 0x7AC, 0x7AD, 0x7AE, 0x7AF, - 0x7B0, 0x7B1, 0x7B2, 0x7B3, 0x7B4, 0x7B5, 0x7B6, 0x7B7, - 0x7B8, 0x7B9, 0x7BA, 0x7BB, 0x7BC, 0x7BD, 0x7BE, 0x7BF, - 0x7C0, 0x7C1, 0x7C2, 0x7C3, 0x7C4, 0x7C5, 0x7C6, 0x7C7, - 0x7C8, 0x7C9, 0x7CA, 0x7CB, 0x7CC, 0x7CD, 0x7CE, 0x7CF, - 0x7D0, 0x7D1, 0x7D2, 0x7D3, 0x7D4, 0x7D5, 0x7D6, 0x7D7, - 0x7D8, 0x7D9, 0x7DA, 0x7DB, 0x7DC, 0x7DD, 0x7DE, 0x7DF, - 0x7E0, 0x7E1, 0x7E2, 0x7E3, 0x7E4, 0x7E5, 0x7E6, 0x7E7, - 0x7E8, 0x7E9, 0x7EA, 0x7EB, 0x7EC, 0x7ED, 0x7EE, 0x7EF, - 0x7F0, 0x7F1, 0x7F2, 0x7F3, 0x7F4, 0x7F5, 0x7F6, 0x7F7, - 0x7F8, 0x7F9, 0x7FA, 0x7FB, 0x7FC, 0x7FD, 0x7FE, 0x7FF, - 0x800, 0x801, 0x802, 0x803, 0x804, 0x805, 0x806, 0x807, - 0x808, 0x809, 0x80A, 0x80B, 0x80C, 0x80D, 0x80E, 0x80F, - 0x810, 0x811, 0x812, 0x813, 0x814, 0x815, 0x816, 0x817, - 0x818, 0x819, 0x81A, 0x81B, 0x81C, 0x81D, 0x81E, 0x81F, - 0x820, 0x821, 0x822, 0x823, 0x824, 0x825, 0x826, 0x827, - 0x828, 0x829, 0x82A, 0x82B, 0x82C, 0x82D, 0x82E, 0x82F, - 0x830, 0x831, 0x832, 0x833, 0x834, 0x835, 0x836, 0x837, - 0x838, 0x839, 0x83A, 0x83B, 0x83C, 0x83D, 0x83E, 0x83F, - 0x840, 0x841, 0x842, 0x843, 0x844, 0x845, 0x846, 0x847, - 0x848, 0x849, 0x84A, 0x84B, 0x84C, 0x84D, 0x84E, 0x84F, - 0x850, 0x851, 0x852, 0x853, 0x854, 0x855, 0x856, 0x857, - 0x858, 0x859, 0x85A, 0x85B, 0x85C, 0x85D, 0x85E, 0x85F, - 0x860, 0x861, 0x862, 0x863, 0x864, 0x865, 0x866, 0x867, - 0x868, 0x869, 0x86A, 0x86B, 0x86C, 0x86D, 0x86E, 0x86F, - 0x870, 0x871, 0x872, 0x873, 0x874, 0x875, 0x876, 0x877, - 0x878, 0x879, 0x87A, 0x87B, 0x87C, 0x87D, 0x87E, 0x87F, - 0x880, 0x881, 0x882, 0x883, 0x884, 0x885, 0x886, 0x887, - 0x888, 0x889, 0x88A, 0x88B, 0x88C, 0x88D, 0x88E, 0x88F, - 0x890, 0x891, 0x892, 0x893, 0x894, 0x895, 0x896, 0x897, - 0x898, 0x899, 0x89A, 0x89B, 0x89C, 0x89D, 0x89E, 0x89F, - 0x8A0, 0x8A1, 0x8A2, 0x8A3, 0x8A4, 0x8A5, 0x8A6, 0x8A7, - 0x8A8, 0x8A9, 0x8AA, 0x8AB, 0x8AC, 0x8AD, 0x8AE, 0x8AF, - 0x8B0, 0x8B1, 0x8B2, 0x8B3, 0x8B4, 0x8B5, 0x8B6, 0x8B7, - 0x8B8, 0x8B9, 0x8BA, 0x8BB, 0x8BC, 0x8BD, 0x8BE, 0x8BF, - 0x8C0, 0x8C1, 0x8C2, 0x8C3, 0x8C4, 0x8C5, 0x8C6, 0x8C7, - 0x8C8, 0x8C9, 0x8CA, 0x8CB, 0x8CC, 0x8CD, 0x8CE, 0x8CF, - 0x8D0, 0x8D1, 0x8D2, 0x8D3, 0x8D4, 0x8D5, 0x8D6, 0x8D7, - 0x8D8, 0x8D9, 0x8DA, 0x8DB, 0x8DC, 0x8DD, 0x8DE, 0x8DF, - 0x8E0, 0x8E1, 0x8E2, 0x8E3, 0x8E4, 0x8E5, 0x8E6, 0x8E7, - 0x8E8, 0x8E9, 0x8EA, 0x8EB, 0x8EC, 0x8ED, 0x8EE, 0x8EF, - 0x8F0, 0x8F1, 0x8F2, 0x8F3, 0x8F4, 0x8F5, 0x8F6, 0x8F7, - 0x8F8, 0x8F9, 0x8FA, 0x8FB, 0x8FC, 0x8FD, 0x8FE, 0x8FF, - 0x900, 0x901, 0x902, 0x903, 0x904, 0x905, 0x906, 0x907, - 0x908, 0x909, 0x90A, 0x90B, 0x90C, 0x90D, 0x90E, 0x90F, - 0x910, 0x911, 0x912, 0x913, 0x914, 0x915, 0x916, 0x917, - 0x918, 0x919, 0x91A, 0x91B, 0x91C, 0x91D, 0x91E, 0x91F, - 0x920, 0x921, 0x922, 0x923, 0x924, 0x925, 0x926, 0x927, - 0x928, 0x929, 0x92A, 0x92B, 0x92C, 0x92D, 0x92E, 0x92F, - 0x930, 0x931, 0x932, 0x933, 0x934, 0x935, 0x936, 0x937, - 0x938, 0x939, 0x93A, 0x93B, 0x93C, 0x93D, 0x93E, 0x93F, - 0x940, 0x941, 0x942, 0x943, 0x944, 0x945, 0x946, 0x947, - 0x948, 0x949, 0x94A, 0x94B, 0x94C, 0x94D, 0x94E, 0x94F, - 0x950, 0x951, 0x952, 0x953, 0x954, 0x955, 0x956, 0x957, - 0x958, 0x959, 0x95A, 0x95B, 0x95C, 0x95D, 0x95E, 0x95F, - 0x960, 0x961, 0x962, 0x963, 0x964, 0x965, 0x966, 0x967, - 0x968, 0x969, 0x96A, 0x96B, 0x96C, 0x96D, 0x96E, 0x96F, - 0x970, 0x971, 0x972, 0x973, 0x974, 0x975, 0x976, 0x977, - 0x978, 0x979, 0x97A, 0x97B, 0x97C, 0x97D, 0x97E, 0x97F, - 0x980, 0x981, 0x982, 0x983, 0x984, 0x985, 0x986, 0x987, - 0x988, 0x989, 0x98A, 0x98B, 0x98C, 0x98D, 0x98E, 0x98F, - 0x990, 0x991, 0x992, 0x993, 0x994, 0x995, 0x996, 0x997, - 0x998, 0x999, 0x99A, 0x99B, 0x99C, 0x99D, 0x99E, 0x99F, - 0x9A0, 0x9A1, 0x9A2, 0x9A3, 0x9A4, 0x9A5, 0x9A6, 0x9A7, - 0x9A8, 0x9A9, 0x9AA, 0x9AB, 0x9AC, 0x9AD, 0x9AE, 0x9AF, - 0x9B0, 0x9B1, 0x9B2, 0x9B3, 0x9B4, 0x9B5, 0x9B6, 0x9B7, - 0x9B8, 0x9B9, 0x9BA, 0x9BB, 0x9BC, 0x9BD, 0x9BE, 0x9BF, - 0x9C0, 0x9C1, 0x9C2, 0x9C3, 0x9C4, 0x9C5, 0x9C6, 0x9C7, - 0x9C8, 0x9C9, 0x9CA, 0x9CB, 0x9CC, 0x9CD, 0x9CE, 0x9CF, - 0x9D0, 0x9D1, 0x9D2, 0x9D3, 0x9D4, 0x9D5, 0x9D6, 0x9D7, - 0x9D8, 0x9D9, 0x9DA, 0x9DB, 0x9DC, 0x9DD, 0x9DE, 0x9DF, - 0x9E0, 0x9E1, 0x9E2, 0x9E3, 0x9E4, 0x9E5, 0x9E6, 0x9E7, - 0x9E8, 0x9E9, 0x9EA, 0x9EB, 0x9EC, 0x9ED, 0x9EE, 0x9EF, - 0x9F0, 0x9F1, 0x9F2, 0x9F3, 0x9F4, 0x9F5, 0x9F6, 0x9F7, - 0x9F8, 0x9F9, 0x9FA, 0x9FB, 0x9FC, 0x9FD, 0x9FE, 0x9FF, - 0xA00, 0xA01, 0xA02, 0xA03, 0xA04, 0xA05, 0xA06, 0xA07, - 0xA08, 0xA09, 0xA0A, 0xA0B, 0xA0C, 0xA0D, 0xA0E, 0xA0F, - 0xA10, 0xA11, 0xA12, 0xA13, 0xA14, 0xA15, 0xA16, 0xA17, - 0xA18, 0xA19, 0xA1A, 0xA1B, 0xA1C, 0xA1D, 0xA1E, 0xA1F, - 0xA20, 0xA21, 0xA22, 0xA23, 0xA24, 0xA25, 0xA26, 0xA27, - 0xA28, 0xA29, 0xA2A, 0xA2B, 0xA2C, 0xA2D, 0xA2E, 0xA2F, - 0xA30, 0xA31, 0xA32, 0xA33, 0xA34, 0xA35, 0xA36, 0xA37, - 0xA38, 0xA39, 0xA3A, 0xA3B, 0xA3C, 0xA3D, 0xA3E, 0xA3F, - 0xA40, 0xA41, 0xA42, 0xA43, 0xA44, 0xA45, 0xA46, 0xA47, - 0xA48, 0xA49, 0xA4A, 0xA4B, 0xA4C, 0xA4D, 0xA4E, 0xA4F, - 0xA50, 0xA51, 0xA52, 0xA53, 0xA54, 0xA55, 0xA56, 0xA57, - 0xA58, 0xA59, 0xA5A, 0xA5B, 0xA5C, 0xA5D, 0xA5E, 0xA5F, - 0xA60, 0xA61, 0xA62, 0xA63, 0xA64, 0xA65, 0xA66, 0xA67, - 0xA68, 0xA69, 0xA6A, 0xA6B, 0xA6C, 0xA6D, 0xA6E, 0xA6F, - 0xA70, 0xA71, 0xA72, 0xA73, 0xA74, 0xA75, 0xA76, 0xA77, - 0xA78, 0xA79, 0xA7A, 0xA7B, 0xA7C, 0xA7D, 0xA7E, 0xA7F, - 0xA80, 0xA81, 0xA82, 0xA83, 0xA84, 0xA85, 0xA86, 0xA87, - 0xA88, 0xA89, 0xA8A, 0xA8B, 0xA8C, 0xA8D, 0xA8E, 0xA8F, - 0xA90, 0xA91, 0xA92, 0xA93, 0xA94, 0xA95, 0xA96, 0xA97, - 0xA98, 0xA99, 0xA9A, 0xA9B, 0xA9C, 0xA9D, 0xA9E, 0xA9F, - 0xAA0, 0xAA1, 0xAA2, 0xAA3, 0xAA4, 0xAA5, 0xAA6, 0xAA7, - 0xAA8, 0xAA9, 0xAAA, 0xAAB, 0xAAC, 0xAAD, 0xAAE, 0xAAF, - 0xAB0, 0xAB1, 0xAB2, 0xAB3, 0xAB4, 0xAB5, 0xAB6, 0xAB7, - 0xAB8, 0xAB9, 0xABA, 0xABB, 0xABC, 0xABD, 0xABE, 0xABF, - 0xAC0, 0xAC1, 0xAC2, 0xAC3, 0xAC4, 0xAC5, 0xAC6, 0xAC7, - 0xAC8, 0xAC9, 0xACA, 0xACB, 0xACC, 0xACD, 0xACE, 0xACF, - 0xAD0, 0xAD1, 0xAD2, 0xAD3, 0xAD4, 0xAD5, 0xAD6, 0xAD7, - 0xAD8, 0xAD9, 0xADA, 0xADB, 0xADC, 0xADD, 0xADE, 0xADF, - 0xAE0, 0xAE1, 0xAE2, 0xAE3, 0xAE4, 0xAE5, 0xAE6, 0xAE7, - 0xAE8, 0xAE9, 0xAEA, 0xAEB, 0xAEC, 0xAED, 0xAEE, 0xAEF, - 0xAF0, 0xAF1, 0xAF2, 0xAF3, 0xAF4, 0xAF5, 0xAF6, 0xAF7, - 0xAF8, 0xAF9, 0xAFA, 0xAFB, 0xAFC, 0xAFD, 0xAFE, 0xAFF, - 0xB00, 0xB01, 0xB02, 0xB03, 0xB04, 0xB05, 0xB06, 0xB07, - 0xB08, 0xB09, 0xB0A, 0xB0B, 0xB0C, 0xB0D, 0xB0E, 0xB0F, - 0xB10, 0xB11, 0xB12, 0xB13, 0xB14, 0xB15, 0xB16, 0xB17, - 0xB18, 0xB19, 0xB1A, 0xB1B, 0xB1C, 0xB1D, 0xB1E, 0xB1F, - 0xB20, 0xB21, 0xB22, 0xB23, 0xB24, 0xB25, 0xB26, 0xB27, - 0xB28, 0xB29, 0xB2A, 0xB2B, 0xB2C, 0xB2D, 0xB2E, 0xB2F, - 0xB30, 0xB31, 0xB32, 0xB33, 0xB34, 0xB35, 0xB36, 0xB37, - 0xB38, 0xB39, 0xB3A, 0xB3B, 0xB3C, 0xB3D, 0xB3E, 0xB3F, - 0xB40, 0xB41, 0xB42, 0xB43, 0xB44, 0xB45, 0xB46, 0xB47, - 0xB48, 0xB49, 0xB4A, 0xB4B, 0xB4C, 0xB4D, 0xB4E, 0xB4F, - 0xB50, 0xB51, 0xB52, 0xB53, 0xB54, 0xB55, 0xB56, 0xB57, - 0xB58, 0xB59, 0xB5A, 0xB5B, 0xB5C, 0xB5D, 0xB5E, 0xB5F, - 0xB60, 0xB61, 0xB62, 0xB63, 0xB64, 0xB65, 0xB66, 0xB67, - 0xB68, 0xB69, 0xB6A, 0xB6B, 0xB6C, 0xB6D, 0xB6E, 0xB6F, - 0xB70, 0xB71, 0xB72, 0xB73, 0xB74, 0xB75, 0xB76, 0xB77, - 0xB78, 0xB79, 0xB7A, 0xB7B, 0xB7C, 0xB7D, 0xB7E, 0xB7F, - 0xB80, 0xB81, 0xB82, 0xB83, 0xB84, 0xB85, 0xB86, 0xB87, - 0xB88, 0xB89, 0xB8A, 0xB8B, 0xB8C, 0xB8D, 0xB8E, 0xB8F, - 0xB90, 0xB91, 0xB92, 0xB93, 0xB94, 0xB95, 0xB96, 0xB97, - 0xB98, 0xB99, 0xB9A, 0xB9B, 0xB9C, 0xB9D, 0xB9E, 0xB9F, - 0xBA0, 0xBA1, 0xBA2, 0xBA3, 0xBA4, 0xBA5, 0xBA6, 0xBA7, - 0xBA8, 0xBA9, 0xBAA, 0xBAB, 0xBAC, 0xBAD, 0xBAE, 0xBAF, - 0xBB0, 0xBB1, 0xBB2, 0xBB3, 0xBB4, 0xBB5, 0xBB6, 0xBB7, - 0xBB8, 0xBB9, 0xBBA, 0xBBB, 0xBBC, 0xBBD, 0xBBE, 0xBBF, - 0xBC0, 0xBC1, 0xBC2, 0xBC3, 0xBC4, 0xBC5, 0xBC6, 0xBC7, - 0xBC8, 0xBC9, 0xBCA, 0xBCB, 0xBCC, 0xBCD, 0xBCE, 0xBCF, - 0xBD0, 0xBD1, 0xBD2, 0xBD3, 0xBD4, 0xBD5, 0xBD6, 0xBD7, - 0xBD8, 0xBD9, 0xBDA, 0xBDB, 0xBDC, 0xBDD, 0xBDE, 0xBDF, - 0xBE0, 0xBE1, 0xBE2, 0xBE3, 0xBE4, 0xBE5, 0xBE6, 0xBE7, - 0xBE8, 0xBE9, 0xBEA, 0xBEB, 0xBEC, 0xBED, 0xBEE, 0xBEF, - 0xBF0, 0xBF1, 0xBF2, 0xBF3, 0xBF4, 0xBF5, 0xBF6, 0xBF7, - 0xBF8, 0xBF9, 0xBFA, 0xBFB, 0xBFC, 0xBFD, 0xBFE, 0xBFF, - 0xC00, 0xC01, 0xC02, 0xC03, 0xC04, 0xC05, 0xC06, 0xC07, - 0xC08, 0xC09, 0xC0A, 0xC0B, 0xC0C, 0xC0D, 0xC0E, 0xC0F, - 0xC10, 0xC11, 0xC12, 0xC13, 0xC14, 0xC15, 0xC16, 0xC17, - 0xC18, 0xC19, 0xC1A, 0xC1B, 0xC1C, 0xC1D, 0xC1E, 0xC1F, - 0xC20, 0xC21, 0xC22, 0xC23, 0xC24, 0xC25, 0xC26, 0xC27, - 0xC28, 0xC29, 0xC2A, 0xC2B, 0xC2C, 0xC2D, 0xC2E, 0xC2F, - 0xC30, 0xC31, 0xC32, 0xC33, 0xC34, 0xC35, 0xC36, 0xC37, - 0xC38, 0xC39, 0xC3A, 0xC3B, 0xC3C, 0xC3D, 0xC3E, 0xC3F, - 0xC40, 0xC41, 0xC42, 0xC43, 0xC44, 0xC45, 0xC46, 0xC47, - 0xC48, 0xC49, 0xC4A, 0xC4B, 0xC4C, 0xC4D, 0xC4E, 0xC4F, - 0xC50, 0xC51, 0xC52, 0xC53, 0xC54, 0xC55, 0xC56, 0xC57, - 0xC58, 0xC59, 0xC5A, 0xC5B, 0xC5C, 0xC5D, 0xC5E, 0xC5F, - 0xC60, 0xC61, 0xC62, 0xC63, 0xC64, 0xC65, 0xC66, 0xC67, - 0xC68, 0xC69, 0xC6A, 0xC6B, 0xC6C, 0xC6D, 0xC6E, 0xC6F, - 0xC70, 0xC71, 0xC72, 0xC73, 0xC74, 0xC75, 0xC76, 0xC77, - 0xC78, 0xC79, 0xC7A, 0xC7B, 0xC7C, 0xC7D, 0xC7E, 0xC7F, - 0xC80, 0xC81, 0xC82, 0xC83, 0xC84, 0xC85, 0xC86, 0xC87, - 0xC88, 0xC89, 0xC8A, 0xC8B, 0xC8C, 0xC8D, 0xC8E, 0xC8F, - 0xC90, 0xC91, 0xC92, 0xC93, 0xC94, 0xC95, 0xC96, 0xC97, - 0xC98, 0xC99, 0xC9A, 0xC9B, 0xC9C, 0xC9D, 0xC9E, 0xC9F, - 0xCA0, 0xCA1, 0xCA2, 0xCA3, 0xCA4, 0xCA5, 0xCA6, 0xCA7, - 0xCA8, 0xCA9, 0xCAA, 0xCAB, 0xCAC, 0xCAD, 0xCAE, 0xCAF, - 0xCB0, 0xCB1, 0xCB2, 0xCB3, 0xCB4, 0xCB5, 0xCB6, 0xCB7, - 0xCB8, 0xCB9, 0xCBA, 0xCBB, 0xCBC, 0xCBD, 0xCBE, 0xCBF, - 0xCC0, 0xCC1, 0xCC2, 0xCC3, 0xCC4, 0xCC5, 0xCC6, 0xCC7, - 0xCC8, 0xCC9, 0xCCA, 0xCCB, 0xCCC, 0xCCD, 0xCCE, 0xCCF, - 0xCD0, 0xCD1, 0xCD2, 0xCD3, 0xCD4, 0xCD5, 0xCD6, 0xCD7, - 0xCD8, 0xCD9, 0xCDA, 0xCDB, 0xCDC, 0xCDD, 0xCDE, 0xCDF, - 0xCE0, 0xCE1, 0xCE2, 0xCE3, 0xCE4, 0xCE5, 0xCE6, 0xCE7, - 0xCE8, 0xCE9, 0xCEA, 0xCEB, 0xCEC, 0xCED, 0xCEE, 0xCEF, - 0xCF0, 0xCF1, 0xCF2, 0xCF3, 0xCF4, 0xCF5, 0xCF6, 0xCF7, - 0xCF8, 0xCF9, 0xCFA, 0xCFB, 0xCFC, 0xCFD, 0xCFE, 0xCFF, - 0xD00, 0xD01, 0xD02, 0xD03, 0xD04, 0xD05, 0xD06, 0xD07, - 0xD08, 0xD09, 0xD0A, 0xD0B, 0xD0C, 0xD0D, 0xD0E, 0xD0F, - 0xD10, 0xD11, 0xD12, 0xD13, 0xD14, 0xD15, 0xD16, 0xD17, - 0xD18, 0xD19, 0xD1A, 0xD1B, 0xD1C, 0xD1D, 0xD1E, 0xD1F, - 0xD20, 0xD21, 0xD22, 0xD23, 0xD24, 0xD25, 0xD26, 0xD27, - 0xD28, 0xD29, 0xD2A, 0xD2B, 0xD2C, 0xD2D, 0xD2E, 0xD2F, - 0xD30, 0xD31, 0xD32, 0xD33, 0xD34, 0xD35, 0xD36, 0xD37, - 0xD38, 0xD39, 0xD3A, 0xD3B, 0xD3C, 0xD3D, 0xD3E, 0xD3F, - 0xD40, 0xD41, 0xD42, 0xD43, 0xD44, 0xD45, 0xD46, 0xD47, - 0xD48, 0xD49, 0xD4A, 0xD4B, 0xD4C, 0xD4D, 0xD4E, 0xD4F, - 0xD50, 0xD51, 0xD52, 0xD53, 0xD54, 0xD55, 0xD56, 0xD57, - 0xD58, 0xD59, 0xD5A, 0xD5B, 0xD5C, 0xD5D, 0xD5E, 0xD5F, - 0xD60, 0xD61, 0xD62, 0xD63, 0xD64, 0xD65, 0xD66, 0xD67, - 0xD68, 0xD69, 0xD6A, 0xD6B, 0xD6C, 0xD6D, 0xD6E, 0xD6F, - 0xD70, 0xD71, 0xD72, 0xD73, 0xD74, 0xD75, 0xD76, 0xD77, - 0xD78, 0xD79, 0xD7A, 0xD7B, 0xD7C, 0xD7D, 0xD7E, 0xD7F, - 0xD80, 0xD81, 0xD82, 0xD83, 0xD84, 0xD85, 0xD86, 0xD87, - 0xD88, 0xD89, 0xD8A, 0xD8B, 0xD8C, 0xD8D, 0xD8E, 0xD8F, - 0xD90, 0xD91, 0xD92, 0xD93, 0xD94, 0xD95, 0xD96, 0xD97, - 0xD98, 0xD99, 0xD9A, 0xD9B, 0xD9C, 0xD9D, 0xD9E, 0xD9F, - 0xDA0, 0xDA1, 0xDA2, 0xDA3, 0xDA4, 0xDA5, 0xDA6, 0xDA7, - 0xDA8, 0xDA9, 0xDAA, 0xDAB, 0xDAC, 0xDAD, 0xDAE, 0xDAF, - 0xDB0, 0xDB1, 0xDB2, 0xDB3, 0xDB4, 0xDB5, 0xDB6, 0xDB7, - 0xDB8, 0xDB9, 0xDBA, 0xDBB, 0xDBC, 0xDBD, 0xDBE, 0xDBF, - 0xDC0, 0xDC1, 0xDC2, 0xDC3, 0xDC4, 0xDC5, 0xDC6, 0xDC7, - 0xDC8, 0xDC9, 0xDCA, 0xDCB, 0xDCC, 0xDCD, 0xDCE, 0xDCF, - 0xDD0, 0xDD1, 0xDD2, 0xDD3, 0xDD4, 0xDD5, 0xDD6, 0xDD7, - 0xDD8, 0xDD9, 0xDDA, 0xDDB, 0xDDC, 0xDDD, 0xDDE, 0xDDF, - 0xDE0, 0xDE1, 0xDE2, 0xDE3, 0xDE4, 0xDE5, 0xDE6, 0xDE7, - 0xDE8, 0xDE9, 0xDEA, 0xDEB, 0xDEC, 0xDED, 0xDEE, 0xDEF, - 0xDF0, 0xDF1, 0xDF2, 0xDF3, 0xDF4, 0xDF5, 0xDF6, 0xDF7, - 0xDF8, 0xDF9, 0xDFA, 0xDFB, 0xDFC, 0xDFD, 0xDFE, 0xDFF, - 0xE00, 0xE01, 0xE02, 0xE03, 0xE04, 0xE05, 0xE06, 0xE07, - 0xE08, 0xE09, 0xE0A, 0xE0B, 0xE0C, 0xE0D, 0xE0E, 0xE0F, - 0xE10, 0xE11, 0xE12, 0xE13, 0xE14, 0xE15, 0xE16, 0xE17, - 0xE18, 0xE19, 0xE1A, 0xE1B, 0xE1C, 0xE1D, 0xE1E, 0xE1F, - 0xE20, 0xE21, 0xE22, 0xE23, 0xE24, 0xE25, 0xE26, 0xE27, - 0xE28, 0xE29, 0xE2A, 0xE2B, 0xE2C, 0xE2D, 0xE2E, 0xE2F, - 0xE30, 0xE31, 0xE32, 0xE33, 0xE34, 0xE35, 0xE36, 0xE37, - 0xE38, 0xE39, 0xE3A, 0xE3B, 0xE3C, 0xE3D, 0xE3E, 0xE3F, - 0xE40, 0xE41, 0xE42, 0xE43, 0xE44, 0xE45, 0xE46, 0xE47, - 0xE48, 0xE49, 0xE4A, 0xE4B, 0xE4C, 0xE4D, 0xE4E, 0xE4F, - 0xE50, 0xE51, 0xE52, 0xE53, 0xE54, 0xE55, 0xE56, 0xE57, - 0xE58, 0xE59, 0xE5A, 0xE5B, 0xE5C, 0xE5D, 0xE5E, 0xE5F, - 0xE60, 0xE61, 0xE62, 0xE63, 0xE64, 0xE65, 0xE66, 0xE67, - 0xE68, 0xE69, 0xE6A, 0xE6B, 0xE6C, 0xE6D, 0xE6E, 0xE6F, - 0xE70, 0xE71, 0xE72, 0xE73, 0xE74, 0xE75, 0xE76, 0xE77, - 0xE78, 0xE79, 0xE7A, 0xE7B, 0xE7C, 0xE7D, 0xE7E, 0xE7F, - 0xE80, 0xE81, 0xE82, 0xE83, 0xE84, 0xE85, 0xE86, 0xE87, - 0xE88, 0xE89, 0xE8A, 0xE8B, 0xE8C, 0xE8D, 0xE8E, 0xE8F, - 0xE90, 0xE91, 0xE92, 0xE93, 0xE94, 0xE95, 0xE96, 0xE97, - 0xE98, 0xE99, 0xE9A, 0xE9B, 0xE9C, 0xE9D, 0xE9E, 0xE9F, - 0xEA0, 0xEA1, 0xEA2, 0xEA3, 0xEA4, 0xEA5, 0xEA6, 0xEA7, - 0xEA8, 0xEA9, 0xEAA, 0xEAB, 0xEAC, 0xEAD, 0xEAE, 0xEAF, - 0xEB0, 0xEB1, 0xEB2, 0xEB3, 0xEB4, 0xEB5, 0xEB6, 0xEB7, - 0xEB8, 0xEB9, 0xEBA, 0xEBB, 0xEBC, 0xEBD, 0xEBE, 0xEBF, - 0xEC0, 0xEC1, 0xEC2, 0xEC3, 0xEC4, 0xEC5, 0xEC6, 0xEC7, - 0xEC8, 0xEC9, 0xECA, 0xECB, 0xECC, 0xECD, 0xECE, 0xECF, - 0xED0, 0xED1, 0xED2, 0xED3, 0xED4, 0xED5, 0xED6, 0xED7, - 0xED8, 0xED9, 0xEDA, 0xEDB, 0xEDC, 0xEDD, 0xEDE, 0xEDF, - 0xEE0, 0xEE1, 0xEE2, 0xEE3, 0xEE4, 0xEE5, 0xEE6, 0xEE7, - 0xEE8, 0xEE9, 0xEEA, 0xEEB, 0xEEC, 0xEED, 0xEEE, 0xEEF, - 0xEF0, 0xEF1, 0xEF2, 0xEF3, 0xEF4, 0xEF5, 0xEF6, 0xEF7, - 0xEF8, 0xEF9, 0xEFA, 0xEFB, 0xEFC, 0xEFD, 0xEFE, 0xEFF, - 0xF00, 0xF01, 0xF02, 0xF03, 0xF04, 0xF05, 0xF06, 0xF07, - 0xF08, 0xF09, 0xF0A, 0xF0B, 0xF0C, 0xF0D, 0xF0E, 0xF0F, - 0xF10, 0xF11, 0xF12, 0xF13, 0xF14, 0xF15, 0xF16, 0xF17, - 0xF18, 0xF19, 0xF1A, 0xF1B, 0xF1C, 0xF1D, 0xF1E, 0xF1F, - 0xF20, 0xF21, 0xF22, 0xF23, 0xF24, 0xF25, 0xF26, 0xF27, - 0xF28, 0xF29, 0xF2A, 0xF2B, 0xF2C, 0xF2D, 0xF2E, 0xF2F, - 0xF30, 0xF31, 0xF32, 0xF33, 0xF34, 0xF35, 0xF36, 0xF37, - 0xF38, 0xF39, 0xF3A, 0xF3B, 0xF3C, 0xF3D, 0xF3E, 0xF3F, - 0xF40, 0xF41, 0xF42, 0xF43, 0xF44, 0xF45, 0xF46, 0xF47, - 0xF48, 0xF49, 0xF4A, 0xF4B, 0xF4C, 0xF4D, 0xF4E, 0xF4F, - 0xF50, 0xF51, 0xF52, 0xF53, 0xF54, 0xF55, 0xF56, 0xF57, - 0xF58, 0xF59, 0xF5A, 0xF5B, 0xF5C, 0xF5D, 0xF5E, 0xF5F, - 0xF60, 0xF61, 0xF62, 0xF63, 0xF64, 0xF65, 0xF66, 0xF67, - 0xF68, 0xF69, 0xF6A, 0xF6B, 0xF6C, 0xF6D, 0xF6E, 0xF6F, - 0xF70, 0xF71, 0xF72, 0xF73, 0xF74, 0xF75, 0xF76, 0xF77, - 0xF78, 0xF79, 0xF7A, 0xF7B, 0xF7C, 0xF7D, 0xF7E, 0xF7F, - 0xF80, 0xF81, 0xF82, 0xF83, 0xF84, 0xF85, 0xF86, 0xF87, - 0xF88, 0xF89, 0xF8A, 0xF8B, 0xF8C, 0xF8D, 0xF8E, 0xF8F, - 0xF90, 0xF91, 0xF92, 0xF93, 0xF94, 0xF95, 0xF96, 0xF97, - 0xF98, 0xF99, 0xF9A, 0xF9B, 0xF9C, 0xF9D, 0xF9E, 0xF9F, - 0xFA0, 0xFA1, 0xFA2, 0xFA3, 0xFA4, 0xFA5, 0xFA6, 0xFA7, - 0xFA8, 0xFA9, 0xFAA, 0xFAB, 0xFAC, 0xFAD, 0xFAE, 0xFAF, - 0xFB0, 0xFB1, 0xFB2, 0xFB3, 0xFB4, 0xFB5, 0xFB6, 0xFB7, - 0xFB8, 0xFB9, 0xFBA, 0xFBB, 0xFBC, 0xFBD, 0xFBE, 0xFBF, - 0xFC0, 0xFC1, 0xFC2, 0xFC3, 0xFC4, 0xFC5, 0xFC6, 0xFC7, - 0xFC8, 0xFC9, 0xFCA, 0xFCB, 0xFCC, 0xFCD, 0xFCE, 0xFCF, - 0xFD0, 0xFD1, 0xFD2, 0xFD3, 0xFD4, 0xFD5, 0xFD6, 0xFD7, - 0xFD8, 0xFD9, 0xFDA, 0xFDB, 0xFDC, 0xFDD, 0xFDE, 0xFDF, - 0xFE0, 0xFE1, 0xFE2, 0xFE3, 0xFE4, 0xFE5, 0xFE6, 0xFE7, - 0xFE8, 0xFE9, 0xFEA, 0xFEB, 0xFEC, 0xFED, 0xFEE, 0xFEF, - 0xFF0, 0xFF1, 0xFF2, 0xFF3, 0xFF4, 0xFF5, 0xFF6, 0xFF7, - 0xFF8, 0xFF9, 0xFFA, 0xFFB, 0xFFC, 0xFFD, 0xFFE, 0xFFF - }, - new short[] { - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x060, 0x070, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x020, 0x030, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0C0, - 0x000, 0x0C0, 0x0C0, 0x0E0, 0x0E0, 0x0F0, 0x0F0, 0x0FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x018, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x040, 0x060, 0x060, 0x070, 0x0F0, 0x0FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x060, 0x070, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x100, 0x100, 0x180, 0x180, 0x180, - 0x100, 0x180, 0x180, 0x180, 0x180, 0x1C0, 0x1C0, 0x1C0, - 0x1C0, 0x1C0, 0x1E0, 0x1E0, 0x1E0, 0x3F0, 0x3F8, 0x3FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x018, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x040, 0x060, 0x070, 0x070, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x020, 0x030, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x080, 0x000, 0x080, 0x0C0, 0x0C0, - 0x0C0, 0x0C0, 0x0C0, 0x1E0, 0x1E0, 0x1F0, 0x1F8, 0x1FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x020, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x040, 0x040, 0x0E0, 0x0E0, 0x0F0, 0x0F0, 0x0FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x020, 0x070, 0x070, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x200, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x200, 0x200, 0x200, - 0x200, 0x200, 0x300, 0x300, 0x300, 0x300, 0x300, 0x31C, - 0x200, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, - 0x300, 0x300, 0x380, 0x380, 0x380, 0x380, 0x380, 0x388, - 0x380, 0x380, 0x380, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x7C0, - 0x3C0, 0x7C0, 0x7E0, 0x7E0, 0x7E0, 0x7F0, 0x7F8, 0x7FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x060, 0x070, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x020, 0x030, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0C0, - 0x000, 0x0C0, 0x0C0, 0x0E0, 0x0E0, 0x0F0, 0x0F0, 0x0FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x018, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x040, 0x060, 0x060, 0x070, 0x0F0, 0x0FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x060, 0x070, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x100, 0x100, 0x180, 0x180, 0x180, - 0x100, 0x180, 0x180, 0x180, 0x180, 0x1C0, 0x1C0, 0x1C0, - 0x1C0, 0x1C0, 0x1E0, 0x1E0, 0x1E0, 0x3F0, 0x3F8, 0x3FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x018, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x040, 0x060, 0x070, 0x070, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x020, 0x030, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x080, 0x000, 0x080, 0x0C0, 0x0C0, - 0x0C0, 0x0C0, 0x0C0, 0x1E0, 0x1E0, 0x1F0, 0x1F8, 0x1FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x020, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x040, 0x040, 0x0E0, 0x0E0, 0x0F0, 0x0F0, 0x0FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x020, 0x070, 0x070, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x03C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x200, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x200, 0x200, 0x200, - 0x200, 0x200, 0x300, 0x300, 0x300, 0x300, 0x300, 0x31C, - 0x200, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, 0x300, - 0x300, 0x300, 0x380, 0x380, 0x380, 0x380, 0x380, 0x388, - 0x380, 0x380, 0x380, 0x3C0, 0x3C0, 0x3C0, 0x3C0, 0x7C0, - 0x3C0, 0x7C0, 0x7E0, 0x7E0, 0x7E0, 0x7F0, 0x7F8, 0x7FC - }, - new short[] { - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, - 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF - }, - new short[] { - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000 - }, - new short[] { - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x003, 0x000, 0x000, 0x00E, 0x07F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x03F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x03F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x06F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x077, - 0x000, 0x000, 0x000, 0x0FB, 0x000, 0x0FD, 0x1FE, 0x1FF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x03F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x03F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x02F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x077, - 0x000, 0x000, 0x000, 0x0FB, 0x000, 0x0FD, 0x0FE, 0x2FF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x037, - 0x000, 0x000, 0x000, 0x07B, 0x000, 0x07D, 0x17E, 0x37F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x017, - 0x000, 0x000, 0x000, 0x0BB, 0x000, 0x3BD, 0x3BE, 0x3BF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x107, - 0x000, 0x000, 0x000, 0x3DB, 0x000, 0x3DD, 0x3DE, 0x3DF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3C3, - 0x000, 0x000, 0x000, 0x3E1, 0x000, 0x3E8, 0x3EC, 0x3EF, - 0x000, 0x000, 0x000, 0x3F0, 0x300, 0x3F0, 0x3F0, 0x3F7, - 0x380, 0x3F8, 0x3F8, 0x3FB, 0x3F8, 0x3FD, 0x3FE, 0x3FF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x03F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x003, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x037, - 0x000, 0x000, 0x000, 0x07B, 0x000, 0x0FD, 0x0FE, 0x4FF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x017, - 0x000, 0x000, 0x000, 0x03B, 0x000, 0x07D, 0x07E, 0x57F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x01B, 0x000, 0x4BD, 0x5BE, 0x5BF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x407, - 0x000, 0x000, 0x000, 0x503, 0x000, 0x5DD, 0x5DE, 0x5DF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x503, - 0x000, 0x000, 0x000, 0x5C0, 0x000, 0x5E0, 0x5EC, 0x5EF, - 0x000, 0x000, 0x400, 0x5E0, 0x400, 0x5F0, 0x5F0, 0x5F7, - 0x500, 0x5F0, 0x5F8, 0x5FB, 0x5F8, 0x5FD, 0x5FE, 0x5FF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x001, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x01B, 0x000, 0x43D, 0x47E, 0x67F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x00F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x407, - 0x000, 0x000, 0x000, 0x403, 0x000, 0x61D, 0x6BE, 0x6BF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x407, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x403, - 0x000, 0x000, 0x000, 0x601, 0x000, 0x680, 0x6DC, 0x6DF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x601, - 0x000, 0x000, 0x000, 0x680, 0x400, 0x6C0, 0x6E0, 0x6EF, - 0x000, 0x400, 0x400, 0x6C0, 0x600, 0x6E0, 0x6F0, 0x6F7, - 0x600, 0x6F0, 0x6F0, 0x6FB, 0x6F8, 0x6FD, 0x6FE, 0x6FF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x007, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x407, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x403, - 0x000, 0x000, 0x000, 0x603, 0x000, 0x600, 0x71E, 0x73F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x403, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x601, - 0x000, 0x000, 0x400, 0x700, 0x400, 0x700, 0x700, 0x75F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, 0x700, - 0x000, 0x400, 0x400, 0x700, 0x600, 0x700, 0x740, 0x76F, - 0x000, 0x400, 0x600, 0x700, 0x600, 0x740, 0x760, 0x777, - 0x700, 0x760, 0x770, 0x77B, 0x770, 0x77D, 0x77E, 0x77F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x601, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, 0x400, 0x700, - 0x000, 0x400, 0x400, 0x700, 0x600, 0x780, 0x780, 0x79F, - 0x000, 0x000, 0x000, 0x400, 0x000, 0x400, 0x400, 0x700, - 0x000, 0x400, 0x600, 0x780, 0x600, 0x780, 0x780, 0x7AF, - 0x000, 0x600, 0x600, 0x780, 0x700, 0x780, 0x780, 0x7B7, - 0x700, 0x780, 0x7A0, 0x7BB, 0x7B0, 0x7BD, 0x7BE, 0x7BF, - 0x000, 0x000, 0x000, 0x400, 0x000, 0x600, 0x600, 0x700, - 0x400, 0x600, 0x600, 0x780, 0x700, 0x780, 0x7C0, 0x7CF, - 0x400, 0x600, 0x700, 0x780, 0x700, 0x7C0, 0x7C0, 0x7D7, - 0x700, 0x7C0, 0x7C0, 0x7DB, 0x7C0, 0x7DD, 0x7DE, 0x7DF, - 0x400, 0x700, 0x700, 0x7C0, 0x700, 0x7C0, 0x7C0, 0x7E7, - 0x780, 0x7C0, 0x7E0, 0x7EB, 0x7E0, 0x7ED, 0x7EE, 0x7EF, - 0x780, 0x7E0, 0x7E0, 0x7F3, 0x7E0, 0x7F5, 0x7F6, 0x7F7, - 0x7F0, 0x7F8, 0x7FA, 0x7FB, 0x7FC, 0x7FD, 0x7FE, 0x7FF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x807, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x803, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x801, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x83F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x803, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x801, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x81F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, - 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x81F, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x837, - 0x800, 0x800, 0x800, 0x87B, 0x800, 0x8FD, 0x8FE, 0x8FF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x801, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, - 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x81F, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x81F, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x817, - 0x800, 0x800, 0x800, 0x83B, 0x800, 0x87D, 0x87E, 0x97F, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0x81B, 0x800, 0x9BD, 0x9BE, 0x9BF, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0x903, 0x800, 0x9DC, 0x9DE, 0x9DF, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x903, - 0x800, 0x800, 0x800, 0x9C0, 0x800, 0x9E0, 0x9E8, 0x9EF, - 0x800, 0x800, 0x800, 0x9E0, 0x800, 0x9F0, 0x9F0, 0x9F7, - 0x900, 0x9F0, 0x9F8, 0x9FB, 0x9F8, 0x9FD, 0x9FE, 0x9FF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, - 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x801, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x81F, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0x81B, 0x800, 0x83D, 0xA7E, 0xA7F, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0xA03, 0x800, 0xA1D, 0xABE, 0xABF, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xA03, - 0x800, 0x800, 0x800, 0xA01, 0x800, 0xA80, 0xADC, 0xADF, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xA01, - 0x800, 0x800, 0x800, 0xA80, 0x800, 0xAC0, 0xAE0, 0xAEF, - 0x800, 0x800, 0xA00, 0xAC0, 0xA00, 0xAE0, 0xAF0, 0xAF7, - 0xA00, 0xAF0, 0xAF0, 0xAFB, 0xAF8, 0xAFD, 0xAFE, 0xAFF, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xA03, - 0x800, 0x800, 0x800, 0xA01, 0x800, 0xB00, 0xB1C, 0xB3F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xA03, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xA01, - 0x800, 0x800, 0x800, 0xB00, 0x800, 0xB00, 0xB00, 0xB5F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xB00, - 0x800, 0x800, 0x800, 0xB00, 0xA00, 0xB00, 0xB40, 0xB6F, - 0x800, 0xA00, 0xA00, 0xB00, 0xA00, 0xB40, 0xB60, 0xB77, - 0xB00, 0xB60, 0xB70, 0xB7B, 0xB70, 0xB7D, 0xB7E, 0xB7F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xA01, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xB00, - 0x800, 0x800, 0x800, 0xB00, 0xA00, 0xB80, 0xB80, 0xB9F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xA00, 0xB00, - 0x800, 0xA00, 0xA00, 0xB80, 0xA00, 0xB80, 0xB80, 0xBAF, - 0x800, 0xA00, 0xA00, 0xB80, 0xB00, 0xB80, 0xB80, 0xBB7, - 0xB00, 0xB80, 0xBA0, 0xBBB, 0xBB0, 0xBBD, 0xBBE, 0xBBF, - 0x800, 0x800, 0x800, 0xA00, 0x800, 0xA00, 0xA00, 0xB00, - 0x800, 0xA00, 0xA00, 0xB80, 0xB00, 0xB80, 0xBC0, 0xBCF, - 0x800, 0xA00, 0xB00, 0xB80, 0xB00, 0xBC0, 0xBC0, 0xBD7, - 0xB00, 0xBC0, 0xBC0, 0xBDB, 0xBC0, 0xBDD, 0xBDE, 0xBDF, - 0xA00, 0xB00, 0xB00, 0xBC0, 0xB00, 0xBC0, 0xBC0, 0xBE7, - 0xB80, 0xBC0, 0xBE0, 0xBEB, 0xBE0, 0xBED, 0xBEE, 0xBEF, - 0xB80, 0xBE0, 0xBE0, 0xBF3, 0xBE0, 0xBF5, 0xBF6, 0xBF7, - 0xBF0, 0xBF8, 0xBFA, 0xBFB, 0xBFC, 0xBFD, 0xBFE, 0xBFF, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x80F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC07, - 0x800, 0x800, 0x800, 0xC0B, 0x800, 0xC1D, 0xC3E, 0xC7F, - 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x807, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC07, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC03, - 0x800, 0x800, 0x800, 0xC03, 0x800, 0xC00, 0xC1E, 0xCBF, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC03, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC01, - 0x800, 0xC00, 0xC00, 0xC00, 0xC00, 0xC00, 0xC00, 0xCDF, - 0x800, 0x800, 0x800, 0x800, 0x800, 0xC00, 0xC00, 0xC00, - 0x800, 0xC00, 0xC00, 0xC00, 0xC00, 0xC80, 0xCC0, 0xCEF, - 0x800, 0xC00, 0xC00, 0xC80, 0xC00, 0xCC0, 0xCE0, 0xCF7, - 0xC00, 0xCE0, 0xCF0, 0xCFB, 0xCF0, 0xCFD, 0xCFE, 0xCFF, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC07, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC03, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC03, - 0x800, 0x800, 0xC00, 0xC01, 0xC00, 0xC00, 0xC00, 0xD3F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC00, 0xC03, - 0x800, 0x800, 0x800, 0x800, 0x800, 0xC00, 0xC00, 0xC01, - 0x800, 0xC00, 0xC00, 0xC00, 0xC00, 0xD00, 0xD00, 0xD5F, - 0x800, 0x800, 0x800, 0xC00, 0x800, 0xC00, 0xC00, 0xC00, - 0x800, 0xC00, 0xC00, 0xD00, 0xC00, 0xD00, 0xD00, 0xD6F, - 0xC00, 0xC00, 0xC00, 0xD00, 0xC00, 0xD00, 0xD40, 0xD77, - 0xC00, 0xD40, 0xD60, 0xD7B, 0xD70, 0xD7D, 0xD7E, 0xD7F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0xC00, 0x800, 0xC00, 0xC00, 0xC01, - 0x800, 0x800, 0x800, 0xC00, 0x800, 0xC00, 0xC00, 0xC00, - 0x800, 0xC00, 0xC00, 0xD00, 0xC00, 0xD00, 0xD00, 0xD9F, - 0x800, 0x800, 0x800, 0xC00, 0x800, 0xC00, 0xC00, 0xD00, - 0xC00, 0xC00, 0xC00, 0xD00, 0xC00, 0xD80, 0xD80, 0xDAF, - 0xC00, 0xC00, 0xC00, 0xD80, 0xC00, 0xD80, 0xD80, 0xDB7, - 0xD00, 0xD80, 0xD80, 0xDBB, 0xDA0, 0xDBD, 0xDBE, 0xDBF, - 0x800, 0x800, 0xC00, 0xC00, 0xC00, 0xC00, 0xC00, 0xD00, - 0xC00, 0xC00, 0xC00, 0xD00, 0xC00, 0xD80, 0xD80, 0xDCF, - 0xC00, 0xC00, 0xC00, 0xD80, 0xD00, 0xD80, 0xDC0, 0xDD7, - 0xD00, 0xDC0, 0xDC0, 0xDDB, 0xDC0, 0xDDD, 0xDDE, 0xDDF, - 0xC00, 0xD00, 0xD00, 0xD80, 0xD00, 0xDC0, 0xDC0, 0xDE7, - 0xD00, 0xDC0, 0xDC0, 0xDEB, 0xDE0, 0xDED, 0xDEE, 0xDEF, - 0xD80, 0xDC0, 0xDE0, 0xDF3, 0xDE0, 0xDF5, 0xDF6, 0xDF7, - 0xDE0, 0xDF8, 0xDFA, 0xDFB, 0xDFC, 0xDFD, 0xDFE, 0xDFF, - 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC07, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC03, - 0x800, 0x800, 0x800, 0x800, 0x800, 0xC00, 0xC00, 0xE01, - 0x800, 0xC00, 0xC00, 0xE00, 0xC00, 0xE00, 0xE00, 0xE3F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, - 0x800, 0x800, 0x800, 0x800, 0x800, 0xC00, 0xC00, 0xE01, - 0x800, 0x800, 0x800, 0xC00, 0x800, 0xC00, 0xC00, 0xE00, - 0x800, 0xC00, 0xC00, 0xE00, 0xC00, 0xE00, 0xE00, 0xE5F, - 0x800, 0x800, 0x800, 0xC00, 0x800, 0xC00, 0xC00, 0xE00, - 0xC00, 0xC00, 0xC00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE6F, - 0xC00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE77, - 0xE00, 0xE00, 0xE40, 0xE7B, 0xE60, 0xE7D, 0xE7E, 0xE7F, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC00, - 0x800, 0x800, 0x800, 0xC00, 0x800, 0xC00, 0xC00, 0xE00, - 0x800, 0x800, 0x800, 0xC00, 0x800, 0xC00, 0xC00, 0xE00, - 0xC00, 0xC00, 0xC00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE9F, - 0x800, 0x800, 0xC00, 0xC00, 0xC00, 0xC00, 0xE00, 0xE00, - 0xC00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE80, 0xEAF, - 0xC00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE80, 0xE80, 0xEB7, - 0xE00, 0xE80, 0xE80, 0xEBB, 0xE80, 0xEBD, 0xEBE, 0xEBF, - 0x800, 0xC00, 0xC00, 0xE00, 0xC00, 0xE00, 0xE00, 0xE00, - 0xC00, 0xE00, 0xE00, 0xE00, 0xE00, 0xE80, 0xE80, 0xECF, - 0xC00, 0xE00, 0xE00, 0xE80, 0xE00, 0xE80, 0xE80, 0xED7, - 0xE00, 0xE80, 0xEC0, 0xEDB, 0xEC0, 0xEDD, 0xEDE, 0xEDF, - 0xE00, 0xE00, 0xE00, 0xE80, 0xE00, 0xE80, 0xEC0, 0xEE7, - 0xE00, 0xEC0, 0xEC0, 0xEEB, 0xEC0, 0xEED, 0xEEE, 0xEEF, - 0xE80, 0xEC0, 0xEC0, 0xEF3, 0xEE0, 0xEF4, 0xEF6, 0xEF7, - 0xEE0, 0xEF8, 0xEF8, 0xEFB, 0xEFC, 0xEFD, 0xEFE, 0xEFF, - 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xC00, - 0x800, 0x800, 0x800, 0xC00, 0x800, 0xC00, 0xC00, 0xE00, - 0x800, 0x800, 0xC00, 0xC00, 0xC00, 0xC00, 0xC00, 0xE00, - 0xC00, 0xE00, 0xE00, 0xF00, 0xE00, 0xF00, 0xF00, 0xF1F, - 0x800, 0xC00, 0xC00, 0xC00, 0xC00, 0xE00, 0xE00, 0xF00, - 0xC00, 0xE00, 0xE00, 0xF00, 0xE00, 0xF00, 0xF00, 0xF2F, - 0xC00, 0xE00, 0xE00, 0xF00, 0xE00, 0xF00, 0xF00, 0xF37, - 0xF00, 0xF00, 0xF00, 0xF3B, 0xF00, 0xF3D, 0xF3E, 0xF3F, - 0x800, 0xC00, 0xC00, 0xE00, 0xC00, 0xE00, 0xE00, 0xF00, - 0xC00, 0xE00, 0xE00, 0xF00, 0xE00, 0xF00, 0xF00, 0xF4F, - 0xE00, 0xE00, 0xE00, 0xF00, 0xF00, 0xF00, 0xF00, 0xF57, - 0xF00, 0xF00, 0xF00, 0xF5B, 0xF40, 0xF5D, 0xF5E, 0xF5F, - 0xE00, 0xF00, 0xF00, 0xF00, 0xF00, 0xF00, 0xF00, 0xF67, - 0xF00, 0xF00, 0xF40, 0xF6B, 0xF40, 0xF6D, 0xF6E, 0xF6F, - 0xF00, 0xF40, 0xF40, 0xF71, 0xF40, 0xF74, 0xF74, 0xF77, - 0xF60, 0xF78, 0xF78, 0xF7B, 0xF7C, 0xF7D, 0xF7E, 0xF7F, - 0xC00, 0xC00, 0xC00, 0xE00, 0xC00, 0xE00, 0xE00, 0xF00, - 0xE00, 0xE00, 0xE00, 0xF00, 0xF00, 0xF80, 0xF80, 0xF8F, - 0xE00, 0xE00, 0xF00, 0xF80, 0xF00, 0xF80, 0xF80, 0xF97, - 0xF00, 0xF80, 0xF80, 0xF9B, 0xF80, 0xF9D, 0xF9E, 0xF9F, - 0xE00, 0xF00, 0xF00, 0xF80, 0xF00, 0xF80, 0xF80, 0xFA7, - 0xF00, 0xF80, 0xF80, 0xFA9, 0xF80, 0xFAC, 0xFAC, 0xFAF, - 0xF80, 0xF80, 0xF80, 0xFB0, 0xF80, 0xFB0, 0xFB4, 0xFB7, - 0xF80, 0xFB8, 0xFB8, 0xFBB, 0xFBC, 0xFBD, 0xFBE, 0xFBF, - 0xE00, 0xF00, 0xF00, 0xF80, 0xF00, 0xF80, 0xF80, 0xFC1, - 0xF00, 0xF80, 0xFC0, 0xFC0, 0xFC0, 0xFC0, 0xFC8, 0xFCF, - 0xF80, 0xFC0, 0xFC0, 0xFD0, 0xFC0, 0xFD0, 0xFD0, 0xFD7, - 0xFC0, 0xFD0, 0xFD8, 0xFDB, 0xFD8, 0xFDD, 0xFDE, 0xFDF, - 0xF80, 0xFC0, 0xFC0, 0xFE0, 0xFC0, 0xFE0, 0xFE0, 0xFE7, - 0xFC0, 0xFE0, 0xFE8, 0xFEB, 0xFE8, 0xFED, 0xFEE, 0xFEF, - 0xFE0, 0xFF0, 0xFF0, 0xFF3, 0xFF0, 0xFF5, 0xFF6, 0xFF7, - 0xFF8, 0xFF9, 0xFFA, 0xFFB, 0xFFC, 0xFFD, 0xFFE, 0xFFF - }, - new short[] { - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x018, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x780, - 0x000, 0x000, 0x000, 0x7C0, 0x380, 0x7E0, 0x7F0, 0x7FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x018, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0FC, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x07C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x01C, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x008, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, - 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x780, - 0x000, 0x000, 0x000, 0x7C0, 0x380, 0x7E0, 0x7F0, 0x7FC - } - }; - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/SidWaveformGenerator.cs b/BizHawk.Emulation/Computers/Commodore64/SidWaveformGenerator.cs deleted file mode 100644 index 60f415a177..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/SidWaveformGenerator.cs +++ /dev/null @@ -1,255 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - - // constants for the WaveformGenerator and calculation - // methods come from the libsidplayfp residfp library. - - public partial class WaveformGenerator - { - // internal - private byte control; - private int freq; - private int pw; - - public int accumulator; - public int floatingOutputTtl; - public bool msbRising; - public int noiseOutput; - public int pulseOutput; - public int ringMsbMask; - public int shiftRegister; - public int shiftRegisterDelay; - public int shiftRegisterResetDelay; - public bool sync; - public bool test; - private short[] wave; - public int waveform; - public int waveformOutput; - - // these are temp values used to speed up calculation - private int noNoise; - private int noNoiseOrNoiseOutput; - private int noPulse; - - public WaveformGenerator() - { - Reset(); - } - - public void Clock() - { - if (test) - { - pulseOutput = 0xFFF; - if (shiftRegisterResetDelay != 0 && --shiftRegisterResetDelay == 0) - { - ResetShiftRegister(); - } - } - else - { - int accumulatorNext = (accumulator + freq) & 0xFFFFFF; - int accumulatorBitsSet = ~accumulator & accumulatorNext; - - accumulator = accumulatorNext; - msbRising = (accumulatorBitsSet & 0x800000) != 0; - - if ((accumulatorBitsSet & 0x080000) != 0) - { - shiftRegisterDelay = 2; - } - else if (shiftRegisterDelay != 0 && --shiftRegisterDelay == 0) - { - ClockShiftRegister(); - } - } - } - - private void ClockShiftRegister() - { - int bit0 = ((shiftRegister >> 22) ^ (shiftRegister >> 17)) & 0x1; - shiftRegister = ((shiftRegister << 1) | bit0) & 0x7FFFFF; - UpdateNoiseOutput(); - } - - public byte Control - { - get - { - return control; - } - set - { - control = value; - - int waveformPrev = waveform; - bool testPrev = test; - waveform = (control >> 4) & 0x0F; - test = (control & 0x08) != 0; - sync = (control & 0x02) != 0; - - wave = WaveformSamples[waveform & 0x7]; - ringMsbMask = ((~control >> 5) & (control >> 2) & 0x1) << 23; - noNoise = (waveform & 0x8) != 0 ? 0x000 : 0xFFF; - noNoiseOrNoiseOutput = noNoise | noiseOutput; - noPulse = (waveform & 0x4) != 0 ? 0x000 : 0xFFF; - - if (!testPrev && test) - { - accumulator = 0; - shiftRegisterDelay = 0; - shiftRegisterResetDelay = 0x8000; - } - else if (testPrev && !test) - { - int bit0 = (~shiftRegister >> 17) & 0x1; - shiftRegister = ((shiftRegister << 1) | bit0) & 0x7FFFFF; - UpdateNoiseOutput(); - } - - if (waveform == 0 && waveformPrev != 0) - { - floatingOutputTtl = 0x28000; - } - } - } - - - public int Frequency - { - get - { - return freq; - } - set - { - freq = value; - } - } - - public short Output(WaveformGenerator ringModulator) - { - if (waveform != 0) - { - int ix = (accumulator ^ (ringModulator.accumulator & ringMsbMask)) >> 12; - waveformOutput = wave[ix] & (noPulse | pulseOutput) & noNoiseOrNoiseOutput; - if (waveform > 0x8) - { - WriteShiftRegister(); - } - } - else - { - if (floatingOutputTtl != 0 && --floatingOutputTtl == 0) - { - waveformOutput = 0; - } - } - pulseOutput = ((accumulator >> 12) >= pw) ? 0xFFF : 0x000; - return (short)waveformOutput; - } - - public int PulseWidth - { - get - { - return pw; - } - set - { - pw = value; - } - } - - public void Reset() - { - control = 0; - waveform = 0; - freq = 0; - pw = 0; - accumulator = 0; - test = false; - sync = false; - - msbRising = false; - wave = WaveformSamples[0]; - ringMsbMask = 0; - - noNoise = 0xFFF; - noPulse = 0xFFF; - pulseOutput = 0xFFF; - - ResetShiftRegister(); - - shiftRegisterDelay = 0; - waveformOutput = 0; - floatingOutputTtl = 0; - } - - private void ResetShiftRegister() - { - shiftRegister = 0x7FFFFF; - shiftRegisterResetDelay = 0; - UpdateNoiseOutput(); - } - - public void SetState(byte stateControl, int stateFreq, int statePulseWidth) - { - pw = statePulseWidth; - freq = stateFreq; - control = stateControl; - noNoise = (waveform & 0x8) != 0 ? 0x000 : 0xFFF; - noNoiseOrNoiseOutput = noNoise | noiseOutput; - noPulse = (waveform & 0x4) != 0 ? 0x000 : 0xFFF; - ringMsbMask = ((~control >> 5) & (control >> 2) & 0x1) << 23; - waveform = (control >> 4) & 0x0F; - test = (control & 0x08) != 0; - sync = (control & 0x02) != 0; - wave = WaveformSamples[waveform & 0x7]; - } - - public void Synchronize(WaveformGenerator syncDest, WaveformGenerator syncSource) - { - if (msbRising && syncDest.sync && !(sync && syncSource.msbRising)) - { - syncDest.accumulator = 0; - } - } - - private void UpdateNoiseOutput() - { - noiseOutput = - ((shiftRegister & 0x100000) >> 9) | - ((shiftRegister & 0x040000) >> 8) | - ((shiftRegister & 0x004000) >> 5) | - ((shiftRegister & 0x000800) >> 3) | - ((shiftRegister & 0x000200) >> 2) | - ((shiftRegister & 0x000020) << 1) | - ((shiftRegister & 0x000004) << 3) | - ((shiftRegister & 0x000001) << 4); - noNoiseOrNoiseOutput = noNoise | noiseOutput; - } - - private void WriteShiftRegister() - { - shiftRegister &= - ~((1 << 20) | (1 << 18) | (1 << 14) | (1 << 11) | - (1 << 9) | (1 << 5) | (1 << 2) | (1 << 0)) | - ((waveformOutput & 0x800) << 9) | - ((waveformOutput & 0x400) << 8) | - ((waveformOutput & 0x200) << 5) | - ((waveformOutput & 0x100) << 3) | - ((waveformOutput & 0x080) << 2) | - ((waveformOutput & 0x040) >> 1) | - ((waveformOutput & 0x020) >> 3) | - ((waveformOutput & 0x010) >> 4); - noiseOutput &= waveformOutput; - noNoiseOrNoiseOutput = noNoise | noiseOutput; - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/Timing.cs b/BizHawk.Emulation/Computers/Commodore64/Timing.cs deleted file mode 100644 index 9d56e06b0e..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/Timing.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public class Timing - { - public int crystalFreq; - public uint timer; - - public Timing(Region timingRegion) - { - switch (timingRegion) - { - case Region.NTSC: - crystalFreq = 14318181; - break; - case Region.PAL: - crystalFreq = 17734472; - break; - } - } - - public void Advance() - { - // need an unchecked block here since the timer will wrap - unchecked - { - timer++; - } - } - - public bool IsCycle(int divisor) - { - return (timer % divisor) == 0; - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/Via.cs b/BizHawk.Emulation/Computers/Commodore64/Via.cs deleted file mode 100644 index 98bf66cf8d..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/Via.cs +++ /dev/null @@ -1,420 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - // MOS Technologies VIA 6522 - // register count: 16 - // IO port count: 2 - - public class ViaRegs - { - public int[] CACONTROL = new int[2]; - public int[] CBCONTROL = new int[2]; - public bool[] EICA = new bool[2]; - public bool[] EICB = new bool[2]; - public bool EISR; - public bool[] EIT = new bool[2]; - public bool[] ICA = new bool[2]; - public bool[] ICB = new bool[2]; - public bool IRQ; - public bool ISR; - public bool[] IT = new bool[2]; - public bool PALE; - public bool PBLE; - public int SR; - public int SRCONTROL; - public int[] TC = new int[2]; - public int[] TCONTROL = new int[2]; - public int[] TL = new int[2]; - - private DataPortConnector[] connectors; - - public ViaRegs() - { - // power on state - connectors = new DataPortConnector[2]; - connectors[0] = new DataPortConnector(); - connectors[1] = new DataPortConnector(); - } - - public byte this[int addr] - { - get - { - int result = 0xFF; - - addr &= 0xF; - switch (addr) - { - case 0x0: // port B data - result = connectors[1].Data; - break; - case 0x1: // port A data - case 0xF: // port A data without handshake - result = connectors[0].Data; - break; - case 0x2: // port B direction - result = connectors[1].Direction; - break; - case 0x3: // port A direction - result = connectors[0].Direction; - break; - case 0x4: // timer 0 lo - result = TC[0] & 0xFF; - break; - case 0x5: // timer 0 hi - result = (TC[0] & 0xFF00) >> 8; - break; - case 0x6: // timer 0 latch lo - result = TL[0] & 0xFF; - break; - case 0x7: // timer 0 latch hi - result = (TL[0] & 0xFF00) >> 8; - break; - case 0x8: // timer 1 lo - result = TC[1] & 0xFF; - break; - case 0x9: // timer 1 hi - result = (TC[1] & 0xFF00) >> 8; - break; - case 0xA: // shift register - result = SR; - break; - case 0xB: // peripheral control register - result = (CACONTROL[0] & 0x01); - result |= (CACONTROL[1] & 0x07) << 1; - result |= (CBCONTROL[0] & 0x01) << 4; - result |= (CBCONTROL[1] & 0x07) << 5; - break; - case 0xC: // auxilary control register - result = (PALE) ? 0x01 : 0x00; - result |= (PBLE) ? 0x02 : 0x00; - result |= (SRCONTROL & 0x7) << 2; - result |= (TCONTROL[0] & 0x1) << 5; - result |= (TCONTROL[1] & 0x3) << 6; - break; - case 0xD: // interrupt status register - result = ICA[1] ? 0x01 : 0x00; - result |= ICA[0] ? 0x02 : 0x00; - result |= ISR ? 0x04 : 0x00; - result |= ICB[1] ? 0x08 : 0x00; - result |= ICB[0] ? 0x10 : 0x00; - result |= IT[1] ? 0x20 : 0x00; - result |= IT[0] ? 0x40 : 0x00; - result |= IRQ ? 0x80 : 0x00; - break; - case 0xE: // interrupt control register - result = EICA[1] ? 0x01 : 0x00; - result |= EICA[0] ? 0x02 : 0x00; - result |= EISR ? 0x04 : 0x00; - result |= EICB[1] ? 0x08 : 0x00; - result |= EICB[0] ? 0x10 : 0x00; - result |= EIT[1] ? 0x20 : 0x00; - result |= EIT[0] ? 0x40 : 0x00; - result |= 0x80; // TODO: check if this is needed - break; - } - - return (byte)result; - } - set - { - byte val = value; - addr &= 0xF; - - switch (addr) - { - case 0x0: // port B data - connectors[1].Data = val; - break; - case 0x1: // port A data - case 0xF: // port A data without handshake - connectors[0].Data = val; - break; - case 0x2: // port B direction - connectors[1].Direction = val; - break; - case 0x3: // port A direction - connectors[0].Direction = val; - break; - case 0x4: // timer 0 lo - TC[0] &= 0xFF00; - TC[0] |= val; - break; - case 0x5: // timer 0 hi - TC[0] &= 0x00FF; - TC[0] |= (int)val << 8; - break; - case 0x6: // timer 0 latch lo - TL[0] &= 0xFF00; - TL[0] |= val; - break; - case 0x7: // timer 0 latch hi - TL[0] &= 0x00FF; - TL[0] |= (int)val << 8; - break; - case 0x8: // timer 1 lo - TC[1] &= 0xFF00; - TC[1] |= val; - break; - case 0x9: // timer 1 hi - TC[1] &= 0x00FF; - TC[1] |= (int)val << 8; - break; - case 0xA: // shift register - SR = val; - break; - case 0xB: // peripheral control register - CACONTROL[0] = (val & 0x1); - CACONTROL[1] = ((val >> 1) & 0x7); - CBCONTROL[0] = ((val >> 4) & 0x1); - CBCONTROL[1] = ((val >> 5) & 0x7); - break; - case 0xC: // auxilary control register - PALE = ((val & 0x01) != 0); - PBLE = ((val & 0x02) != 0); - SRCONTROL = (val >> 2) & 0x7; - TCONTROL[0] = (val >> 5) & 0x1; - TCONTROL[1] = (val >> 6) & 0x3; - break; - case 0xD: // interrupt status register - ICA[1] = ((val & 0x01) != 0); - ICA[0] = ((val & 0x02) != 0); - ISR = ((val & 0x04) != 0); - ICB[1] = ((val & 0x08) != 0); - ICB[0] = ((val & 0x10) != 0); - IT[1] = ((val & 0x20) != 0); - IT[0] = ((val & 0x40) != 0); - IRQ = ((val & 0x80) != 0); - break; - case 0xE: // interrupt control register - EICA[1] = ((val & 0x01) != 0); - EICA[0] = ((val & 0x02) != 0); - EISR = ((val & 0x04) != 0); - EICB[1] = ((val & 0x08) != 0); - EICB[0] = ((val & 0x10) != 0); - EIT[1] = ((val & 0x20) != 0); - EIT[0] = ((val & 0x40) != 0); - break; - } - } - } - - public void Connect(DataPortConnector connector, int index) - { - connectors[index] = connector; - } - - public bool PB6 - { - get - { - return ((connectors[1].Latch & 0x40) != 0); - } - set - { - connectors[1].Data = (byte)((connectors[1].Latch & 0xBF) | (value ? 0x40 : 0x00)); - } - } - - public bool PB7 - { - get - { - return ((connectors[1].Latch & 0x80) != 0); - } - set - { - connectors[1].Data = (byte)((connectors[1].Latch & 0x7F) | (value ? 0x80 : 0x00)); - } - } - } - - // 0x0: port B - // 0x1: port A - // 0x2: port B data direction - // 0x3: port A data direction - // 0x4: timer lo - // 0x5: timer hi - // 0x6: timer latch lo - // 0x7: timer latch hi - // 0x8: unused - // 0x9: unused - // 0xA: unused - // 0xB: timer control - // 0xC: auxilary control - // 0xD: interrupt status - // 0xE: interrupt control - // 0xF: unused - - public class Via - { - private ViaRegs regs; - - public Via() - { - HardReset(); - } - - public void Connect(DataPortConnector connector) - { - regs.Connect(connector, 1); - } - - public void HardReset() - { - regs = new ViaRegs(); - } - - public bool IRQ - { - get - { - return regs.IRQ; - } - } - - public byte Peek(int addr) - { - addr &= 0xF; - return regs[addr]; - } - - public void PerformCycle() - { - Tick0(); - Tick1(); - UpdateInterrupts(); - } - - public void Poke(int addr, byte val) - { - addr &= 0xF; - regs[addr] = val; - } - - public byte Read(ushort addr) - { - byte result; - - addr &= 0xF; - switch (addr) - { - case 0x4: - result = regs[0x4]; - regs.IT[0] = false; - break; - case 0x8: - result = (byte)(regs.TC[1] & 0xFF); - regs.IT[1] = false; - break; - case 0x9: - result = (byte)(regs.TC[1] >> 8); - regs.IT[1] = false; - break; - case 0xD: - // reading this clears it - result = regs[addr]; - regs[addr] = 0x00; - break; - default: - result = regs[addr]; - break; - } - - return result; - } - - private void Tick0() - { - bool underflow = false; - - switch (regs.TCONTROL[0] & 0x1) - { - case 0: - if (regs.TC[0] > 0) - { - if (--regs.TC[0] <= 0) - { - regs.IT[0] = true; - underflow = true; - } - } - break; - case 1: - if (--regs.TC[0] <= 0) - { - regs.IT[0] = true; - regs.TC[0] = regs.TL[0]; - underflow = true; - } - break; - } - - if (underflow) - { - if ((regs.TCONTROL[0] & 0x2) != 0) - { - regs.PB7 = !regs.PB7; - } - } - } - - private void Tick1() - { - switch (regs.TCONTROL[1]) - { - case 0: - break; - case 1: - break; - } - } - - private void UpdateInterrupts() - { - regs.IRQ = - (regs.ICA[0] & regs.EICA[0]) | - (regs.ICA[1] & regs.EICA[1]) | - (regs.ICB[0] & regs.EICB[0]) | - (regs.ICB[1] & regs.EICB[1]) | - (regs.IT[0] & regs.EIT[0]) | - (regs.IT[1] & regs.EIT[1]) | - (regs.ISR & regs.EISR); - } - - public void Write(ushort addr, byte val) - { - addr &= 0xF; - switch (addr) - { - case 0x4: // write low counter - regs[0x6] = val; - break; - case 0x5: // write high counter - regs[0x4] = regs[0x06]; - regs[0x5] = val; - regs[0x7] = val; - regs.IT[0] = false; - break; - case 0x7: - regs[0x7] = val; - regs.IT[0] = false; - break; - case 0x8: - regs.TL[1] = val; - break; - case 0x9: - regs.TC[1] = ((int)val << 8) | regs.TL[1]; - regs.IT[1] = false; - break; - default: - regs[addr] = val; - break; - } - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/VicII.cs b/BizHawk.Emulation/Computers/Commodore64/VicII.cs deleted file mode 100644 index 9bd7fb7e75..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/VicII.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class VicII : IVideoProvider - { - public Memory mem; - public Region region; - public ChipSignals signal; - - public VicII(ChipSignals newSignal, Region newRegion) - { - region = newRegion; - signal = newSignal; - InitPipeline(newRegion); - HardReset(); - } - - public int CyclesPerFrame - { - get - { - return pipelineLength * rasterLines; - } - } - - public double FramesPerSecond - { - get - { - switch (region) - { - case Region.NTSC: - return (14318181d / 14d) / (double)CyclesPerFrame; - case Region.PAL: - return (17734472d / 18d) / (double)CyclesPerFrame; - } - return 0; - } - } - - public void HardReset() - { - InitRegs(); - InitVideoBuffer(); - cycle = 0; - } - - public bool Interrupt - { - get - { - return IRQ; - } - } - - public void PerformCycle() - { - ExecutePipeline(); - UpdateInterrupts(); - signal.VicIRQ = IRQ; - } - - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/VicIIPipeline.cs b/BizHawk.Emulation/Computers/Commodore64/VicIIPipeline.cs deleted file mode 100644 index 1502cd8ee1..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/VicIIPipeline.cs +++ /dev/null @@ -1,670 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class VicII : IVideoProvider - { - private int baCount; - private int cycle; - private uint[][] pipeline; - private bool pipelineGAccess; - private int pipelineLength; - - private void ExecutePipeline() - { - pipelineGAccess = false; - advanceX = true; - baCount = 0; - - uint tableX = pipeline[0][cycle]; - uint tableFetch = pipeline[1][cycle]; - uint tableBA = pipeline[2][cycle]; - uint tableOps = pipeline[3][cycle]; - - #region Pipeline Cycle Init - { - - //rasterX = (int)tableX; - - if (cycle == 0) - { - if (!rasterInterruptTriggered && RASTER == rasterInterruptLine && RASTER > 0) - { - IRST = true; - rasterInterruptTriggered = true; - } - } - else if (cycle == 1) - { - if (!rasterInterruptTriggered && RASTER == 0 && rasterInterruptLine == 0) - { - IRST = true; - rasterInterruptTriggered = true; - } - } - - if (RASTER == 0x030) - displayEnabled = (displayEnabled | DEN); - - if (RASTER >= 0x030 && RASTER < 0x0F8) - badline = ((YSCROLL == (RASTER & 0x07)) && displayEnabled); - else - badline = false; - - if (badline) - idle = false; - - for (int i = 0; i < 8; i++) - if (!sprites[i].MxYE) - sprites[i].MxYEToggle = true; - } - #endregion - #region Pipeline Fetch - { - switch (tableFetch) - { - case 0x00: PipelineFetchSpriteP(0); break; - case 0x01: PipelineFetchSpriteP(1); break; - case 0x02: PipelineFetchSpriteP(2); break; - case 0x03: PipelineFetchSpriteP(3); break; - case 0x04: PipelineFetchSpriteP(4); break; - case 0x05: PipelineFetchSpriteP(5); break; - case 0x06: PipelineFetchSpriteP(6); break; - case 0x07: PipelineFetchSpriteP(7); break; - case 0x08: PipelineFetchSpriteS(0); break; - case 0x09: PipelineFetchSpriteS(1); break; - case 0x0A: PipelineFetchSpriteS(2); break; - case 0x0B: PipelineFetchSpriteS(3); break; - case 0x0C: PipelineFetchSpriteS(4); break; - case 0x0D: PipelineFetchSpriteS(5); break; - case 0x0E: PipelineFetchSpriteS(6); break; - case 0x0F: PipelineFetchSpriteS(7); break; - case 0x10: - mem.VicRead(ECM ? (ushort)0x39FF : (ushort)0x3FFF); - break; - case 0x11: - mem.VicRead((ushort)refreshAddress); - refreshAddress = (refreshAddress - 1) & 0xFF; - refreshAddress |= 0x3F00; - break; - case 0x12: - PipelineFetchC(); - break; - } - } - #endregion - #region BA - { - uint baSprite0 = tableBA & 0xF; - uint baSprite1 = (tableBA >> 4) & 0xF; - uint baSprite2 = (tableBA >> 8) & 0xF; - bool baFetch = ((tableBA >> 12) & 0x1) != 0; - - if ((baSprite0 < 8 && sprites[baSprite0].MDMA) || (baSprite1 < 8 && sprites[baSprite1].MDMA) || (baSprite2 < 8 && sprites[baSprite2].MDMA) || (baFetch && badline)) - baCount++; - } - #endregion - #region Operations - { - //if ((tableOps & OpChkBrdL0) != 0) - //{ - //} - //if ((tableOps & OpChkBrdL1) != 0) - //{ - //} - //if ((tableOps & OpChkBrdR0) != 0) - //{ - //} - //if ((tableOps & OpChkBrdR1) != 0) - //{ - //} - //if ((tableOps & OpChkSprCrunch) != 0) - //{ - //} - if ((tableOps & OpChkSprDisp) != 0) - { - for (int i = 0; i < 8; i++) - { - VicIISprite sprite = sprites[i]; - sprite.MC = sprite.MCBASE; - if (sprite.MDMA && sprite.MxY == (RASTER & 0xFF)) - { - sprite.MxXEToggle = false; - } - } - } - if ((tableOps & OpChkSprDma) != 0) - { - for (int i = 0; i < 8; i++) - { - VicIISprite sprite = sprites[i]; - sprite.MD = false; - if (sprite.MxE == true && sprite.MxY == (RASTER & 0xFF) && sprite.MDMA == false) - { - sprite.MDMA = true; - sprite.MCBASE = 0; - if (sprite.MxYE) - sprite.MxYEToggle = false; - } - sprite.MxXEToggle = false; - } - } - if ((tableOps & OpChkSprExp) != 0) - { - for (int i = 0; i < 8; i++) - if (sprites[i].MxYE) - sprites[i].MxYEToggle = !sprites[i].MxYEToggle; - } - if ((tableOps & OpUpdateMcBase) != 0) - { - for (int i = 0; i < 8; i++) - { - VicIISprite sprite = sprites[i]; - if (sprite.MxYEToggle) - { - sprite.MCBASE += 3; - if (sprite.MxYEToggle && sprite.MCBASE == 63) - { - sprite.MDMA = false; - } - } - } - } - if ((tableOps & OpUpdateRc) != 0) - { - if (RC == 7) - { - idle = true; - VCBASE = VC; - } - if (!idle) - { - RC = (RC + 1) & 0x7; - } - } - if ((tableOps & OpUpdateVc) != 0) - { - VC = VCBASE; - VMLI = 0; - bitmapColumn = 0; - if (badline) - { - RC = 0; - } - bitmapData = 0; - colorData = 0; - characterData = 0; - } - } - #endregion - #region Render - { - - for (int i = 0; i < 8; i++) - { - int pixel; - - if ((pipelineGAccess) && XSCROLL == i) - { - #region Fetch G - { - int gAddress; - bitmapColumn = 0; - - if (idle || VMLI >= 40 || !displayEnabled) - { - mem.VicRead(ECM ? (ushort)0x39FF : (ushort)0x3FFF); - characterData = 0; - colorData = 0; - } - else - { - characterData = characterDataBus; - colorData = colorDataBus; - } - switch (graphicsMode) - { - case 0: // 000 - case 1: // 001 - gAddress = (CB << 11) | (characterData << 3) | RC; - bitmapData = mem.VicRead((ushort)gAddress); - break; - case 2: // 010 - case 3: // 011 - gAddress = ((CB & 0x4) << 11) | (VC << 3) | RC; - bitmapData = mem.VicRead((ushort)gAddress); - break; - case 4: // 100 - case 5: // 101 - gAddress = (CB << 11) | ((characterData & 0x3F) << 3) | RC; - bitmapData = mem.VicRead((ushort)gAddress); - break; - case 6: // 110 - case 7: // 111 - gAddress = ((CB & 0x4) << 11) | ((VC & 0x33F) << 3) | RC; - bitmapData = mem.VicRead((ushort)gAddress); - break; - } - if (!idle) - { - VC++; - VMLI++; - } - } - #endregion - } - - if (rasterX == borderRight) - borderOnMain = true; - if (rasterX == borderLeft) - { - if (RASTER == borderBottom) - borderOnVertical = true; - if ((RASTER == borderTop) && DEN) - borderOnVertical = false; - if (!borderOnVertical) - borderOnMain = false; - } - - #region Plotter - switch (graphicsMode) - { - case 0x00: - if ((bitmapData & 0x80) != 0x00) - { - plotterData = 0x03; - plotterPixel = colorData; - } - else - { - plotterData = 0x00; - plotterPixel = BxC[0]; - } - bitmapData <<= 1; - break; - case 0x01: - if ((colorData & 0x08) != 0x00) - { - if ((bitmapColumn & 0x01) == 0x00) - { - plotterData = (bitmapData >> 6) & 0x03; - bitmapData <<= 2; - } - switch (plotterData) - { - case 0x00: - plotterPixel = BxC[0]; - break; - case 0x01: - plotterPixel = BxC[1]; - break; - case 0x02: - plotterPixel = BxC[2]; - break; - case 0x03: - plotterPixel = colorData & 0x7; - break; - } - } - else - { - if ((bitmapData & 0x80) != 0x00) - { - plotterData = 0x03; - plotterPixel = colorData; - } - else - { - plotterData = 0x00; - plotterPixel = BxC[0]; - } - bitmapData <<= 1; - } - break; - case 0x02: - if ((bitmapData & 0x80) != 0x00) - { - plotterData = 0x03; - plotterPixel = characterData >> 4; - } - else - { - plotterData = 0x00; - plotterPixel = characterData & 0xF; - } - bitmapData <<= 1; - break; - case 0x03: - if ((bitmapColumn & 0x01) == 0x00) - { - plotterData = (bitmapData >> 6) & 0x03; - bitmapData <<= 2; - } - switch (plotterData) - { - case 0x00: - plotterPixel = BxC[0]; - break; - case 0x01: - plotterPixel = characterData >> 4; - break; - case 0x02: - plotterPixel = characterData & 0xF; - break; - case 0x03: - plotterPixel = colorData & 0xF; - break; - } - break; - case 0x04: - if ((bitmapData & 0x80) != 0x00) - { - plotterData = 0x03; - plotterPixel = colorData; - } - else - { - plotterData = 0x00; - plotterPixel = BxC[characterData >> 6]; - } - bitmapData <<= 1; - break; - case 0x05: - if ((colorData & 0x08) != 0x00) - { - if ((bitmapColumn & 0x01) == 0x00) - { - plotterData = bitmapData >> 6; - plotterPixel = 0; - bitmapData <<= 2; - } - } - else - { - plotterData = bitmapData >> 7; - plotterPixel = 0; - bitmapData <<= 1; - } - break; - case 0x06: - if ((bitmapData & 0x80) != 0x00) - { - plotterData = 0x03; - plotterPixel = 0; - } - else - { - plotterData = 0x00; - plotterPixel = 0; - } - bitmapData <<= 1; - break; - case 0x07: - if ((bitmapColumn & 0x01) == 0x00) - { - plotterData = bitmapData >> 6; - bitmapData <<= 2; - } - plotterPixel = 0; - break; - } - #endregion - #region Sprites - { - int pixelOwner = -1; - int sData = 0; - int sPixel = 0; - - spriteData = 0; - spritePixel = 0; - spritePriority = false; - - for (int j = 0; j < 8; j++) - { - VicIISprite sprite = sprites[j]; - - if (sprite.MSR == 0) - { - sprite.MD = false; - } - else if ((!sprite.MD) && (sprite.MxX == rasterX)) - { - sprite.MD = true; - } - - if (sprite.MD) - { - if (sprite.MxMC) - { - sData = ((sprite.MSR >> 22) & 0x3); - if ((rasterX & 0x1) != (sprite.MxX & 0x1)) - { - if (!sprite.MxXE || sprite.MxXEToggle) - { - sprite.MSR <<= 2; - } - sprite.MxXEToggle = !sprite.MxXEToggle; - } - } - else - { - sData = ((sprite.MSR >> 22) & 0x2); - if (!sprite.MxXE || sprite.MxXEToggle) - { - sprite.MSR <<= 1; - } - sprite.MxXEToggle = !sprite.MxXEToggle; - } - - if (!borderOnVertical) - { - if (sData != 0) - { - if (pixelOwner >= 0) - { - sprite.MxM = true; - sprites[pixelOwner].MxM = true; - } - else - { - switch (sData) - { - case 1: - sPixel = MMx[0]; - break; - case 2: - sPixel = sprite.MxC; - break; - case 3: - sPixel = MMx[1]; - break; - } - - spritePriority = sprite.MxDP; - spritePixel = sPixel; - spriteData = sData; - pixelOwner = j; - } - if (plotterDataBuffer[plotterBufferIndex] >= 0x2) - { - sprite.MxD = true; - IMBC = true; - } - } - } - } - } - } - #endregion - #region Pixelbuffer Write - { - if (borderOnMain || borderOnVertical) - pixel = EC; - else - { - if ((spriteData == 0) || (spritePriority == true && plotterDataBuffer[plotterBufferIndex] >= 0x2)) - { - pixel = plotterPixelBuffer[plotterBufferIndex]; - } - else - { - pixel = spritePixel; - } - } - - // write pixel to buffer - videoBuffer[videoBufferIndex++] = palette[pixel & 0xF]; - if (videoBufferIndex == videoBufferSize) - videoBufferIndex = 0; - - plotterPixelBuffer[plotterBufferIndex] = plotterPixel; - plotterDataBuffer[plotterBufferIndex] = plotterData; - plotterBufferIndex++; - if (plotterBufferIndex == plotterDelay) - plotterBufferIndex = 0; - - bitmapColumn++; - if (advanceX) - { - rasterX++; - if (rasterX >= rasterWidth) - rasterX -= rasterWidth; - } - } - #endregion - } - } - #endregion - - cycle++; - if (cycle >= pipelineLength) - { - cycle = 0; - rasterInterruptTriggered = false; - RASTER++; - if (RASTER == rasterLines) - { - RASTER = 0; - VCBASE = 0; - displayEnabled = false; - rasterX = rasterLeft; - } - badline = false; - } - - signal.VicBA = (baCount > 0); - PipelineBA(signal.VicBA); - if (baCount > 0) - { - if (fetchCounter > 0) - fetchCounter--; - signal.VicAEC = (fetchCounter != 0); - } - else - { - fetchCounter = 0; - signal.VicAEC = true; - } - } - - private void InitPipeline(Region region) - { - switch (region) - { - case Region.NTSC: - plotterDelay = 12; - rasterLines = 263; - rasterLeft = 0x19C; - pipeline = cycleTabNTSC; - break; - case Region.PAL: - plotterDelay = 4; - rasterLines = 312; - rasterLeft = 0x194; - pipeline = cycleTabPAL; - break; - } - - pipelineLength = pipeline[0].Length; - } - - private void PipelineBA(bool val) - { - if (val) - { - if (signal.VicAEC == true && fetchCounter == 0) - fetchCounter = 4; - } - else - { - fetchCounter = 0; - } - } - - private void PipelineBorderCheck() - { - if ((RASTER == borderTop) && (DEN)) - borderOnVertical = false; - if (RASTER == borderBottom) - borderOnVertical = true; - } - - private void PipelineFetchC() - { - pipelineGAccess = true; - if (idle || VMLI >= 40) - { - characterDataBus = 0; - colorDataBus = 0; - } - else - { - if (badline) - { - int cAddress = (VM << 10) | VC; - characterDataBus = mem.VicRead((ushort)cAddress); - colorDataBus = mem.colorRam[VC]; - } - else - { - characterDataBus = characterMemory[VMLI]; - colorDataBus = colorMemory[VMLI]; - return; - } - colorMemory[VMLI] = colorDataBus; - characterMemory[VMLI] = characterDataBus; - } - } - - private void PipelineFetchSpriteP(int index) - { - VicIISprite spr = sprites[index]; - ushort pointerOffset = (ushort)((VM << 10) | 0x3F8 | index); - - spr.MPTR = mem.VicRead(pointerOffset); - - if (spr.MDMA) - { - spr.MSR = mem.VicRead((ushort)((spr.MPTR << 6) | (spr.MC))); - spr.MC++; - } - } - - private void PipelineFetchSpriteS(int index) - { - VicIISprite spr = sprites[index]; - if (spr.MDMA) - { - for (int i = 0; i < 2; i++) - { - spr.MSR <<= 8; - spr.MSR |= mem.VicRead((ushort)((spr.MPTR << 6) | (spr.MC))); - spr.MC++; - } - } - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/VicIIPipelineBuilder.cs b/BizHawk.Emulation/Computers/Commodore64/VicIIPipelineBuilder.cs deleted file mode 100644 index 82e3e5ff19..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/VicIIPipelineBuilder.cs +++ /dev/null @@ -1,165 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class VicII - { - private const uint OpNone = 0x000; - private const uint OpUpdateVc = 0x001; - private const uint OpChkSprCrunch = 0x002; - private const uint OpUpdateMcBase = 0x004; - private const uint OpChkBrdL1 = 0x008; - private const uint OpChkBrdL0 = 0x010; - private const uint OpChkBrdR0 = 0x020; - private const uint OpChkBrdR1 = 0x040; - private const uint OpChkSprDma = 0x080; - private const uint OpChkSprExp = 0x100; - private const uint OpUpdateRc = 0x200; - private const uint OpChkSprDisp = 0x400; - - private static uint[][] cycleTabNTSC = new uint[][] - { - new uint[] // x - { - 0x19C, 0x1A4, 0x1AC, 0x1B4, 0x1BC, - 0x1C4, 0x1CC, 0x1D4, 0x1DC, 0x1E4, - 0x1EC, 0x1F4, 0x1FC, 0x004, 0x00C, - 0x014, 0x01C, 0x024, 0x02C, 0x034, - 0x03C, 0x044, 0x04C, 0x054, 0x05C, - 0x064, 0x06C, 0x074, 0x07C, 0x084, - 0x08C, 0x094, 0x09C, 0x0A4, 0x0AC, - 0x0B4, 0x0BC, 0x0C4, 0x0CC, 0x0D4, - 0x0DC, 0x0E4, 0x0EC, 0x0F4, 0x0FC, - 0x104, 0x10C, 0x114, 0x11C, 0x124, - 0x12C, 0x134, 0x13C, 0x144, 0x14C, - 0x154, 0x15C, 0x164, 0x16C, 0x174, - 0x17C, 0x184, 0x184, 0x18C, 0x194 - }, - new uint[] // fetch (0-7=P 8-F=S 10=I 11=R 12=G/C) - { - 0x0B, 0x04, 0x0C, 0x05, 0x0D, - 0x06, 0x0E, 0x07, 0x0F, 0x10, - 0x11, 0x11, 0x11, 0x11, 0x11, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x10, 0x10, 0x10, 0x00, 0x08, - 0x01, 0x09, 0x02, 0x0A, 0x03 - }, - new uint[] // ba (flg/spr/spr/spr 8=none) - { - 0x0845, 0x0885, 0x0856, 0x0886, 0x0867, - 0x0887, 0x0887, 0x0888, 0x0888, 0x0888, - 0x0888, 0x0888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x0880, 0x0880, 0x0801, 0x0881, 0x0812, - 0x0882, 0x0823, 0x0883, 0x0834, 0x0884 - }, - new uint[] // operations - { - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpUpdateVc, OpChkSprCrunch, - OpUpdateMcBase,OpChkBrdL1, OpChkBrdL0, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpChkSprDma|OpChkBrdR0|OpChkSprExp, - OpChkSprDma|OpChkBrdR1, - OpUpdateRc, - OpChkSprDisp, - OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone - } - }; - - private static uint[][] cycleTabPAL = new uint[][] - { - new uint[] // x - { - 0x194, 0x19C, 0x1A4, 0x1AC, 0x1B4, - 0x1BC, 0x1C4, 0x1CC, 0x1D4, 0x1DC, - 0x1E4, 0x1EC, 0x1F4, 0x004, 0x00C, - 0x014, 0x01C, 0x024, 0x02C, 0x034, - 0x03C, 0x044, 0x04C, 0x054, 0x05C, - 0x064, 0x06C, 0x074, 0x07C, 0x084, - 0x08C, 0x094, 0x09C, 0x0A4, 0x0AC, - 0x0B4, 0x0BC, 0x0C4, 0x0CC, 0x0D4, - 0x0DC, 0x0E4, 0x0EC, 0x0F4, 0x0FC, - 0x104, 0x10C, 0x114, 0x11C, 0x124, - 0x12C, 0x134, 0x13C, 0x144, 0x14C, - 0x154, 0x15C, 0x164, 0x16C, 0x174, - 0x17C, 0x184, 0x18C - }, - new uint[] // fetch (0-7=P 8-F=S 10=I 11=R 12=G/C) - { - 0x03, 0x0B, 0x04, 0x0C, 0x05, - 0x0D, 0x06, 0x0E, 0x07, 0x0F, - 0x11, 0x11, 0x11, 0x11, 0x11, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x12, 0x12, 0x12, 0x12, 0x12, - 0x10, 0x10, 0x00, 0x08, 0x01, - 0x09, 0x02, 0x0A - }, - new uint[] // ba (flg/spr/spr/spr 8=none) - { - 0x0884, 0x0845, 0x0885, 0x0856, 0x0886, - 0x0867, 0x0887, 0x0887, 0x0888, 0x0888, - 0x0888, 0x0888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1888, - 0x1888, 0x1888, 0x1888, 0x1888, 0x1880, - 0x0880, 0x0801, 0x0881, 0x0812, 0x0882, - 0x0823, 0x0883, 0x0834 - }, - new uint[] // operations - { - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpUpdateVc, OpChkSprCrunch, - OpUpdateMcBase,OpChkBrdL1, OpChkBrdL0, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpNone, - OpNone, OpNone, OpNone, OpNone, OpChkSprDma, - OpChkSprDma|OpChkBrdR0|OpChkSprExp, - OpChkBrdR1, - OpUpdateRc|OpChkSprDisp, - OpNone, OpNone, OpNone, OpNone, OpNone - } - }; - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/VicIIRegs.cs b/BizHawk.Emulation/Computers/Commodore64/VicIIRegs.cs deleted file mode 100644 index 010a163f45..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/VicIIRegs.cs +++ /dev/null @@ -1,614 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class VicII : IVideoProvider - { - private class VicIISprite - { - // internal regs - public int MC; - public int MCBASE; - public bool MD; - public bool MDMA; - public int MPTR; - public int MSR; - public bool MxXEToggle; - public bool MxYEToggle; - - // external regs - public int MxC; // sprite color - public bool MxD; // sprite-data collision - public bool MxDP; // sprite priority - public bool MxE; // sprite enabled - public bool MxM; // sprite-sprite collision - public bool MxMC; // sprite multicolor - public int MxX; // sprite X coordinate - public bool MxXE; // sprite X expansion - public int MxY; // sprite Y coordinate - public bool MxYE; // sprite Y expansion - } - - // internal regs - private int RC; - private int VC; - private int VCBASE; - private int VMLI; - - // external regs - private bool BMM; // bitmap mode - private int[] BxC = new int[4]; // background colors - private int CB; // character bitmap offset - private bool CSEL; // column select - private bool DEN; // display enabled - private int EC; // border color - private bool ECM; // extra color mode - private bool ELP; // enable lightpen interrupt - private bool EMBC; // enable sprite-data interrupt - private bool EMMC; // enable sprite-sprite interrupt - private bool ERST; // enable raster line interrupt - private bool ILP; // light pen interrupt active - private bool IMBC; // sprite-data interrupt active - private bool IMMC; // sprite-sprite interrupt active - private bool IRQ; // interrupt was triggered - private bool IRST; // raster line interrupt active - private int LPX; // lightpen X coordinate - private int LPY; // lightpen Y coordinate - private bool MCM; // multicolor mode - private int[] MMx = new int[2]; // sprite extra color - private int RASTER; // current raster line - private bool RES; // reset bit (does nothing in this version of the VIC) - private bool RSEL; // row select - private int VM; // video memory offset - private int XSCROLL; // X scroll position - private int YSCROLL; // Y scroll position - - private int spriteData; - private int spritePixel; - private bool spritePriority; - private VicIISprite[] sprites; - - private bool advanceX; - private bool badline; - private int bitmapColumn; - private byte bitmapData; - private int borderBottom; - private int borderLeft; - private bool borderOnMain; - private bool borderOnVertical; - private int borderRight; - private int borderTop; - private bool centerEnabled; - private byte characterData; - private byte characterDataBus; - private byte[] characterMemory; - private byte colorData; - private byte colorDataBus; - private byte[] colorMemory; - private bool displayEnabled; - private int fetchCounter; - private int graphicsMode; - private bool idle; - private int plotterBufferIndex; - private int plotterData; - private int[] plotterDataBuffer; - private int plotterDelay; - private int plotterPixel; - private int[] plotterPixelBuffer; - private int rasterInterruptLine; - private bool rasterInterruptTriggered; - private int rasterLeft; - private int rasterLines; - private int rasterWidth; - private int rasterX; - private int refreshAddress; - - private void InitRegs() - { - // init sprites - sprites = new VicIISprite[8]; - for (int i = 0; i < 8; i++) - sprites[i] = new VicIISprite(); - - // init buffers - plotterDataBuffer = new int[plotterDelay]; - plotterPixelBuffer = new int[plotterDelay]; - characterMemory = new byte[40]; - colorMemory = new byte[40]; - - // init raster data - rasterX = rasterLeft; - rasterWidth = pipelineLength * 8; - - // reset regs - for (int i = 0; i < 0x40; i++) - this[i] = 0x00; - - // power on state - this[0x16] = 0xC0; - this[0x18] = 0x01; - this[0x19] = 0x71; - this[0x1A] = 0xF0; - RC = 7; - refreshAddress = 0x3FFF; - idle = true; - } - - private byte this[int addr] - { - get - { - int result = 0xFF; // value for any open bits - addr &= 0x3F; - - switch (addr) - { - case 0x00: - case 0x02: - case 0x04: - case 0x06: - case 0x08: - case 0x0A: - case 0x0C: - case 0x0E: - result = sprites[addr >> 1].MxX; - break; - case 0x01: - case 0x03: - case 0x05: - case 0x07: - case 0x09: - case 0x0B: - case 0x0D: - case 0x0F: - result = sprites[addr >> 1].MxY; - break; - case 0x10: - result = ((sprites[0].MxX & 0x100) != 0) ? 0x01 : 0x00; - result |= ((sprites[1].MxX & 0x100) != 0) ? 0x02 : 0x00; - result |= ((sprites[2].MxX & 0x100) != 0) ? 0x04 : 0x00; - result |= ((sprites[3].MxX & 0x100) != 0) ? 0x08 : 0x00; - result |= ((sprites[4].MxX & 0x100) != 0) ? 0x10 : 0x00; - result |= ((sprites[5].MxX & 0x100) != 0) ? 0x20 : 0x00; - result |= ((sprites[6].MxX & 0x100) != 0) ? 0x40 : 0x00; - result |= ((sprites[7].MxX & 0x100) != 0) ? 0x80 : 0x00; - break; - case 0x11: - result = YSCROLL & 0x07; - result |= (RSEL ? 0x08 : 0x00); - result |= (DEN ? 0x10 : 0x00); - result |= (BMM ? 0x20 : 0x00); - result |= (ECM ? 0x40 : 0x00); - result |= ((RASTER & 0x100) >> 1); - break; - case 0x12: - result = RASTER & 0xFF; - break; - case 0x13: - result = LPX; - break; - case 0x14: - result = LPY; - break; - case 0x15: - result = (sprites[0].MxE ? 0x01 : 0x00); - result |= (sprites[1].MxE ? 0x02 : 0x00); - result |= (sprites[2].MxE ? 0x04 : 0x00); - result |= (sprites[3].MxE ? 0x08 : 0x00); - result |= (sprites[4].MxE ? 0x10 : 0x00); - result |= (sprites[5].MxE ? 0x20 : 0x00); - result |= (sprites[6].MxE ? 0x40 : 0x00); - result |= (sprites[7].MxE ? 0x80 : 0x00); - break; - case 0x16: - result &= 0xC0; - result |= XSCROLL & 0x07; - result |= (CSEL ? 0x08 : 0x00); - result |= (MCM ? 0x10 : 0x00); - result |= (RES ? 0x20 : 0x00); - break; - case 0x17: - result = (sprites[0].MxYE ? 0x01 : 0x00); - result |= (sprites[1].MxYE ? 0x02 : 0x00); - result |= (sprites[2].MxYE ? 0x04 : 0x00); - result |= (sprites[3].MxYE ? 0x08 : 0x00); - result |= (sprites[4].MxYE ? 0x10 : 0x00); - result |= (sprites[5].MxYE ? 0x20 : 0x00); - result |= (sprites[6].MxYE ? 0x40 : 0x00); - result |= (sprites[7].MxYE ? 0x80 : 0x00); - break; - case 0x18: - result &= 0x01; - result |= (CB & 0x07) << 1; - result |= (VM & 0x0F) << 4; - break; - case 0x19: - result &= 0x70; - result |= (IRST ? 0x01 : 0x00); - result |= (IMBC ? 0x02 : 0x00); - result |= (IMMC ? 0x04 : 0x00); - result |= (ILP ? 0x08 : 0x00); - result |= (IRQ ? 0x80 : 0x00); - break; - case 0x1A: - result &= 0xF0; - result |= (ERST ? 0x01 : 0x00); - result |= (EMBC ? 0x02 : 0x00); - result |= (EMMC ? 0x04 : 0x00); - result |= (ELP ? 0x08 : 0x00); - break; - case 0x1B: - result = (sprites[0].MxDP ? 0x01 : 0x00); - result |= (sprites[1].MxDP ? 0x02 : 0x00); - result |= (sprites[2].MxDP ? 0x04 : 0x00); - result |= (sprites[3].MxDP ? 0x08 : 0x00); - result |= (sprites[4].MxDP ? 0x10 : 0x00); - result |= (sprites[5].MxDP ? 0x20 : 0x00); - result |= (sprites[6].MxDP ? 0x40 : 0x00); - result |= (sprites[7].MxDP ? 0x80 : 0x00); - break; - case 0x1C: - result = (sprites[0].MxMC ? 0x01 : 0x00); - result |= (sprites[1].MxMC ? 0x02 : 0x00); - result |= (sprites[2].MxMC ? 0x04 : 0x00); - result |= (sprites[3].MxMC ? 0x08 : 0x00); - result |= (sprites[4].MxMC ? 0x10 : 0x00); - result |= (sprites[5].MxMC ? 0x20 : 0x00); - result |= (sprites[6].MxMC ? 0x40 : 0x00); - result |= (sprites[7].MxMC ? 0x80 : 0x00); - break; - case 0x1D: - result = (sprites[0].MxXE ? 0x01 : 0x00); - result |= (sprites[1].MxXE ? 0x02 : 0x00); - result |= (sprites[2].MxXE ? 0x04 : 0x00); - result |= (sprites[3].MxXE ? 0x08 : 0x00); - result |= (sprites[4].MxXE ? 0x10 : 0x00); - result |= (sprites[5].MxXE ? 0x20 : 0x00); - result |= (sprites[6].MxXE ? 0x40 : 0x00); - result |= (sprites[7].MxXE ? 0x80 : 0x00); - break; - case 0x1E: - result = (sprites[0].MxM ? 0x01 : 0x00); - result |= (sprites[1].MxM ? 0x02 : 0x00); - result |= (sprites[2].MxM ? 0x04 : 0x00); - result |= (sprites[3].MxM ? 0x08 : 0x00); - result |= (sprites[4].MxM ? 0x10 : 0x00); - result |= (sprites[5].MxM ? 0x20 : 0x00); - result |= (sprites[6].MxM ? 0x40 : 0x00); - result |= (sprites[7].MxM ? 0x80 : 0x00); - break; - case 0x1F: - result = (sprites[0].MxD ? 0x01 : 0x00); - result |= (sprites[1].MxD ? 0x02 : 0x00); - result |= (sprites[2].MxD ? 0x04 : 0x00); - result |= (sprites[3].MxD ? 0x08 : 0x00); - result |= (sprites[4].MxD ? 0x10 : 0x00); - result |= (sprites[5].MxD ? 0x20 : 0x00); - result |= (sprites[6].MxD ? 0x40 : 0x00); - result |= (sprites[7].MxD ? 0x80 : 0x00); - break; - case 0x20: - result &= 0xF0; - result |= EC & 0x0F; - break; - case 0x21: - case 0x22: - case 0x23: - case 0x24: - result &= 0xF0; - result |= BxC[addr - 0x21] & 0x0F; - break; - case 0x25: - case 0x26: - result &= 0xF0; - result |= MMx[addr - 0x25] & 0x0F; - break; - case 0x27: - case 0x28: - case 0x29: - case 0x2A: - case 0x2B: - case 0x2C: - case 0x2D: - case 0x2E: - result &= 0xF0; - result |= sprites[addr - 0x27].MxC & 0x0F; - break; - default: - result = 0xFF; - break; - } - - return (byte)(result); - } - set - { - int index; - int val = value; - addr &= 0x3F; - - switch (addr) - { - case 0x00: - case 0x02: - case 0x04: - case 0x06: - case 0x08: - case 0x0A: - case 0x0C: - case 0x0E: - index = addr >> 1; - sprites[index].MxX &= 0x100; - sprites[index].MxX |= (val & 0xFF); - break; - case 0x01: - case 0x03: - case 0x05: - case 0x07: - case 0x09: - case 0x0B: - case 0x0D: - case 0x0F: - index = addr >> 1; - sprites[index].MxY &= 0x100; - sprites[index].MxY |= (val & 0xFF); - break; - case 0x10: - sprites[0].MxX = (sprites[0].MxX & 0xFF) | ((val & 0x01) << 8); - sprites[1].MxX = (sprites[1].MxX & 0xFF) | ((val & 0x02) << 7); - sprites[2].MxX = (sprites[2].MxX & 0xFF) | ((val & 0x04) << 6); - sprites[3].MxX = (sprites[3].MxX & 0xFF) | ((val & 0x08) << 5); - sprites[4].MxX = (sprites[4].MxX & 0xFF) | ((val & 0x10) << 4); - sprites[5].MxX = (sprites[5].MxX & 0xFF) | ((val & 0x20) << 3); - sprites[6].MxX = (sprites[6].MxX & 0xFF) | ((val & 0x40) << 2); - sprites[7].MxX = (sprites[7].MxX & 0xFF) | ((val & 0x80) << 1); - break; - case 0x11: - YSCROLL = (val & 0x07); - RSEL = ((val & 0x08) != 0x00); - DEN = ((val & 0x10) != 0x00); - BMM = ((val & 0x20) != 0x00); - ECM = ((val & 0x40) != 0x00); - RASTER &= 0xFF; - RASTER |= ((val & 0x80) << 1); - break; - case 0x12: - RASTER &= 0x100; - RASTER |= (val & 0xFF); - break; - case 0x13: - LPX = (val & 0xFF); - break; - case 0x14: - LPY = (val & 0xFF); - break; - case 0x15: - sprites[0].MxE = ((val & 0x01) != 0x00); - sprites[1].MxE = ((val & 0x02) != 0x00); - sprites[2].MxE = ((val & 0x04) != 0x00); - sprites[3].MxE = ((val & 0x08) != 0x00); - sprites[4].MxE = ((val & 0x10) != 0x00); - sprites[5].MxE = ((val & 0x20) != 0x00); - sprites[6].MxE = ((val & 0x40) != 0x00); - sprites[7].MxE = ((val & 0x80) != 0x00); - break; - case 0x16: - XSCROLL = (val & 0x07); - CSEL = ((val & 0x08) != 0x00); - MCM = ((val & 0x10) != 0x00); - RES = ((val & 0x20) != 0x00); - break; - case 0x17: - sprites[0].MxYE = ((val & 0x01) != 0x00); - sprites[1].MxYE = ((val & 0x02) != 0x00); - sprites[2].MxYE = ((val & 0x04) != 0x00); - sprites[3].MxYE = ((val & 0x08) != 0x00); - sprites[4].MxYE = ((val & 0x10) != 0x00); - sprites[5].MxYE = ((val & 0x20) != 0x00); - sprites[6].MxYE = ((val & 0x40) != 0x00); - sprites[7].MxYE = ((val & 0x80) != 0x00); - break; - case 0x18: - CB = (val & 0x0E) >> 1; - VM = (val & 0xF0) >> 4; - break; - case 0x19: - IRST = ((val & 0x01) != 0x00); - IMBC = ((val & 0x02) != 0x00); - IMMC = ((val & 0x04) != 0x00); - ILP = ((val & 0x08) != 0x00); - break; - case 0x1A: - ERST = ((val & 0x01) != 0x00); - EMBC = ((val & 0x02) != 0x00); - EMMC = ((val & 0x04) != 0x00); - ELP = ((val & 0x08) != 0x00); - break; - case 0x1B: - sprites[0].MxDP = ((val & 0x01) != 0x00); - sprites[1].MxDP = ((val & 0x02) != 0x00); - sprites[2].MxDP = ((val & 0x04) != 0x00); - sprites[3].MxDP = ((val & 0x08) != 0x00); - sprites[4].MxDP = ((val & 0x10) != 0x00); - sprites[5].MxDP = ((val & 0x20) != 0x00); - sprites[6].MxDP = ((val & 0x40) != 0x00); - sprites[7].MxDP = ((val & 0x80) != 0x00); - break; - case 0x1C: - sprites[0].MxMC = ((val & 0x01) != 0x00); - sprites[1].MxMC = ((val & 0x02) != 0x00); - sprites[2].MxMC = ((val & 0x04) != 0x00); - sprites[3].MxMC = ((val & 0x08) != 0x00); - sprites[4].MxMC = ((val & 0x10) != 0x00); - sprites[5].MxMC = ((val & 0x20) != 0x00); - sprites[6].MxMC = ((val & 0x40) != 0x00); - sprites[7].MxMC = ((val & 0x80) != 0x00); - break; - case 0x1D: - sprites[0].MxXE = ((val & 0x01) != 0x00); - sprites[1].MxXE = ((val & 0x02) != 0x00); - sprites[2].MxXE = ((val & 0x04) != 0x00); - sprites[3].MxXE = ((val & 0x08) != 0x00); - sprites[4].MxXE = ((val & 0x10) != 0x00); - sprites[5].MxXE = ((val & 0x20) != 0x00); - sprites[6].MxXE = ((val & 0x40) != 0x00); - sprites[7].MxXE = ((val & 0x80) != 0x00); - break; - case 0x1E: - sprites[0].MxM = ((val & 0x01) != 0x00); - sprites[1].MxM = ((val & 0x02) != 0x00); - sprites[2].MxM = ((val & 0x04) != 0x00); - sprites[3].MxM = ((val & 0x08) != 0x00); - sprites[4].MxM = ((val & 0x10) != 0x00); - sprites[5].MxM = ((val & 0x20) != 0x00); - sprites[6].MxM = ((val & 0x40) != 0x00); - sprites[7].MxM = ((val & 0x80) != 0x00); - break; - case 0x1F: - sprites[0].MxD = ((val & 0x01) != 0x00); - sprites[1].MxD = ((val & 0x02) != 0x00); - sprites[2].MxD = ((val & 0x04) != 0x00); - sprites[3].MxD = ((val & 0x08) != 0x00); - sprites[4].MxD = ((val & 0x10) != 0x00); - sprites[5].MxD = ((val & 0x20) != 0x00); - sprites[6].MxD = ((val & 0x40) != 0x00); - sprites[7].MxD = ((val & 0x80) != 0x00); - break; - case 0x20: - EC = (val & 0x0F); - break; - case 0x21: - case 0x22: - case 0x23: - case 0x24: - BxC[addr - 0x21] = val & 0x0F; - break; - case 0x25: - case 0x26: - MMx[addr - 0x25] = val & 0x0F; - break; - case 0x27: - case 0x28: - case 0x29: - case 0x2A: - case 0x2B: - case 0x2C: - case 0x2D: - case 0x2E: - sprites[addr - 0x27].MxC = val & 0x0F; - break; - } - } - } - - public byte Peek(int addr) - { - return this[addr & 0x3F]; - } - - public void Poke(int addr, byte val) - { - this[addr & 0x3F] = val; - } - - public byte Read(ushort addr) - { - byte result = 0; - addr &= 0x3F; - - switch (addr) - { - case 0x1E: - // clear after read - result = this[addr]; - this[addr] = 0x00; - IMMC = false; - UpdateInterrupts(); - break; - case 0x1F: - // clear after read - result = this[addr]; - this[addr] = 0x00; - IMBC = false; - UpdateInterrupts(); - break; - default: - result = this[addr]; - break; - } - - return result; - } - - private void UpdateBorder() - { - borderTop = RSEL ? 0x033 : 0x037; - borderBottom = RSEL ? 0x0FB : 0x0F7; - borderLeft = CSEL ? 0x018 : 0x01F; - borderRight = CSEL ? 0x158 : 0x14F; - } - - private void UpdateInterrupts() - { - IRQ = ((IRST & ERST) || (IMMC & EMMC) || (IMBC & EMBC) || (ILP & ELP)); - } - - private void UpdatePlotter() - { - graphicsMode = (ECM ? 0x04 : 0x00) | (BMM ? 0x02 : 0x00) | (MCM ? 0x01 : 0x00); - } - - public void Write(ushort addr, byte val) - { - addr &= 0x3F; - - switch (addr) - { - case 0x11: - rasterInterruptTriggered = false; - rasterInterruptLine &= 0xFF; - rasterInterruptLine |= (val & 0x80) << 1; - // raster upper bit can't be changed, save and restore the value - val &= 0x7F; - val |= (byte)(this[addr] & 0x80); - this[addr] = val; - UpdateBorder(); - UpdatePlotter(); - break; - case 0x12: - // raster interrupt lower 8 bits - rasterInterruptTriggered = false; - rasterInterruptLine &= 0x100; - rasterInterruptLine |= (val & 0xFF); - break; - case 0x16: - this[addr] = val; - UpdateBorder(); - UpdatePlotter(); - break; - case 0x19: - // only allow clearing of these flags - if ((val & 0x01) != 0x00) - IRST = false; - if ((val & 0x02) != 0x00) - IMBC = false; - if ((val & 0x04) != 0x00) - IMMC = false; - if ((val & 0x08) != 0x00) - ILP = false; - UpdateInterrupts(); - break; - case 0x1E: - case 0x1F: - // can't write to these regs - break; - default: - this[addr] = val; - break; - } - } - } -} \ No newline at end of file diff --git a/BizHawk.Emulation/Computers/Commodore64/VicIIVideoProvider.cs b/BizHawk.Emulation/Computers/Commodore64/VicIIVideoProvider.cs deleted file mode 100644 index 2ce5f45ab0..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/VicIIVideoProvider.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class VicII : IVideoProvider - { - private int[] videoBuffer; - private int videoBufferHeight; - private int videoBufferIndex; - private int videoBufferSize; - private int videoBufferWidth; - - // palette - private static int[] palette = - { - Colors.ARGB(0x00, 0x00, 0x00), - Colors.ARGB(0xFF, 0xFF, 0xFF), - Colors.ARGB(0x68, 0x37, 0x2B), - Colors.ARGB(0x70, 0xA4, 0xB2), - Colors.ARGB(0x6F, 0x3D, 0x86), - Colors.ARGB(0x58, 0x8D, 0x43), - Colors.ARGB(0x35, 0x28, 0x79), - Colors.ARGB(0xB8, 0xC7, 0x6F), - Colors.ARGB(0x6F, 0x4F, 0x25), - Colors.ARGB(0x43, 0x39, 0x00), - Colors.ARGB(0x9A, 0x67, 0x59), - Colors.ARGB(0x44, 0x44, 0x44), - Colors.ARGB(0x6C, 0x6C, 0x6C), - Colors.ARGB(0x9A, 0xD2, 0x84), - Colors.ARGB(0x6C, 0x5E, 0xB5), - Colors.ARGB(0x95, 0x95, 0x95) - }; - - public int BackgroundColor - { - get { return -16777216; } //FF000000 - } - - public int BufferHeight - { - get { return videoBufferHeight; } - } - - public int BufferWidth - { - get { return videoBufferWidth; } - } - - public int[] GetVideoBuffer() - { - return videoBuffer; - } - - private void InitVideoBuffer() - { - videoBufferIndex = 0; - videoBufferWidth = pipelineLength * 8; - videoBufferHeight = rasterLines; - videoBufferSize = videoBufferWidth * videoBufferHeight; - videoBuffer = new int[videoBufferSize]; - } - - public int VirtualWidth - { - get { return videoBufferWidth; } - } - } -} diff --git a/BizHawk.Emulation/Computers/Commodore64/VicState.cs b/BizHawk.Emulation/Computers/Commodore64/VicState.cs deleted file mode 100644 index a834217524..0000000000 --- a/BizHawk.Emulation/Computers/Commodore64/VicState.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace BizHawk.Emulation.Computers.Commodore64 -{ - public partial class VicII : IVideoProvider - { - public void SyncState(Serializer ser) - { - // internal - ser.Sync("RC", ref RC); - ser.Sync("VC", ref VC); - ser.Sync("VCBASE", ref VCBASE); - ser.Sync("VMLI", ref VMLI); - - // external - ser.Sync("BMM", ref BMM); - ser.Sync("BxC", ref BxC, false); - ser.Sync("CB", ref CB); - ser.Sync("CSEL", ref CSEL); - ser.Sync("DEN", ref DEN); - ser.Sync("EC", ref EC); - ser.Sync("ECM", ref ECM); - ser.Sync("ELP", ref ELP); - ser.Sync("EMBC", ref EMBC); - ser.Sync("EMMC", ref EMMC); - ser.Sync("ERST", ref ERST); - ser.Sync("ILP", ref ILP); - ser.Sync("IMBC", ref IMBC); - ser.Sync("IMMC", ref IMMC); - ser.Sync("IRQ", ref IRQ); - ser.Sync("IRST", ref IRST); - ser.Sync("LPX", ref LPX); - ser.Sync("LPY", ref LPY); - ser.Sync("MCM", ref MCM); - ser.Sync("MMx", ref MMx, false); - ser.Sync("RASTER", ref RASTER); - ser.Sync("RES", ref RES); - ser.Sync("RSEL", ref RSEL); - ser.Sync("VM", ref VM); - ser.Sync("XSCROLL", ref XSCROLL); - ser.Sync("YSCROLL", ref YSCROLL); - - // state - ser.Sync("ADVANCEX", ref advanceX); - ser.Sync("BADLINE", ref badline); - ser.Sync("BITMAPCOLUMN", ref bitmapColumn); - ser.Sync("BITMAPDATA", ref bitmapData); - ser.Sync("BORDERONMAIN", ref borderOnMain); - ser.Sync("BORDERONVERTICAL", ref borderOnVertical); - ser.Sync("CENTERENABLED", ref centerEnabled); - ser.Sync("CHARACTERDATA", ref characterData); - ser.Sync("CHARACTERDATABUS", ref characterDataBus); - ser.Sync("CHARMEM", ref characterMemory, false); - ser.Sync("COLORDATA", ref colorData); - ser.Sync("COLORDATABUS", ref colorDataBus); - ser.Sync("COLORMEM", ref colorMemory, false); - ser.Sync("DISPLAYENABLED", ref displayEnabled); - ser.Sync("FETCHCOUNTER", ref fetchCounter); - ser.Sync("IDLE", ref idle); - ser.Sync("PLOTTERBUFFERINDEX", ref plotterBufferIndex); - ser.Sync("PLOTTERDATA", ref plotterData); - ser.Sync("PLOTTERDATABUFFER", ref plotterDataBuffer, false); - ser.Sync("PLOTTERDELAY", ref plotterDelay); - ser.Sync("PLOTTERPIXEL", ref plotterPixel); - ser.Sync("PLOTTERPIXELBUFFER", ref plotterPixelBuffer, false); - ser.Sync("RASTERINTERRUPTLINE", ref rasterInterruptLine); - ser.Sync("RASTERINTERRUPTTRIGGERED", ref rasterInterruptTriggered); - ser.Sync("RASTERX", ref rasterX); - ser.Sync("REFRESHADDRESS", ref refreshAddress); - - // pipeline - ser.Sync("CYCLE", ref cycle); - ser.Sync("PIPELINEGACCESS", ref pipelineGAccess); - - // sprites - for (int i = 0; i < 8; i++) - { - string iTag = i.ToString(); - ser.Sync("MC" + iTag, ref sprites[i].MC); - ser.Sync("MCBASE" + iTag, ref sprites[i].MCBASE); - ser.Sync("MD" + iTag, ref sprites[i].MD); - ser.Sync("MDMA" + iTag, ref sprites[i].MDMA); - ser.Sync("MPTR" + iTag, ref sprites[i].MPTR); - ser.Sync("MSR" + iTag, ref sprites[i].MSR); - ser.Sync("MxXEToggle" + iTag, ref sprites[i].MxXEToggle); - ser.Sync("MxYEToggle" + iTag, ref sprites[i].MxYEToggle); - - ser.Sync("MxC" + iTag, ref sprites[i].MxC); - ser.Sync("MxD" + iTag, ref sprites[i].MxD); - ser.Sync("MxDP" + iTag, ref sprites[i].MxDP); - ser.Sync("MxE" + iTag, ref sprites[i].MxE); - ser.Sync("MxM" + iTag, ref sprites[i].MxM); - ser.Sync("MxMC" + iTag, ref sprites[i].MxMC); - ser.Sync("MxX" + iTag, ref sprites[i].MxX); - ser.Sync("MxXE" + iTag, ref sprites[i].MxXE); - ser.Sync("MxY" + iTag, ref sprites[i].MxY); - ser.Sync("MxYE" + iTag, ref sprites[i].MxYE); - } - - if (ser.IsReader) - { - UpdateBorder(); - UpdatePlotter(); - } - } - } -} \ No newline at end of file