From 2d47b306f4658d90acc245470887e46ec17909d7 Mon Sep 17 00:00:00 2001 From: "ALIENJACK\\alien" Date: Tue, 23 Jul 2024 18:31:59 +0800 Subject: [PATCH] =?UTF-8?q?VirtuaNesCore=E7=BF=BB=E8=AF=91=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Assets/MyNes.Core/Bandai.cs | 145 - .../Assets/MyNes.Core/BankInfo.cs | 32 - .../Assets/MyNes.Core/BankInfoSorter.cs | 20 - .../Assets/MyNes.Core/BlankJoypad.cs | 14 - .../MyNes.Core/BlankShortuctsHandler.cs | 14 - .../MyNes.Core/BlankShortuctsHandler.cs.meta | 11 - .../Assets/MyNes.Core/Board.cs | 1121 ---- .../Assets/MyNes.Core/Board.cs.meta | 11 - .../Assets/MyNes.Core/BoardInfoAttribute.cs | 61 - .../MyNes.Core/BoardInfoAttribute.cs.meta | 11 - .../Assets/MyNes.Core/BoardInfoObject.cs | 20 - .../Assets/MyNes.Core/BoardInfoObject.cs.meta | 11 - .../Assets/MyNes.Core/CHRArea.cs | 14 - .../Assets/MyNes.Core/CHRArea.cs.meta | 11 - .../Adler32.cs | 72 - .../Adler32.cs.meta | 11 - .../Deflate.cs | 1412 ---- .../Deflate.cs.meta | 11 - .../InfBlocks.cs | 661 -- .../InfBlocks.cs.meta | 11 - .../InfCodes.cs | 664 -- .../InfCodes.cs.meta | 11 - .../InfTree.cs | 479 -- .../InfTree.cs.meta | 11 - .../Inflate.cs | 409 -- .../Inflate.cs.meta | 11 - .../StaticTree.cs | 126 - .../StaticTree.cs.meta | 11 - .../SupportClass.cs | 104 - .../SupportClass.cs.meta | 11 - .../Tree.cs | 341 - .../Tree.cs.meta | 11 - .../ZInputStream.cs | 134 - .../ZInputStream.cs.meta | 11 - .../ZOutputStream.cs | 193 - .../ZOutputStream.cs.meta | 11 - .../ZStream.cs | 224 - .../ZStream.cs.meta | 11 - .../ZStreamException.cs | 16 - .../ZStreamException.cs.meta | 11 - .../zlibConst.cs | 54 - .../zlibConst.cs.meta | 11 - .../Assets/MyNes.Core/Crc32.cs | 113 - .../Assets/MyNes.Core/Crc32.cs.meta | 11 - .../Assets/MyNes.Core/EmuRegion.cs | 9 - .../Assets/MyNes.Core/EmuRegion.cs.meta | 11 - .../Assets/MyNes.Core/EmuSettings.cs | 104 - .../Assets/MyNes.Core/EmuSettings.cs.meta | 11 - .../Assets/MyNes.Core/Eprom.cs | 387 -- .../Assets/MyNes.Core/Eprom.cs.meta | 11 - .../Assets/MyNes.Core/FFE.cs | 60 - .../Assets/MyNes.Core/FFE.cs.meta | 11 - .../Assets/MyNes.Core/GameGenie.cs | 156 - .../Assets/MyNes.Core/GameGenie.cs.meta | 11 - .../Assets/MyNes.Core/GameGenieCode.cs | 19 - .../Assets/MyNes.Core/GameGenieCode.cs.meta | 11 - .../Assets/MyNes.Core/GetIsPlaying.cs | 4 - .../Assets/MyNes.Core/GetIsPlaying.cs.meta | 11 - .../Assets/MyNes.Core/HassIssuesAttribute.cs | 12 - .../MyNes.Core/HassIssuesAttribute.cs.meta | 11 - .../Assets/MyNes.Core/HelperTools.cs | 178 - .../Assets/MyNes.Core/HelperTools.cs.meta | 11 - .../Assets/MyNes.Core/IAudioProvider.cs | 29 - .../Assets/MyNes.Core/IAudioProvider.cs.meta | 11 - .../Assets/MyNes.Core/IJoypadConnecter.cs | 23 - .../MyNes.Core/IJoypadConnecter.cs.meta | 11 - .../Assets/MyNes.Core/INes.cs | 95 - .../Assets/MyNes.Core/INes.cs.meta | 11 - .../Assets/MyNes.Core/IRom.cs | 34 - .../Assets/MyNes.Core/IRom.cs.meta | 11 - .../Assets/MyNes.Core/ISettings.cs | 157 - .../Assets/MyNes.Core/ISettings.cs.meta | 11 - .../Assets/MyNes.Core/IShortcutsHandler.cs | 7 - .../MyNes.Core/IShortcutsHandler.cs.meta | 11 - .../MyNes.Core/IVSUnisystemDIPConnecter.cs | 30 - .../IVSUnisystemDIPConnecter.cs.meta | 11 - .../Assets/MyNes.Core/IVideoProvider.cs | 41 - .../Assets/MyNes.Core/IVideoProvider.cs.meta | 11 - .../Assets/MyNes.Core/IZapperConnecter.cs | 21 - .../MyNes.Core/IZapperConnecter.cs.meta | 11 - .../MyNes.Core/Il2CppSetOptionAttribute.cs | 74 - .../Il2CppSetOptionAttribute.cs.meta | 11 - .../Assets/MyNes.Core/MMC2.cs | 120 - .../Assets/MyNes.Core/MMC2.cs.meta | 11 - .../Assets/MyNes.Core/MMC5Pcm.cs | 90 - .../Assets/MyNes.Core/MMC5Pcm.cs.meta | 11 - .../Assets/MyNes.Core/MMC5Sqr.cs | 218 - .../Assets/MyNes.Core/MMC5Sqr.cs.meta | 11 - .../Assets/MyNes.Core/MNInterfaceLanguage.cs | 134 - .../MyNes.Core/MNInterfaceLanguage.cs.meta | 11 - .../Assets/MyNes.Core/Mapper000.cs | 7 - .../Assets/MyNes.Core/Mapper000.cs.meta | 11 - .../Assets/MyNes.Core/Mapper001.cs | 245 - .../Assets/MyNes.Core/Mapper001.cs.meta | 11 - .../Assets/MyNes.Core/Mapper002.cs | 17 - .../Assets/MyNes.Core/Mapper002.cs.meta | 11 - .../Assets/MyNes.Core/Mapper003.cs | 15 - .../Assets/MyNes.Core/Mapper003.cs.meta | 11 - .../Assets/MyNes.Core/Mapper004.cs | 228 - .../Assets/MyNes.Core/Mapper004.cs.meta | 11 - .../Assets/MyNes.Core/Mapper005.cs | 870 --- .../Assets/MyNes.Core/Mapper005.cs.meta | 11 - .../Assets/MyNes.Core/Mapper006.cs | 21 - .../Assets/MyNes.Core/Mapper006.cs.meta | 11 - .../Assets/MyNes.Core/Mapper007.cs | 12 - .../Assets/MyNes.Core/Mapper007.cs.meta | 11 - .../Assets/MyNes.Core/Mapper008.cs | 15 - .../Assets/MyNes.Core/Mapper008.cs.meta | 11 - .../Assets/MyNes.Core/Mapper009.cs | 7 - .../Assets/MyNes.Core/Mapper009.cs.meta | 11 - .../Assets/MyNes.Core/Mapper010.cs | 25 - .../Assets/MyNes.Core/Mapper010.cs.meta | 11 - .../Assets/MyNes.Core/Mapper011.cs | 16 - .../Assets/MyNes.Core/Mapper011.cs.meta | 11 - .../Assets/MyNes.Core/Mapper013.cs | 21 - .../Assets/MyNes.Core/Mapper013.cs.meta | 11 - .../Assets/MyNes.Core/Mapper015.cs | 36 - .../Assets/MyNes.Core/Mapper015.cs.meta | 11 - .../Assets/MyNes.Core/Mapper016.cs | 7 - .../Assets/MyNes.Core/Mapper016.cs.meta | 11 - .../Assets/MyNes.Core/Mapper017.cs | 64 - .../Assets/MyNes.Core/Mapper017.cs.meta | 11 - .../Assets/MyNes.Core/Mapper018.cs | 219 - .../Assets/MyNes.Core/Mapper018.cs.meta | 11 - .../Assets/MyNes.Core/Mapper019.cs | 7 - .../Assets/MyNes.Core/Mapper019.cs.meta | 11 - .../Assets/MyNes.Core/Mapper021.cs | 254 - .../Assets/MyNes.Core/Mapper021.cs.meta | 11 - .../Assets/MyNes.Core/Mapper022.cs | 138 - .../Assets/MyNes.Core/Mapper022.cs.meta | 11 - .../Assets/MyNes.Core/Mapper023.cs | 163 - .../Assets/MyNes.Core/Mapper023.cs.meta | 11 - .../Assets/MyNes.Core/Mapper024.cs | 245 - .../Assets/MyNes.Core/Mapper024.cs.meta | 11 - .../Assets/MyNes.Core/Mapper025.cs | 254 - .../Assets/MyNes.Core/Mapper025.cs.meta | 11 - .../Assets/MyNes.Core/Mapper026.cs | 245 - .../Assets/MyNes.Core/Mapper026.cs.meta | 11 - .../Assets/MyNes.Core/Mapper032.cs | 109 - .../Assets/MyNes.Core/Mapper032.cs.meta | 11 - .../Assets/MyNes.Core/Mapper033.cs | 177 - .../Assets/MyNes.Core/Mapper033.cs.meta | 11 - .../Assets/MyNes.Core/Mapper034.cs | 50 - .../Assets/MyNes.Core/Mapper034.cs.meta | 11 - .../Assets/MyNes.Core/Mapper041.cs | 58 - .../Assets/MyNes.Core/Mapper041.cs.meta | 11 - .../Assets/MyNes.Core/Mapper042.cs | 94 - .../Assets/MyNes.Core/Mapper042.cs.meta | 11 - .../Assets/MyNes.Core/Mapper044.cs | 235 - .../Assets/MyNes.Core/Mapper044.cs.meta | 11 - .../Assets/MyNes.Core/Mapper045.cs | 294 - .../Assets/MyNes.Core/Mapper045.cs.meta | 11 - .../Assets/MyNes.Core/Mapper046.cs | 42 - .../Assets/MyNes.Core/Mapper046.cs.meta | 11 - .../Assets/MyNes.Core/Mapper047.cs | 258 - .../Assets/MyNes.Core/Mapper047.cs.meta | 11 - .../Assets/MyNes.Core/Mapper048.cs | 172 - .../Assets/MyNes.Core/Mapper048.cs.meta | 11 - .../Assets/MyNes.Core/Mapper049.cs | 272 - .../Assets/MyNes.Core/Mapper049.cs.meta | 11 - .../Assets/MyNes.Core/Mapper050.cs | 71 - .../Assets/MyNes.Core/Mapper050.cs.meta | 11 - .../Assets/MyNes.Core/Mapper051.cs | 79 - .../Assets/MyNes.Core/Mapper051.cs.meta | 11 - .../Assets/MyNes.Core/Mapper052.cs | 273 - .../Assets/MyNes.Core/Mapper052.cs.meta | 11 - .../Assets/MyNes.Core/Mapper053.cs | 58 - .../Assets/MyNes.Core/Mapper053.cs.meta | 11 - .../Assets/MyNes.Core/Mapper056.cs | 97 - .../Assets/MyNes.Core/Mapper056.cs.meta | 11 - .../Assets/MyNes.Core/Mapper057.cs | 55 - .../Assets/MyNes.Core/Mapper057.cs.meta | 11 - .../Assets/MyNes.Core/Mapper058.cs | 24 - .../Assets/MyNes.Core/Mapper058.cs.meta | 11 - .../Assets/MyNes.Core/Mapper060.cs | 67 - .../Assets/MyNes.Core/Mapper060.cs.meta | 11 - .../Assets/MyNes.Core/Mapper061.cs | 20 - .../Assets/MyNes.Core/Mapper061.cs.meta | 11 - .../Assets/MyNes.Core/Mapper062.cs | 24 - .../Assets/MyNes.Core/Mapper062.cs.meta | 11 - .../Assets/MyNes.Core/Mapper064.cs | 258 - .../Assets/MyNes.Core/Mapper064.cs.meta | 11 - .../Assets/MyNes.Core/Mapper065.cs | 94 - .../Assets/MyNes.Core/Mapper065.cs.meta | 11 - .../Assets/MyNes.Core/Mapper066.cs | 12 - .../Assets/MyNes.Core/Mapper066.cs.meta | 11 - .../Assets/MyNes.Core/Mapper067.cs | 108 - .../Assets/MyNes.Core/Mapper067.cs.meta | 11 - .../Assets/MyNes.Core/Mapper068.cs | 112 - .../Assets/MyNes.Core/Mapper068.cs.meta | 11 - .../Assets/MyNes.Core/Mapper069.cs | 259 - .../Assets/MyNes.Core/Mapper069.cs.meta | 11 - .../Assets/MyNes.Core/Mapper070.cs | 18 - .../Assets/MyNes.Core/Mapper070.cs.meta | 11 - .../Assets/MyNes.Core/Mapper071.cs | 30 - .../Assets/MyNes.Core/Mapper071.cs.meta | 11 - .../Assets/MyNes.Core/Mapper072.cs | 53 - .../Assets/MyNes.Core/Mapper072.cs.meta | 11 - .../Assets/MyNes.Core/Mapper073.cs | 111 - .../Assets/MyNes.Core/Mapper073.cs.meta | 11 - .../Assets/MyNes.Core/Mapper074.cs | 234 - .../Assets/MyNes.Core/Mapper074.cs.meta | 11 - .../Assets/MyNes.Core/Mapper075.cs | 63 - .../Assets/MyNes.Core/Mapper075.cs.meta | 11 - .../Assets/MyNes.Core/Mapper076.cs | 77 - .../Assets/MyNes.Core/Mapper076.cs.meta | 11 - .../Assets/MyNes.Core/Mapper077.cs | 23 - .../Assets/MyNes.Core/Mapper077.cs.meta | 11 - .../Assets/MyNes.Core/Mapper078.cs | 33 - .../Assets/MyNes.Core/Mapper078.cs.meta | 11 - .../Assets/MyNes.Core/Mapper079.cs | 15 - .../Assets/MyNes.Core/Mapper079.cs.meta | 11 - .../Assets/MyNes.Core/Mapper080.cs | 56 - .../Assets/MyNes.Core/Mapper080.cs.meta | 11 - .../Assets/MyNes.Core/Mapper082.cs | 70 - .../Assets/MyNes.Core/Mapper082.cs.meta | 11 - .../Assets/MyNes.Core/Mapper085.cs | 171 - .../Assets/MyNes.Core/Mapper085.cs.meta | 11 - .../Assets/MyNes.Core/Mapper086.cs | 15 - .../Assets/MyNes.Core/Mapper086.cs.meta | 11 - .../Assets/MyNes.Core/Mapper087.cs | 11 - .../Assets/MyNes.Core/Mapper087.cs.meta | 11 - .../Assets/MyNes.Core/Mapper088.cs | 67 - .../Assets/MyNes.Core/Mapper088.cs.meta | 11 - .../Assets/MyNes.Core/Mapper089.cs | 19 - .../Assets/MyNes.Core/Mapper089.cs.meta | 11 - .../Assets/MyNes.Core/Mapper090.cs | 634 -- .../Assets/MyNes.Core/Mapper090.cs.meta | 11 - .../Assets/MyNes.Core/Mapper091.cs | 96 - .../Assets/MyNes.Core/Mapper091.cs.meta | 11 - .../Assets/MyNes.Core/Mapper092.cs | 50 - .../Assets/MyNes.Core/Mapper092.cs.meta | 11 - .../Assets/MyNes.Core/Mapper093.cs | 18 - .../Assets/MyNes.Core/Mapper093.cs.meta | 11 - .../Assets/MyNes.Core/Mapper094.cs | 17 - .../Assets/MyNes.Core/Mapper094.cs.meta | 11 - .../Assets/MyNes.Core/Mapper095.cs | 265 - .../Assets/MyNes.Core/Mapper095.cs.meta | 11 - .../Assets/MyNes.Core/Mapper096.cs | 46 - .../Assets/MyNes.Core/Mapper096.cs.meta | 11 - .../Assets/MyNes.Core/Mapper097.cs | 32 - .../Assets/MyNes.Core/Mapper097.cs.meta | 11 - .../Assets/MyNes.Core/Mapper105.cs | 200 - .../Assets/MyNes.Core/Mapper105.cs.meta | 11 - .../Assets/MyNes.Core/Mapper107.cs | 11 - .../Assets/MyNes.Core/Mapper107.cs.meta | 11 - .../Assets/MyNes.Core/Mapper112.cs | 70 - .../Assets/MyNes.Core/Mapper112.cs.meta | 11 - .../Assets/MyNes.Core/Mapper113.cs | 16 - .../Assets/MyNes.Core/Mapper113.cs.meta | 11 - .../Assets/MyNes.Core/Mapper115.cs | 259 - .../Assets/MyNes.Core/Mapper115.cs.meta | 11 - .../Assets/MyNes.Core/Mapper118.cs | 263 - .../Assets/MyNes.Core/Mapper118.cs.meta | 11 - .../Assets/MyNes.Core/Mapper119.cs | 236 - .../Assets/MyNes.Core/Mapper119.cs.meta | 11 - .../Assets/MyNes.Core/Mapper133.cs | 12 - .../Assets/MyNes.Core/Mapper133.cs.meta | 11 - .../Assets/MyNes.Core/Mapper140.cs | 12 - .../Assets/MyNes.Core/Mapper140.cs.meta | 11 - .../Assets/MyNes.Core/Mapper152.cs | 19 - .../Assets/MyNes.Core/Mapper152.cs.meta | 11 - .../Assets/MyNes.Core/Mapper154.cs | 72 - .../Assets/MyNes.Core/Mapper154.cs.meta | 11 - .../Assets/MyNes.Core/Mapper163.cs | 109 - .../Assets/MyNes.Core/Mapper163.cs.meta | 11 - .../Assets/MyNes.Core/Mapper164.cs | 28 - .../Assets/MyNes.Core/Mapper164.cs.meta | 11 - .../Assets/MyNes.Core/Mapper165.cs | 253 - .../Assets/MyNes.Core/Mapper165.cs.meta | 11 - .../Assets/MyNes.Core/Mapper180.cs | 14 - .../Assets/MyNes.Core/Mapper180.cs.meta | 11 - .../Assets/MyNes.Core/Mapper182.cs | 227 - .../Assets/MyNes.Core/Mapper182.cs.meta | 11 - .../Assets/MyNes.Core/Mapper184.cs | 12 - .../Assets/MyNes.Core/Mapper184.cs.meta | 11 - .../Assets/MyNes.Core/Mapper185.cs | 45 - .../Assets/MyNes.Core/Mapper185.cs.meta | 11 - .../Assets/MyNes.Core/Mapper189.cs | 184 - .../Assets/MyNes.Core/Mapper189.cs.meta | 11 - .../Assets/MyNes.Core/Mapper191.cs | 212 - .../Assets/MyNes.Core/Mapper191.cs.meta | 11 - .../Assets/MyNes.Core/Mapper192.cs | 225 - .../Assets/MyNes.Core/Mapper192.cs.meta | 11 - .../Assets/MyNes.Core/Mapper193.cs | 36 - .../Assets/MyNes.Core/Mapper193.cs.meta | 11 - .../Assets/MyNes.Core/Mapper194.cs | 209 - .../Assets/MyNes.Core/Mapper194.cs.meta | 11 - .../Assets/MyNes.Core/Mapper200.cs | 14 - .../Assets/MyNes.Core/Mapper200.cs.meta | 11 - .../Assets/MyNes.Core/Mapper201.cs | 12 - .../Assets/MyNes.Core/Mapper201.cs.meta | 11 - .../Assets/MyNes.Core/Mapper202.cs | 22 - .../Assets/MyNes.Core/Mapper202.cs.meta | 11 - .../Assets/MyNes.Core/Mapper203.cs | 16 - .../Assets/MyNes.Core/Mapper203.cs.meta | 11 - .../Assets/MyNes.Core/Mapper204.cs | 19 - .../Assets/MyNes.Core/Mapper204.cs.meta | 11 - .../Assets/MyNes.Core/Mapper205.cs | 275 - .../Assets/MyNes.Core/Mapper205.cs.meta | 11 - .../Assets/MyNes.Core/Mapper206.cs | 131 - .../Assets/MyNes.Core/Mapper206.cs.meta | 11 - .../Assets/MyNes.Core/Mapper207.cs | 112 - .../Assets/MyNes.Core/Mapper207.cs.meta | 11 - .../Assets/MyNes.Core/Mapper209.cs | 12 - .../Assets/MyNes.Core/Mapper209.cs.meta | 11 - .../Assets/MyNes.Core/Mapper212.cs | 19 - .../Assets/MyNes.Core/Mapper212.cs.meta | 11 - .../Assets/MyNes.Core/Mapper213.cs | 12 - .../Assets/MyNes.Core/Mapper213.cs.meta | 11 - .../Assets/MyNes.Core/Mapper214.cs | 13 - .../Assets/MyNes.Core/Mapper214.cs.meta | 11 - .../Assets/MyNes.Core/Mapper216.cs | 12 - .../Assets/MyNes.Core/Mapper216.cs.meta | 11 - .../Assets/MyNes.Core/Mapper222.cs | 48 - .../Assets/MyNes.Core/Mapper222.cs.meta | 11 - .../Assets/MyNes.Core/Mapper225.cs | 63 - .../Assets/MyNes.Core/Mapper225.cs.meta | 11 - .../Assets/MyNes.Core/Mapper226.cs | 66 - .../Assets/MyNes.Core/Mapper226.cs.meta | 11 - .../Assets/MyNes.Core/Mapper227.cs | 90 - .../Assets/MyNes.Core/Mapper227.cs.meta | 11 - .../Assets/MyNes.Core/Mapper228.cs | 61 - .../Assets/MyNes.Core/Mapper228.cs.meta | 11 - .../Assets/MyNes.Core/Mapper229.cs | 17 - .../Assets/MyNes.Core/Mapper229.cs.meta | 11 - .../Assets/MyNes.Core/Mapper230.cs | 58 - .../Assets/MyNes.Core/Mapper230.cs.meta | 11 - .../Assets/MyNes.Core/Mapper231.cs | 13 - .../Assets/MyNes.Core/Mapper231.cs.meta | 11 - .../Assets/MyNes.Core/Mapper232.cs | 42 - .../Assets/MyNes.Core/Mapper232.cs.meta | 11 - .../Assets/MyNes.Core/Mapper233.cs | 68 - .../Assets/MyNes.Core/Mapper233.cs.meta | 11 - .../Assets/MyNes.Core/Mapper240.cs | 12 - .../Assets/MyNes.Core/Mapper240.cs.meta | 11 - .../Assets/MyNes.Core/Mapper242.cs | 12 - .../Assets/MyNes.Core/Mapper242.cs.meta | 11 - .../Assets/MyNes.Core/Mapper243.cs | 88 - .../Assets/MyNes.Core/Mapper243.cs.meta | 11 - .../Assets/MyNes.Core/Mapper245.cs | 229 - .../Assets/MyNes.Core/Mapper245.cs.meta | 11 - .../Assets/MyNes.Core/Mapper246.cs | 50 - .../Assets/MyNes.Core/Mapper246.cs.meta | 11 - .../Assets/MyNes.Core/Mapper255.cs | 66 - .../Assets/MyNes.Core/Mapper255.cs.meta | 11 - .../Assets/MyNes.Core/MemReadAccess.cs | 4 - .../Assets/MyNes.Core/MemReadAccess.cs.meta | 11 - .../Assets/MyNes.Core/MemWriteAccess.cs | 4 - .../Assets/MyNes.Core/MemWriteAccess.cs.meta | 11 - .../Assets/MyNes.Core/Mirroring.cs | 11 - .../Assets/MyNes.Core/Mirroring.cs.meta | 11 - .../Assets/MyNes.Core/MyNesMain.cs | 219 - .../Assets/MyNes.Core/MyNesMain.cs.meta | 11 - .../Assets/MyNes.Core/NTArea.cs | 10 - .../Assets/MyNes.Core/NTArea.cs.meta | 11 - .../Assets/MyNes.Core/NTSCPaletteGenerator.cs | 109 - .../MyNes.Core/NTSCPaletteGenerator.cs.meta | 11 - .../Assets/MyNes.Core/Namcot106.cs | 557 -- .../Assets/MyNes.Core/Namcot106.cs.meta | 11 - .../Assets/MyNes.Core/Namcot106Chnl.cs | 157 - .../Assets/MyNes.Core/Namcot106Chnl.cs.meta | 11 - .../Assets/MyNes.Core/NesCartDatabase.cs | 331 - .../Assets/MyNes.Core/NesCartDatabase.cs.meta | 11 - .../NesCartDatabaseCartridgeInfo.cs | 57 - .../NesCartDatabaseCartridgeInfo.cs.meta | 11 - .../MyNes.Core/NesCartDatabaseGameInfo.cs | 33 - .../NesCartDatabaseGameInfo.cs.meta | 11 - .../Assets/MyNes.Core/NesEmu.cs | 5750 ----------------- .../Assets/MyNes.Core/NesEmu.cs.meta | 11 - .../Assets/MyNes.Core/PALBPaletteGenerator.cs | 113 - .../MyNes.Core/PALBPaletteGenerator.cs.meta | 11 - .../Assets/MyNes.Core/PRGArea.cs | 18 - .../Assets/MyNes.Core/PRGArea.cs.meta | 11 - .../Assets/MyNes.Core/PaletteFileWrapper.cs | 65 - .../MyNes.Core/PaletteFileWrapper.cs.meta | 11 - .../Assets/MyNes.Core/PaletteSelectSetting.cs | 10 - .../MyNes.Core/PaletteSelectSetting.cs.meta | 11 - .../Assets/MyNes.Core/RegionSetting.cs | 10 - .../Assets/MyNes.Core/RegionSetting.cs.meta | 11 - .../Assets/MyNes.Core/RenderAudioSamples.cs | 4 - .../MyNes.Core/RenderAudioSamples.cs.meta | 11 - .../Assets/MyNes.Core/RenderVideoFrame.cs | 4 - .../MyNes.Core/RenderVideoFrame.cs.meta | 11 - .../Assets/MyNes.Core/RendererSettings.cs | 128 - .../MyNes.Core/RendererSettings.cs.meta | 11 - .../Assets/MyNes.Core/SRAMBankInfo.cs | 22 - .../Assets/MyNes.Core/SRAMBankInfo.cs.meta | 11 - .../Assets/MyNes.Core/SoundDCBlockerFilter.cs | 38 - .../MyNes.Core/SoundDCBlockerFilter.cs.meta | 11 - .../Assets/MyNes.Core/SoundHighPassFilter.cs | 40 - .../MyNes.Core/SoundHighPassFilter.cs.meta | 11 - .../Assets/MyNes.Core/SoundLowPassFilter.cs | 49 - .../MyNes.Core/SoundLowPassFilter.cs.meta | 11 - .../Assets/MyNes.Core/StateHandler.cs | 194 - .../Assets/MyNes.Core/StateHandler.cs.meta | 11 - .../Assets/MyNes.Core/Sunsoft5BChnl.cs | 99 - .../Assets/MyNes.Core/Sunsoft5BChnl.cs.meta | 11 - .../Assets/MyNes.Core/Support/EnumJoyIndex.cs | 7 - .../MyNes.Core/Support/EnumJoyIndex.cs.meta | 11 - .../Assets/MyNes.Core/Support/EnumKeyKind.cs | 7 - .../MyNes.Core/Support/EnumKeyKind.cs.meta | 11 - .../MyNes.Core/Support/IExternalSuppoter.cs | 13 - .../Support/IExternalSuppoter.cs.meta | 11 - .../Assets/MyNes.Core/TogglePause.cs | 4 - .../Assets/MyNes.Core/TogglePause.cs.meta | 11 - .../Assets/MyNes.Core/Tracer.cs | 80 - .../Assets/MyNes.Core/Tracer.cs.meta | 11 - .../Assets/MyNes.Core/TracerEventArgs.cs | 21 - .../Assets/MyNes.Core/TracerEventArgs.cs.meta | 11 - .../Assets/MyNes.Core/TracerStatus.cs | 10 - .../Assets/MyNes.Core/TracerStatus.cs.meta | 11 - .../Assets/MyNes.Core/VRC6Pulse.cs | 120 - .../Assets/MyNes.Core/VRC6Pulse.cs.meta | 11 - .../Assets/MyNes.Core/VRC6Sawtooth.cs | 118 - .../Assets/MyNes.Core/VRC6Sawtooth.cs.meta | 11 - .../Assets/MyNes.Core/WaveRecorder.cs | 306 - .../Assets/MyNes.Core/WaveRecorder.cs.meta | 11 - .../MyNes.Core/WithExternalSoundAttribute.cs | 12 - .../WithExternalSoundAttribute.cs.meta | 11 - .../Assets/MyNes.Core/ZlipWrapper.cs | 39 - .../Assets/MyNes.Core/ZlipWrapper.cs.meta | 11 - .../Assets/Resources/NesCoreRes/Palettes.meta | 8 - .../NesCoreRes/Palettes/ASQ_realityA.pal.txt | Bin 192 -> 0 bytes .../Palettes/ASQ_realityA.pal.txt.meta | 7 - .../NesCoreRes/Palettes/ASQ_realityB.pal.txt | Bin 192 -> 0 bytes .../Palettes/ASQ_realityB.pal.txt.meta | 7 - .../NesCoreRes/Palettes/BMF_final2.pal.txt | Bin 192 -> 0 bytes .../Palettes/BMF_final2.pal.txt.meta | 7 - .../NesCoreRes/Palettes/BMF_final3.pal.txt | Bin 192 -> 0 bytes .../Palettes/BMF_final3.pal.txt.meta | 7 - .../Palettes/FCEU-13-default_nitsuja.pal.txt | Bin 192 -> 0 bytes .../FCEU-13-default_nitsuja.pal.txt.meta | 7 - .../Palettes/FCEU-15-nitsuja_new.pal.txt | Bin 192 -> 0 bytes .../Palettes/FCEU-15-nitsuja_new.pal.txt.meta | 7 - .../NesCoreRes/Palettes/FCEUX.pal.txt | Bin 192 -> 0 bytes .../NesCoreRes/Palettes/FCEUX.pal.txt.meta | 7 - .../NesCoreRes/Palettes/NTSC.pal.txt | Bin 192 -> 0 bytes .../NesCoreRes/Palettes/NTSC.pal.txt.meta | 7 - .../Resources/NesCoreRes/Palettes/PAL.pal.txt | Bin 192 -> 0 bytes .../NesCoreRes/Palettes/PAL.pal.txt.meta | 7 - .../NesCoreRes/Palettes/default_ntsc.pal.txt | Bin 1536 -> 0 bytes .../Palettes/default_ntsc.pal.txt.meta | 7 - .../NesCoreRes/Palettes/pc10.pal.txt | Bin 192 -> 0 bytes .../NesCoreRes/Palettes/pc10.pal.txt.meta | 7 - .../NesCoreRes/Palettes/pc10emph.pal.txt | Bin 1536 -> 0 bytes .../NesCoreRes/Palettes/pc10emph.pal.txt.meta | 7 - .../NesCoreRes/Palettes/vs_001.pal.txt | Bin 192 -> 0 bytes .../NesCoreRes/Palettes/vs_001.pal.txt.meta | 7 - .../NesCoreRes/Palettes/vs_001emph.pal.txt | Bin 1536 -> 0 bytes .../Palettes/vs_001emph.pal.txt.meta | 7 - .../NesCoreRes/Palettes/vs_002.pal.txt | Bin 192 -> 0 bytes .../NesCoreRes/Palettes/vs_002.pal.txt.meta | 7 - .../NesCoreRes/Palettes/vs_002emph.pal.txt | Bin 1536 -> 0 bytes .../Palettes/vs_002emph.pal.txt.meta | 7 - .../NesCoreRes/Palettes/vs_003.pal.txt | Bin 192 -> 0 bytes .../NesCoreRes/Palettes/vs_003.pal.txt.meta | 7 - .../NesCoreRes/Palettes/vs_003emph.pal.txt | Bin 1536 -> 0 bytes .../Palettes/vs_003emph.pal.txt.meta | 7 - .../NesCoreRes/Palettes/vs_004.pal.txt | Bin 192 -> 0 bytes .../NesCoreRes/Palettes/vs_004.pal.txt.meta | 7 - .../NesCoreRes/Palettes/vs_004emph.pal.txt | Bin 1536 -> 0 bytes .../Palettes/vs_004emph.pal.txt.meta | 7 - .../Assets/Resources/NesCoreRes/database.xml | Bin 3968168 -> 0 bytes .../Resources/NesCoreRes/database.xml.meta | 7 - .../Assets/Scene/EmuTest.unity | 69 - AxibugEmuOnline.Client/Assets/Script/Emu.meta | 8 - .../Assets/Script/Emu/AudioProvider.cs | 138 - .../Assets/Script/Emu/AudioProvider.cs.meta | 11 - .../Assets/Script/Emu/InputManager.meta | 8 - .../Script/Emu/InputManager/InputManager.cs | 43 - .../Emu/InputManager/InputManager.cs.meta | 11 - .../Script/Emu/InputManager/KeyMapper.cs | 15 - .../Script/Emu/InputManager/KeyMapper.cs.meta | 11 - .../Script/Emu/InputManager/LocalKeyMapper.cs | 72 - .../Emu/InputManager/LocalKeyMapper.cs.meta | 11 - .../Emu/InputManager/NesJoyController.cs | 61 - .../Emu/InputManager/NesJoyController.cs.meta | 11 - .../Script/Emu/InputManager/NetKeyMapper.cs | 24 - .../Emu/InputManager/NetKeyMapper.cs.meta | 11 - .../Assets/Script/Emu/UguiVideoProvider.cs | 142 - .../Script/Emu/UguiVideoProvider.cs.meta | 11 - .../Assets/Script/Manager/AppEmu.cs | 63 +- .../Assets/Script/Manager/AppNetGame.cs | 2 - .../Assets/Script/NesCoreProxy.cs | 30 - .../Assets/Script/NesCoreProxy.cs.meta | 11 - .../{MyNes.Core.meta => VirtualNes.Core.meta} | 2 +- .../Assets/VirtualNes.Core/APU.cs | 62 + .../APU.cs.meta} | 2 +- .../ApuEX.meta} | 2 +- .../VirtualNes.Core/ApuEX/APU_INTERFACE.cs | 28 + .../ApuEX/APU_INTERFACE.cs.meta} | 2 +- .../VirtualNes.Core/ApuEX/APU_INTERNAL.cs | 32 + .../ApuEX/APU_INTERNAL.cs.meta} | 2 +- .../Assets/VirtualNes.Core/CHEATCODE.cs | 6 + .../CHEATCODE.cs.meta} | 2 +- .../Assets/VirtualNes.Core/CPU.cs | 56 + .../Assets/VirtualNes.Core/CPU.cs.meta | 11 + .../Assets/VirtualNes.Core/Debuger.cs | 26 + .../Assets/VirtualNes.Core/Debuger.cs.meta | 11 + .../Mapper.meta} | 2 +- .../Assets/VirtualNes.Core/Mapper/Mapper.cs | 12 + .../VirtualNes.Core/Mapper/Mapper.cs.meta | 11 + .../Assets/VirtualNes.Core/NES.cs | 167 + .../Assets/VirtualNes.Core/NES.cs.meta | 11 + .../Assets/VirtualNes.Core/PAD.cs | 48 + .../Assets/VirtualNes.Core/PAD.cs.meta | 11 + .../Assets/VirtualNes.Core/PPU.cs | 35 + .../Assets/VirtualNes.Core/PPU.cs.meta | 11 + .../PadEX.meta} | 2 +- .../Assets/VirtualNes.Core/PadEX/EXPAD.cs | 10 + .../VirtualNes.Core/PadEX/EXPAD.cs.meta | 11 + .../Assets/VirtualNes.Core/ROM.cs | 294 + .../Assets/VirtualNes.Core/ROM.cs.meta | 11 + .../Assets/VirtualNes.Core/Supporter.meta | 8 + .../VirtualNes.Core/Supporter/Supporter.cs | 26 + .../Supporter/Supporter.cs.meta | 11 + .../VirtualNes.Core.asmdef} | 8 +- .../VirtualNes.Core.asmdef.meta} | 2 +- 519 files changed, 924 insertions(+), 33549 deletions(-) delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Bandai.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfo.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfoSorter.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/BlankJoypad.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/BlankShortuctsHandler.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/BlankShortuctsHandler.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Board.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Board.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoAttribute.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoAttribute.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoObject.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoObject.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/CHRArea.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/CHRArea.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Adler32.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Adler32.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Deflate.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Deflate.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfBlocks.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfBlocks.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfCodes.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfCodes.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfTree.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfTree.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Inflate.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Inflate.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/StaticTree.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/StaticTree.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/SupportClass.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/SupportClass.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Tree.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Tree.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZInputStream.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZInputStream.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZOutputStream.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZOutputStream.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStream.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStream.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStreamException.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStreamException.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/zlibConst.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/zlibConst.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Crc32.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Crc32.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/EmuRegion.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/EmuRegion.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/EmuSettings.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/EmuSettings.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Eprom.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Eprom.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/FFE.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/FFE.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenie.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenie.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenieCode.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenieCode.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/GetIsPlaying.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/GetIsPlaying.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/HassIssuesAttribute.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/HassIssuesAttribute.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/HelperTools.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/HelperTools.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IAudioProvider.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IAudioProvider.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IJoypadConnecter.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IJoypadConnecter.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/INes.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/INes.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IRom.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IRom.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ISettings.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ISettings.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IShortcutsHandler.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IShortcutsHandler.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IVSUnisystemDIPConnecter.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IVSUnisystemDIPConnecter.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IVideoProvider.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IVideoProvider.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IZapperConnecter.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/IZapperConnecter.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Il2CppSetOptionAttribute.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Il2CppSetOptionAttribute.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MMC2.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MMC2.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Pcm.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Pcm.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Sqr.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Sqr.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MNInterfaceLanguage.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MNInterfaceLanguage.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper000.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper000.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper001.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper001.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper002.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper002.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper003.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper003.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper004.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper004.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper005.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper005.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper006.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper006.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper007.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper007.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper008.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper008.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper009.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper009.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper010.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper010.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper011.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper011.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper013.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper013.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper015.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper015.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper016.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper016.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper017.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper017.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper018.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper018.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper019.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper019.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper021.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper021.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper022.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper022.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper023.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper023.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper024.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper024.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper025.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper025.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper026.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper026.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper032.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper032.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper033.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper033.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper034.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper034.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper041.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper041.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper042.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper042.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper044.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper044.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper045.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper045.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper046.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper046.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper047.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper047.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper048.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper048.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper049.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper049.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper050.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper050.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper051.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper051.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper052.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper052.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper053.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper053.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper056.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper056.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper057.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper057.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper058.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper058.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper060.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper060.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper061.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper061.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper062.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper062.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper064.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper064.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper065.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper065.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper066.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper066.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper067.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper067.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper068.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper068.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper069.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper069.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper070.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper070.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper071.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper071.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper072.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper072.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper073.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper073.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper074.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper074.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper075.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper075.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper076.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper076.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper077.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper077.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper078.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper078.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper079.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper079.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper080.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper080.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper082.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper082.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper085.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper085.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper086.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper086.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper087.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper087.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper088.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper088.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper089.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper089.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper090.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper090.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper091.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper091.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper092.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper092.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper093.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper093.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper094.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper094.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper095.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper095.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper096.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper096.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper097.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper097.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper105.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper105.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper107.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper107.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper112.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper112.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper113.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper113.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper115.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper115.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper118.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper118.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper119.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper119.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper133.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper133.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper140.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper140.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper152.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper152.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper154.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper154.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper163.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper163.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper164.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper164.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper165.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper165.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper180.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper180.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper182.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper182.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper184.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper184.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper185.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper185.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper189.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper189.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper191.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper191.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper192.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper192.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper193.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper193.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper194.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper194.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper200.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper200.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper201.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper201.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper202.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper202.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper203.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper203.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper204.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper204.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper205.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper205.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper206.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper206.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper207.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper207.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper209.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper209.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper212.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper212.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper213.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper213.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper214.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper214.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper216.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper216.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper222.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper222.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper225.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper225.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper226.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper226.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper227.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper227.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper228.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper228.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper229.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper229.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper230.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper230.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper231.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper231.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper232.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper232.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper233.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper233.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper240.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper240.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper242.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper242.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper243.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper243.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper245.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper245.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper246.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper246.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper255.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper255.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MemReadAccess.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MemReadAccess.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MemWriteAccess.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MemWriteAccess.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mirroring.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Mirroring.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MyNesMain.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/MyNesMain.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NTArea.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NTArea.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NTSCPaletteGenerator.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NTSCPaletteGenerator.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106Chnl.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106Chnl.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabase.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabase.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseCartridgeInfo.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseCartridgeInfo.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseGameInfo.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseGameInfo.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NesEmu.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/NesEmu.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/PALBPaletteGenerator.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/PALBPaletteGenerator.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/PRGArea.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/PRGArea.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteFileWrapper.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteFileWrapper.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteSelectSetting.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteSelectSetting.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/RegionSetting.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/RegionSetting.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/RenderAudioSamples.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/RenderAudioSamples.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/RenderVideoFrame.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/RenderVideoFrame.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/RendererSettings.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/RendererSettings.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/SRAMBankInfo.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/SRAMBankInfo.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/SoundDCBlockerFilter.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/SoundDCBlockerFilter.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/SoundHighPassFilter.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/SoundHighPassFilter.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/SoundLowPassFilter.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/SoundLowPassFilter.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/StateHandler.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/StateHandler.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Sunsoft5BChnl.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Sunsoft5BChnl.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumJoyIndex.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumJoyIndex.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumKeyKind.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumKeyKind.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Support/IExternalSuppoter.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Support/IExternalSuppoter.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/TogglePause.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/TogglePause.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Tracer.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/Tracer.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/TracerEventArgs.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/TracerEventArgs.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/TracerStatus.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/TracerStatus.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Pulse.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Pulse.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Sawtooth.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Sawtooth.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/WaveRecorder.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/WaveRecorder.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/WithExternalSoundAttribute.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/WithExternalSoundAttribute.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ZlipWrapper.cs delete mode 100644 AxibugEmuOnline.Client/Assets/MyNes.Core/ZlipWrapper.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/ASQ_realityA.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/ASQ_realityA.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/ASQ_realityB.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/ASQ_realityB.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final2.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final2.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final3.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final3.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-13-default_nitsuja.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-13-default_nitsuja.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-15-nitsuja_new.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-15-nitsuja_new.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEUX.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEUX.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/NTSC.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/NTSC.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/PAL.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/PAL.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/default_ntsc.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/default_ntsc.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10emph.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10emph.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001emph.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001emph.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_002.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_002.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_002emph.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_002emph.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003emph.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003emph.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004emph.pal.txt delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004emph.pal.txt.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/database.xml delete mode 100644 AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/database.xml.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/AudioProvider.cs delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/AudioProvider.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/InputManager.cs delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/InputManager.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/KeyMapper.cs delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/KeyMapper.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/LocalKeyMapper.cs delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/LocalKeyMapper.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NesJoyController.cs delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NesJoyController.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NetKeyMapper.cs delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NetKeyMapper.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/UguiVideoProvider.cs delete mode 100644 AxibugEmuOnline.Client/Assets/Script/Emu/UguiVideoProvider.cs.meta delete mode 100644 AxibugEmuOnline.Client/Assets/Script/NesCoreProxy.cs delete mode 100644 AxibugEmuOnline.Client/Assets/Script/NesCoreProxy.cs.meta rename AxibugEmuOnline.Client/Assets/{MyNes.Core.meta => VirtualNes.Core.meta} (77%) create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/APU.cs rename AxibugEmuOnline.Client/Assets/{MyNes.Core/BlankJoypad.cs.meta => VirtualNes.Core/APU.cs.meta} (83%) rename AxibugEmuOnline.Client/Assets/{MyNes.Core/ComponentAce.Compression.Libs.zlib.meta => VirtualNes.Core/ApuEX.meta} (77%) create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERFACE.cs rename AxibugEmuOnline.Client/Assets/{MyNes.Core/BankInfo.cs.meta => VirtualNes.Core/ApuEX/APU_INTERFACE.cs.meta} (83%) create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERNAL.cs rename AxibugEmuOnline.Client/Assets/{MyNes.Core/Bandai.cs.meta => VirtualNes.Core/ApuEX/APU_INTERNAL.cs.meta} (83%) create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/CHEATCODE.cs rename AxibugEmuOnline.Client/Assets/{MyNes.Core/BankInfoSorter.cs.meta => VirtualNes.Core/CHEATCODE.cs.meta} (83%) create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/CPU.cs create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/CPU.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/Debuger.cs create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/Debuger.cs.meta rename AxibugEmuOnline.Client/Assets/{Resources/NesCoreRes.meta => VirtualNes.Core/Mapper.meta} (77%) create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper/Mapper.cs create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper/Mapper.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/PAD.cs create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/PAD.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs.meta rename AxibugEmuOnline.Client/Assets/{MyNes.Core/Support.meta => VirtualNes.Core/PadEX.meta} (77%) create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX/EXPAD.cs create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX/EXPAD.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/ROM.cs create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/ROM.cs.meta create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter.meta create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter/Supporter.cs create mode 100644 AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter/Supporter.cs.meta rename AxibugEmuOnline.Client/Assets/{MyNes.Core/MyNes.Core.asmdef => VirtualNes.Core/VirtualNes.Core.asmdef} (68%) rename AxibugEmuOnline.Client/Assets/{MyNes.Core/MyNes.Core.asmdef.meta => VirtualNes.Core/VirtualNes.Core.asmdef.meta} (76%) diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Bandai.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Bandai.cs deleted file mode 100644 index 01cf683..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Bandai.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal abstract class Bandai : Board - { - private bool irq_enable; - - private int irq_counter; - - private Eprom eprom; - - internal override void Initialize(IRom rom) - { - base.Initialize(rom); - if (base.BoardType.ToLower().Contains("24c01")) - { - eprom = new Eprom(128); - } - else - { - eprom = new Eprom((base.MapperNumber == 16) ? 256 : 128); - } - } - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - irq_enable = false; - irq_counter = 0; - eprom.HardReset(); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - WritePRG(ref address, ref data); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF) - { - case 0: - Switch01KCHR(data, CHRArea.Area0000); - break; - case 1: - Switch01KCHR(data, CHRArea.Area0400); - break; - case 2: - Switch01KCHR(data, CHRArea.Area0800); - break; - case 3: - Switch01KCHR(data, CHRArea.Area0C00); - break; - case 4: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 5: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 6: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 7: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 8: - Switch16KPRG(data, PRGArea.Area8000); - break; - case 9: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 10: - irq_enable = (data & 1) == 1; - NesEmu.IRQFlags &= -9; - break; - case 11: - irq_counter = (irq_counter & 0xFF00) | data; - break; - case 12: - irq_counter = (irq_counter & 0xFF) | (data << 8); - break; - case 13: - eprom.Write(address, data); - break; - } - } - - internal override void ReadSRM(ref ushort address, out byte value) - { - value = eprom.Read(address); - } - - internal override void OnCPUClock() - { - if (irq_enable) - { - irq_counter--; - if (irq_counter == 0) - { - NesEmu.IRQFlags |= 8; - } - if (irq_counter < 0) - { - irq_counter = 65535; - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(irq_enable); - stream.Write(irq_counter); - eprom.SaveState(stream); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - irq_enable = stream.ReadBoolean(); - irq_counter = stream.ReadInt32(); - eprom.LoadState(stream); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfo.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfo.cs deleted file mode 100644 index a435e93..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfo.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal struct BankInfo - { - public bool IsRAM; - - public bool Enabled; - - public bool Writable; - - public bool IsBattery; - - public string ID; - - public byte[] DATA; - - public BankInfo(string ID, bool IsRAM, bool Writable, bool Enabled, bool IsBattery, byte[] DATA) - { - this.ID = ID; - this.IsRAM = IsRAM; - this.Writable = Writable; - this.Enabled = Enabled; - this.DATA = DATA; - this.IsBattery = IsBattery; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfoSorter.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfoSorter.cs deleted file mode 100644 index 1393c5b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfoSorter.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class BankInfoSorter : IComparer - { - public int Compare(BankInfo x, BankInfo y) - { - int result = 0; - int result2 = 0; - int.TryParse(x.ID, out result); - int.TryParse(y.ID, out result2); - return result2 - result; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankJoypad.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankJoypad.cs deleted file mode 100644 index 5fad7bc..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankJoypad.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class BlankJoypad : IJoypadConnecter - { - public override void Update() - { - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankShortuctsHandler.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankShortuctsHandler.cs deleted file mode 100644 index 7414228..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankShortuctsHandler.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class BlankShortuctsHandler : IShortcutsHandler - { - public void Update() - { - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankShortuctsHandler.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankShortuctsHandler.cs.meta deleted file mode 100644 index 9271f36..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankShortuctsHandler.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d719eb3b397dd0743a86ded70de8d9dc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Board.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Board.cs deleted file mode 100644 index 7d810ea..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Board.cs +++ /dev/null @@ -1,1121 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal abstract class Board - { - protected byte[][] PRG_RAM; - - protected bool[] PRG_RAM_ENABLED; - - protected bool[] PRG_RAM_WRITABLE; - - protected bool[] PRG_RAM_BATTERY; - - protected byte[][] PRG_ROM; - - protected int PRG_RAM_08KB_DEFAULT_BLK_Count; - - internal int PRG_ROM_04KB_Count; - - protected int PRG_ROM_08KB_Count; - - protected int PRG_ROM_16KB_Count; - - protected int PRG_ROM_32KB_Count; - - protected int PRG_ROM_04KB_Mask; - - protected int PRG_ROM_08KB_Mask; - - protected int PRG_ROM_16KB_Mask; - - protected int PRG_ROM_32KB_Mask; - - internal int PRG_RAM_04KB_Count; - - protected int PRG_RAM_08KB_Count; - - protected int PRG_RAM_16KB_Count; - - protected int PRG_RAM_32KB_Count; - - protected int PRG_RAM_04KB_Mask; - - protected int PRG_RAM_08KB_Mask; - - protected int PRG_RAM_16KB_Mask; - - protected int PRG_RAM_32KB_Mask; - - protected bool[] PRG_AREA_BLK_RAM; - - protected int[] PRG_AREA_BLK_INDEX; - - protected int PRG_TMP_INDX; - - protected int PRG_TMP_AREA; - - protected byte[][] CHR_RAM; - - protected bool[] CHR_RAM_ENABLED; - - protected bool[] CHR_RAM_WRITABLE; - - protected bool[] CHR_RAM_BATTERY; - - protected byte[][] CHR_ROM; - - protected bool[] CHR_AREA_BLK_RAM; - - protected int[] CHR_AREA_BLK_INDEX; - - protected int CHR_TMP_INDX; - - protected int CHR_TMP_AREA; - - protected int CHR_ROM_01KB_DEFAULT_BLK_Count; - - internal int CHR_ROM_01KB_Count; - - protected int CHR_ROM_02KB_Count; - - protected int CHR_ROM_04KB_Count; - - protected int CHR_ROM_08KB_Count; - - internal int CHR_ROM_01KB_Mask; - - protected int CHR_ROM_02KB_Mask; - - protected int CHR_ROM_04KB_Mask; - - protected int CHR_ROM_08KB_Mask; - - internal int CHR_RAM_01KB_Count; - - protected int CHR_RAM_02KB_Count; - - protected int CHR_RAM_04KB_Count; - - protected int CHR_RAM_08KB_Count; - - internal int CHR_RAM_01KB_Mask; - - protected int CHR_RAM_02KB_Mask; - - protected int CHR_RAM_04KB_Mask; - - protected int CHR_RAM_08KB_Mask; - - protected byte[][] NMT_RAM; - - internal int[] NMT_AREA_BLK_INDEX; - - protected int NMT_TMP_INDX; - - protected int NMT_TMP_AREA; - - internal Mirroring NMT_DEFAULT_MIRROR; - - internal string SHA1 = ""; - - internal string CRC = ""; - - internal bool IsGameFoundOnDB; - - internal NesCartDatabaseGameInfo GameInfo; - - internal NesCartDatabaseCartridgeInfo GameCartInfo; - - internal bool SRAMSaveRequired; - - protected bool enabled_ppuA12ToggleTimer; - - protected bool ppuA12TogglesOnRaisingEdge; - - protected int old_vram_address; - - protected int new_vram_address; - - protected int ppu_cycles_timer; - - internal bool enable_external_sound; - - internal bool IsGameGenieActive; - - internal GameGenieCode[] GameGenieCodes; - - internal string BoardType { get; private set; } - - internal string BoardPCB { get; private set; } - - internal List Chips { get; private set; } - - internal string Name { get; set; } - - internal int MapperNumber { get; set; } - - internal bool HasIssues { get; set; } - - internal virtual string Issues { get; set; } - - public Board() - { - MapperNumber = -1; - PRG_RAM_08KB_DEFAULT_BLK_Count = 1; - CHR_ROM_01KB_DEFAULT_BLK_Count = 8; - LoadAttrs(); - } - - internal virtual void Initialize(IRom rom) - { - SHA1 = rom.SHA1; - SRAMSaveRequired = false; - IsGameGenieActive = false; - BoardType = "N/A"; - BoardPCB = "N/A"; - Chips = new List(); - if (NesCartDatabase.Ready) - { - Tracer.WriteLine("Looking for rom in the database .."); - GameInfo = NesCartDatabase.Find(SHA1, out IsGameFoundOnDB); - if (GameInfo.Cartridges != null) - { - foreach (NesCartDatabaseCartridgeInfo cartridge in GameInfo.Cartridges) - { - if (cartridge.SHA1.ToLower() == SHA1.ToLower()) - { - GameCartInfo = cartridge; - break; - } - } - } - if (IsGameFoundOnDB) - { - Tracer.WriteInformation("Game found in Database !!"); - Tracer.WriteLine("> Game name: " + GameInfo.Game_Name); - Tracer.WriteLine("> Game alt name: " + GameInfo.Game_AltName); - BoardType = GameCartInfo.Board_Type; - Tracer.WriteLine("> Board Type: " + BoardType); - BoardPCB = GameCartInfo.Board_Pcb; - Tracer.WriteLine("> Board Pcb: " + BoardPCB); - if (GameCartInfo.chip_type != null) - { - for (int i = 0; i < GameCartInfo.chip_type.Count; i++) - { - Console.WriteLine($"> CHIP {(i + 1).ToString()}: {GameCartInfo.chip_type[i]}"); - Chips.Add(GameCartInfo.chip_type[i]); - } - } - } - else - { - Tracer.WriteWarning("Game is not found in database ."); - } - } - Tracer.WriteLine("Initializing the board (Mapper # " + MapperNumber + ") ...."); - Tracer.WriteLine("Loading PRG ROM ..."); - PRG_AREA_BLK_RAM = new bool[16]; - PRG_AREA_BLK_INDEX = new int[16]; - PRG_ROM = new byte[0][]; - int num = 0; - for (int j = 0; j < rom.PRG.Length; j += 4096) - { - Array.Resize(ref PRG_ROM, PRG_ROM.GetLength(0) + 1); - PRG_ROM[num] = new byte[4096]; - for (int k = 0; k < 4096; k++) - { - PRG_ROM[num][k] = rom.PRG[j + k]; - } - num++; - } - PRG_ROM_04KB_Count = PRG_ROM.GetLength(0); - PRG_ROM_04KB_Mask = PRG_ROM_04KB_Count - 1; - PRG_ROM_08KB_Count = PRG_ROM_04KB_Count / 2; - PRG_ROM_08KB_Mask = PRG_ROM_08KB_Count - 1; - PRG_ROM_16KB_Count = PRG_ROM_04KB_Count / 4; - PRG_ROM_16KB_Mask = PRG_ROM_16KB_Count - 1; - PRG_ROM_32KB_Count = PRG_ROM_04KB_Count / 8; - PRG_ROM_32KB_Mask = PRG_ROM_32KB_Count - 1; - Tracer.WriteLine("PRG ROM loaded successfully."); - Tracer.WriteLine("PRG ROM Size = " + PRG_ROM_04KB_Count * 4 + "KB"); - Tracer.WriteLine("Loading PRG RAM ..."); - SRAMBankInfo[] pRGRAM8KCountFromDB = GetPRGRAM8KCountFromDB(); - PRG_RAM = new byte[0][]; - PRG_RAM_BATTERY = new bool[0]; - PRG_RAM_ENABLED = new bool[0]; - PRG_RAM_WRITABLE = new bool[0]; - SRAMBankInfo[] array = pRGRAM8KCountFromDB; - for (int l = 0; l < array.Length; l++) - { - SRAMBankInfo sRAMBankInfo = array[l]; - if (sRAMBankInfo.BATTERY) - { - SRAMSaveRequired = true; - } - int result = 0; - int.TryParse(sRAMBankInfo.SIZE.Replace("k", ""), out result); - if (result > 0) - { - int num2 = result / 2; - for (int m = 0; m < num2; m++) - { - Array.Resize(ref PRG_RAM_BATTERY, PRG_RAM_BATTERY.Length + 1); - Array.Resize(ref PRG_RAM_ENABLED, PRG_RAM_ENABLED.Length + 1); - Array.Resize(ref PRG_RAM_WRITABLE, PRG_RAM_WRITABLE.Length + 1); - Array.Resize(ref PRG_RAM, PRG_RAM.GetLength(0) + 1); - PRG_RAM[PRG_RAM.GetLength(0) - 1] = new byte[4096]; - PRG_RAM_BATTERY[PRG_RAM_BATTERY.Length - 1] = sRAMBankInfo.BATTERY; - PRG_RAM_ENABLED[PRG_RAM_ENABLED.Length - 1] = true; - PRG_RAM_WRITABLE[PRG_RAM_WRITABLE.Length - 1] = true; - } - } - } - PRG_RAM_04KB_Count = PRG_RAM.GetLength(0); - PRG_RAM_04KB_Mask = PRG_RAM_04KB_Count - 1; - PRG_RAM_08KB_Count = PRG_RAM_04KB_Count / 2; - PRG_RAM_08KB_Mask = PRG_RAM_08KB_Count - 1; - PRG_RAM_16KB_Count = PRG_RAM_04KB_Count / 4; - PRG_RAM_16KB_Mask = PRG_RAM_16KB_Count - 1; - PRG_RAM_32KB_Count = PRG_RAM_04KB_Count / 8; - PRG_RAM_32KB_Mask = PRG_RAM_32KB_Count - 1; - Tracer.WriteLine("PRG RAM loaded successfully."); - Tracer.WriteLine("PRG RAM Size = " + PRG_RAM_04KB_Count * 4 + "KB"); - if (rom.HasTrainer) - { - rom.Trainer.CopyTo(PRG_RAM[3], 0); - } - Tracer.WriteLine("Loading CHR ROM ..."); - CHR_ROM = new byte[0][]; - CHR_AREA_BLK_RAM = new bool[8]; - CHR_AREA_BLK_INDEX = new int[8]; - num = 0; - for (int n = 0; n < rom.CHR.Length; n += 1024) - { - Array.Resize(ref CHR_ROM, CHR_ROM.GetLength(0) + 1); - CHR_ROM[num] = new byte[1024]; - for (int num3 = 0; num3 < 1024; num3++) - { - CHR_ROM[num][num3] = rom.CHR[n + num3]; - } - num++; - } - CHR_ROM_01KB_Count = CHR_ROM.GetLength(0); - CHR_ROM_01KB_Mask = CHR_ROM_01KB_Count - 1; - CHR_ROM_02KB_Count = CHR_ROM_01KB_Count / 2; - CHR_ROM_02KB_Mask = CHR_ROM_02KB_Count - 1; - CHR_ROM_04KB_Count = CHR_ROM_01KB_Count / 4; - CHR_ROM_04KB_Mask = CHR_ROM_04KB_Count - 1; - CHR_ROM_08KB_Count = CHR_ROM_01KB_Count / 8; - CHR_ROM_08KB_Mask = CHR_ROM_08KB_Count - 1; - Tracer.WriteLine("CHR ROM loaded successfully."); - Tracer.WriteLine("CHR ROM Size = " + CHR_ROM_01KB_Count + "KB"); - Tracer.WriteLine("Loading CHR RAM ..."); - int cHRRAM1KCountFromDB = GetCHRRAM1KCountFromDB(); - CHR_RAM = new byte[0][]; - CHR_RAM_BATTERY = new bool[cHRRAM1KCountFromDB]; - CHR_RAM_ENABLED = new bool[cHRRAM1KCountFromDB]; - CHR_RAM_WRITABLE = new bool[cHRRAM1KCountFromDB]; - for (int num4 = 0; num4 < cHRRAM1KCountFromDB; num4++) - { - Array.Resize(ref CHR_RAM, CHR_RAM.GetLength(0) + 1); - CHR_RAM[num4] = new byte[1024]; - CHR_RAM_BATTERY[num4] = false; - CHR_RAM_ENABLED[num4] = true; - CHR_RAM_WRITABLE[num4] = true; - } - CHR_RAM_01KB_Count = CHR_RAM.GetLength(0); - CHR_RAM_01KB_Mask = CHR_RAM_01KB_Count - 1; - CHR_RAM_02KB_Count = CHR_RAM_01KB_Count / 2; - CHR_RAM_02KB_Mask = CHR_RAM_02KB_Count - 1; - CHR_RAM_04KB_Count = CHR_RAM_01KB_Count / 4; - CHR_RAM_04KB_Mask = CHR_RAM_04KB_Count - 1; - CHR_RAM_08KB_Count = CHR_RAM_01KB_Count / 8; - CHR_RAM_08KB_Mask = CHR_RAM_08KB_Count - 1; - Tracer.WriteLine("CHR RAM loaded successfully."); - Tracer.WriteLine("CHR RAM Size = " + CHR_RAM_01KB_Count + "KB"); - Tracer.WriteLine("Loading Nametables ..."); - NMT_AREA_BLK_INDEX = new int[4]; - NMT_RAM = new byte[0][]; - for (int num5 = 0; num5 < 4; num5++) - { - Array.Resize(ref NMT_RAM, NMT_RAM.GetLength(0) + 1); - NMT_RAM[num5] = new byte[1024]; - } - NMT_DEFAULT_MIRROR = rom.Mirroring; - Tracer.WriteLine("Mirroring set to " + NMT_DEFAULT_MIRROR); - Tracer.WriteLine("Board (Mapper # " + MapperNumber + ") initialized successfully."); - } - - internal virtual void HardReset() - { - Tracer.WriteLine("Hard reset board (Mapper # " + MapperNumber + ") ...."); - Tracer.WriteLine("Switching 16KB PRG RAM at 0x4000 - 0x7000"); - Toggle16KPRG_RAM(ram: true, PRGArea.Area4000); - Switch16KPRG(0, PRGArea.Area4000); - Tracer.WriteLine("Switching 32KB PRG ROM at 0x8000 - 0xF000"); - Toggle32KPRG_RAM(ram: false, PRGArea.Area8000); - Switch32KPRG(0, PRGArea.Area8000); - Tracer.WriteLine("Switching 8KB CHR " + ((CHR_ROM_01KB_Count == 0) ? "RAM" : "ROM") + " at 0x0000 - 0x1000"); - Toggle08KCHR_RAM(CHR_ROM_01KB_Count == 0); - Switch08KCHR(0); - Tracer.WriteLine("Switching to mirroring: " + NMT_DEFAULT_MIRROR); - Switch01KNMTFromMirroring(NMT_DEFAULT_MIRROR); - Tracer.WriteLine("Hard reset board (Mapper # " + MapperNumber + ") is done successfully."); - } - - internal virtual void SoftReset() - { - } - - protected virtual void LoadAttrs() - { - enable_external_sound = false; - Attribute[] customAttributes = Attribute.GetCustomAttributes(GetType()); - foreach (Attribute attribute in customAttributes) - { - if (attribute.GetType() == typeof(BoardInfoAttribute)) - { - BoardInfoAttribute boardInfoAttribute = (BoardInfoAttribute)attribute; - Name = boardInfoAttribute.Name; - MapperNumber = boardInfoAttribute.Mapper; - PRG_RAM_08KB_DEFAULT_BLK_Count = boardInfoAttribute.DefaultPRG_RAM_8KB_BanksCount; - CHR_ROM_01KB_DEFAULT_BLK_Count = boardInfoAttribute.DefaultCHR_RAM_1KB_BanksCount; - enabled_ppuA12ToggleTimer = boardInfoAttribute.Enabled_ppuA12ToggleTimer; - ppuA12TogglesOnRaisingEdge = boardInfoAttribute.PPUA12TogglesOnRaisingEdge; - } - else if (attribute.GetType() == typeof(WithExternalSoundAttribute)) - { - enable_external_sound = true; - } - else if (attribute.GetType() == typeof(HassIssuesAttribute)) - { - HasIssues = true; - } - } - } - - protected SRAMBankInfo[] GetPRGRAM8KCountFromDB() - { - Tracer.WriteLine("Retrieving PRG RAM information from database ...."); - List list = new List(); - if (IsGameFoundOnDB) - { - if (GameCartInfo.WRAMBanks.Count > 0) - { - foreach (SRAMBankInfo wRAMBank in GameCartInfo.WRAMBanks) - { - list.Add(wRAMBank); - } - } - else - { - Tracer.WriteLine("This game has no PRG RAM !"); - Tracer.WriteWarning("> Adding 8K x " + PRG_RAM_08KB_DEFAULT_BLK_Count + " PRG RAM BANKS to avoid exceptions."); - SRAMBankInfo item = new SRAMBankInfo(0, PRG_RAM_08KB_DEFAULT_BLK_Count * 8 + "k", BATTERY: true); - list.Add(item); - } - } - else - { - Tracer.WriteWarning("Could't find this game in database .... Adding 8K x " + PRG_RAM_08KB_DEFAULT_BLK_Count + " PRG RAM BANKS to avoid exceptions."); - SRAMBankInfo item2 = new SRAMBankInfo(0, PRG_RAM_08KB_DEFAULT_BLK_Count * 8 + "k", BATTERY: true); - list.Add(item2); - } - return list.ToArray(); - } - - protected int GetCHRRAM1KCountFromDB() - { - int num = 0; - Tracer.WriteLine("Retrieving CHR RAM information from database ...."); - if (IsGameFoundOnDB) - { - bool flag = false; - if (GameCartInfo.VRAM_sizes != null) - { - Tracer.WriteLine("Using database to initialize CHR RAM ....."); - foreach (string vRAM_size in GameCartInfo.VRAM_sizes) - { - int result = 0; - if (int.TryParse(vRAM_size.Replace("k", ""), out result)) - { - Tracer.WriteLine(">CHR RAM CHIP SIZE " + vRAM_size + " KB added"); - num += result; - if (num > 0) - { - flag = true; - } - } - } - } - if (!flag) - { - Tracer.WriteLine("Game not found in database to initialize CHR RAM; CHR RAM size set to " + CHR_ROM_01KB_DEFAULT_BLK_Count + " KB"); - num = CHR_ROM_01KB_DEFAULT_BLK_Count; - } - } - else - { - Tracer.WriteWarning("Game not found in database to initialize CHR RAM; CHR RAM size set to " + CHR_ROM_01KB_DEFAULT_BLK_Count + " KB"); - num = CHR_ROM_01KB_DEFAULT_BLK_Count; - } - return num; - } - - internal virtual void WriteEX(ref ushort addr, ref byte val) - { - PRG_TMP_AREA = (addr >> 12) & 0xF; - if (PRG_AREA_BLK_RAM[PRG_TMP_AREA]) - { - PRG_TMP_INDX = PRG_AREA_BLK_INDEX[PRG_TMP_AREA] & PRG_RAM_04KB_Mask; - if (PRG_RAM_ENABLED[PRG_TMP_INDX] && PRG_RAM_WRITABLE[PRG_TMP_INDX]) - { - PRG_RAM[PRG_TMP_INDX][addr & 0xFFF] = val; - } - } - } - - internal virtual void WriteSRM(ref ushort addr, ref byte val) - { - PRG_TMP_AREA = (addr >> 12) & 0xF; - if (PRG_AREA_BLK_RAM[PRG_TMP_AREA]) - { - PRG_TMP_INDX = PRG_AREA_BLK_INDEX[PRG_TMP_AREA] & PRG_RAM_04KB_Mask; - if (PRG_RAM_ENABLED[PRG_TMP_INDX] && PRG_RAM_WRITABLE[PRG_TMP_INDX]) - { - PRG_RAM[PRG_TMP_INDX][addr & 0xFFF] = val; - } - } - } - - internal virtual void WritePRG(ref ushort addr, ref byte val) - { - PRG_TMP_AREA = (addr >> 12) & 0xF; - if (PRG_AREA_BLK_RAM[PRG_TMP_AREA]) - { - PRG_TMP_INDX = PRG_AREA_BLK_INDEX[PRG_TMP_AREA] & PRG_RAM_04KB_Mask; - if (PRG_RAM_ENABLED[PRG_TMP_INDX] && PRG_RAM_WRITABLE[PRG_TMP_INDX]) - { - PRG_RAM[PRG_TMP_INDX][addr & 0xFFF] = val; - } - } - } - - internal virtual void ReadEX(ref ushort addr, out byte val) - { - PRG_TMP_AREA = (addr >> 12) & 0xF; - if (PRG_AREA_BLK_RAM[PRG_TMP_AREA]) - { - PRG_TMP_INDX = PRG_AREA_BLK_INDEX[PRG_TMP_AREA] & PRG_RAM_04KB_Mask; - if (PRG_RAM_ENABLED[PRG_TMP_INDX]) - { - val = PRG_RAM[PRG_TMP_INDX][addr & 0xFFF]; - } - else - { - val = 0; - } - } - else - { - PRG_TMP_INDX = PRG_AREA_BLK_INDEX[PRG_TMP_AREA] & PRG_ROM_04KB_Mask; - val = PRG_ROM[PRG_TMP_INDX][addr & 0xFFF]; - } - } - - internal virtual void ReadSRM(ref ushort addr, out byte val) - { - PRG_TMP_AREA = (addr >> 12) & 0xF; - if (PRG_AREA_BLK_RAM[PRG_TMP_AREA]) - { - PRG_TMP_INDX = PRG_AREA_BLK_INDEX[PRG_TMP_AREA] & PRG_RAM_04KB_Mask; - if (PRG_RAM_ENABLED[PRG_TMP_INDX]) - { - val = PRG_RAM[PRG_TMP_INDX][addr & 0xFFF]; - } - else - { - val = 0; - } - } - else - { - PRG_TMP_INDX = PRG_AREA_BLK_INDEX[PRG_TMP_AREA] & PRG_ROM_04KB_Mask; - val = PRG_ROM[PRG_TMP_INDX][addr & 0xFFF]; - } - } - - internal virtual void ReadPRG(ref ushort addr, out byte val) - { - PRG_TMP_AREA = (addr >> 12) & 0xF; - if (PRG_AREA_BLK_RAM[PRG_TMP_AREA]) - { - PRG_TMP_INDX = PRG_AREA_BLK_INDEX[PRG_TMP_AREA] & PRG_RAM_04KB_Mask; - if (PRG_RAM_ENABLED[PRG_TMP_INDX]) - { - val = PRG_RAM[PRG_TMP_INDX][addr & 0xFFF]; - } - else - { - val = 0; - } - } - else - { - PRG_TMP_INDX = PRG_AREA_BLK_INDEX[PRG_TMP_AREA] & PRG_ROM_04KB_Mask; - val = PRG_ROM[PRG_TMP_INDX][addr & 0xFFF]; - } - if (!IsGameGenieActive) - { - return; - } - GameGenieCode[] gameGenieCodes = GameGenieCodes; - for (int i = 0; i < gameGenieCodes.Length; i++) - { - GameGenieCode gameGenieCode = gameGenieCodes[i]; - if (!gameGenieCode.Enabled || gameGenieCode.Address != addr) - { - continue; - } - if (gameGenieCode.IsCompare) - { - if (gameGenieCode.Compare == val) - { - val = gameGenieCode.Value; - } - } - else - { - val = gameGenieCode.Value; - } - break; - } - } - - internal virtual void WriteCHR(ref ushort addr, ref byte val) - { - CHR_TMP_AREA = (addr >> 10) & 7; - if (CHR_AREA_BLK_RAM[CHR_TMP_AREA]) - { - CHR_TMP_INDX = CHR_AREA_BLK_INDEX[CHR_TMP_AREA] & CHR_RAM_01KB_Mask; - if (CHR_RAM_ENABLED[CHR_TMP_INDX] && CHR_RAM_WRITABLE[CHR_TMP_INDX]) - { - CHR_RAM[CHR_TMP_INDX][addr & 0x3FF] = val; - } - } - } - - internal virtual void ReadCHR(ref ushort addr, out byte val) - { - CHR_TMP_AREA = (addr >> 10) & 7; - CHR_TMP_INDX = CHR_AREA_BLK_INDEX[CHR_TMP_AREA]; - if (CHR_AREA_BLK_RAM[CHR_TMP_AREA]) - { - CHR_TMP_INDX &= CHR_RAM_01KB_Mask; - if (CHR_RAM_ENABLED[CHR_TMP_INDX]) - { - val = CHR_RAM[CHR_TMP_INDX][addr & 0x3FF]; - } - else - { - val = 0; - } - } - else - { - CHR_TMP_INDX &= CHR_ROM_01KB_Mask; - val = CHR_ROM[CHR_TMP_INDX][addr & 0x3FF]; - } - } - - internal virtual void WriteNMT(ref ushort addr, ref byte val) - { - NMT_TMP_AREA = (addr >> 10) & 3; - NMT_TMP_INDX = NMT_AREA_BLK_INDEX[NMT_TMP_AREA]; - NMT_RAM[NMT_TMP_INDX][addr & 0x3FF] = val; - } - - internal virtual void ReadNMT(ref ushort addr, out byte val) - { - NMT_TMP_AREA = (addr >> 10) & 3; - NMT_TMP_INDX = NMT_AREA_BLK_INDEX[NMT_TMP_AREA]; - val = NMT_RAM[NMT_TMP_INDX][addr & 0x3FF]; - } - - protected void Switch04KPRG(int index, PRGArea area) - { - PRG_AREA_BLK_INDEX[(uint)area] = index; - } - - protected void Switch08KPRG(int index, PRGArea area) - { - index *= 2; - PRG_AREA_BLK_INDEX[(uint)area] = index; - PRG_AREA_BLK_INDEX[(uint)(area + 1)] = index + 1; - } - - protected void Switch16KPRG(int index, PRGArea area) - { - index *= 4; - PRG_AREA_BLK_INDEX[(uint)area] = index; - PRG_AREA_BLK_INDEX[(uint)(area + 1)] = index + 1; - PRG_AREA_BLK_INDEX[(uint)(area + 2)] = index + 2; - PRG_AREA_BLK_INDEX[(uint)(area + 3)] = index + 3; - } - - protected void Switch32KPRG(int index, PRGArea area) - { - index *= 8; - PRG_AREA_BLK_INDEX[(uint)area] = index; - PRG_AREA_BLK_INDEX[(uint)(area + 1)] = index + 1; - PRG_AREA_BLK_INDEX[(uint)(area + 2)] = index + 2; - PRG_AREA_BLK_INDEX[(uint)(area + 3)] = index + 3; - PRG_AREA_BLK_INDEX[(uint)(area + 4)] = index + 4; - PRG_AREA_BLK_INDEX[(uint)(area + 5)] = index + 5; - PRG_AREA_BLK_INDEX[(uint)(area + 6)] = index + 6; - PRG_AREA_BLK_INDEX[(uint)(area + 7)] = index + 7; - } - - protected void Toggle04KPRG_RAM(bool ram, PRGArea area) - { - PRG_AREA_BLK_RAM[(uint)area] = ram; - } - - protected void Toggle08KPRG_RAM(bool ram, PRGArea area) - { - PRG_AREA_BLK_RAM[(uint)area] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 1)] = ram; - } - - protected void Toggle16KPRG_RAM(bool ram, PRGArea area) - { - PRG_AREA_BLK_RAM[(uint)area] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 1)] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 2)] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 3)] = ram; - } - - protected void Toggle32KPRG_RAM(bool ram, PRGArea area) - { - PRG_AREA_BLK_RAM[(uint)area] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 1)] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 2)] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 3)] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 4)] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 5)] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 6)] = ram; - PRG_AREA_BLK_RAM[(uint)(area + 7)] = ram; - } - - protected void TogglePRGRAMEnable(bool enable) - { - for (int i = 0; i < PRG_RAM_ENABLED.Length; i++) - { - PRG_RAM_ENABLED[i] = enable; - } - } - - protected void TogglePRGRAMWritableEnable(bool enable) - { - for (int i = 0; i < PRG_RAM_WRITABLE.Length; i++) - { - PRG_RAM_WRITABLE[i] = enable; - } - } - - protected void Toggle04KPRG_RAM_Enabled(bool enable, int index) - { - PRG_RAM_ENABLED[index] = enable; - } - - protected void Toggle04KPRG_RAM_Writable(bool enable, int index) - { - PRG_RAM_WRITABLE[index] = enable; - } - - protected void Toggle04KPRG_RAM_Battery(bool enable, int index) - { - PRG_RAM_BATTERY[index] = enable; - } - - protected void Switch01KCHR(int index, CHRArea area) - { - CHR_AREA_BLK_INDEX[(uint)area] = index; - } - - protected void Switch02KCHR(int index, CHRArea area) - { - index *= 2; - CHR_AREA_BLK_INDEX[(uint)area] = index; - CHR_AREA_BLK_INDEX[(uint)(area + 1)] = index + 1; - } - - protected void Switch04KCHR(int index, CHRArea area) - { - index *= 4; - CHR_AREA_BLK_INDEX[(uint)area] = index; - CHR_AREA_BLK_INDEX[(uint)(area + 1)] = index + 1; - CHR_AREA_BLK_INDEX[(uint)(area + 2)] = index + 2; - CHR_AREA_BLK_INDEX[(uint)(area + 3)] = index + 3; - } - - protected void Switch08KCHR(int index) - { - index *= 8; - CHR_AREA_BLK_INDEX[0] = index; - CHR_AREA_BLK_INDEX[1] = index + 1; - CHR_AREA_BLK_INDEX[2] = index + 2; - CHR_AREA_BLK_INDEX[3] = index + 3; - CHR_AREA_BLK_INDEX[4] = index + 4; - CHR_AREA_BLK_INDEX[5] = index + 5; - CHR_AREA_BLK_INDEX[6] = index + 6; - CHR_AREA_BLK_INDEX[7] = index + 7; - } - - protected void Toggle01KCHR_RAM(bool ram, CHRArea area) - { - CHR_AREA_BLK_RAM[(uint)area] = ram; - } - - protected void Toggle02KCHR_RAM(bool ram, CHRArea area) - { - CHR_AREA_BLK_RAM[(uint)area] = ram; - CHR_AREA_BLK_RAM[(uint)(area + 1)] = ram; - } - - protected void Toggle04KCHR_RAM(bool ram, CHRArea area) - { - CHR_AREA_BLK_RAM[(uint)area] = ram; - CHR_AREA_BLK_RAM[(uint)(area + 1)] = ram; - CHR_AREA_BLK_RAM[(uint)(area + 2)] = ram; - CHR_AREA_BLK_RAM[(uint)(area + 3)] = ram; - } - - protected void Toggle08KCHR_RAM(bool ram) - { - CHR_AREA_BLK_RAM[0] = ram; - CHR_AREA_BLK_RAM[1] = ram; - CHR_AREA_BLK_RAM[2] = ram; - CHR_AREA_BLK_RAM[3] = ram; - CHR_AREA_BLK_RAM[4] = ram; - CHR_AREA_BLK_RAM[5] = ram; - CHR_AREA_BLK_RAM[6] = ram; - CHR_AREA_BLK_RAM[7] = ram; - } - - protected void Toggle01KCHR_RAM_Enabled(bool enable, int index) - { - CHR_RAM_ENABLED[index] = enable; - } - - protected void Toggle01KCHR_RAM_Writable(bool enable, int index) - { - CHR_RAM_WRITABLE[index] = enable; - } - - protected void ToggleCHRRAMWritableEnable(bool enable) - { - for (int i = 0; i < CHR_RAM_WRITABLE.Length; i++) - { - CHR_RAM_WRITABLE[i] = enable; - } - } - - protected void Toggle01KCHR_RAM_Battery(bool enable, int index) - { - CHR_RAM_BATTERY[index] = enable; - } - - protected void Switch01KNMT(int index, byte area) - { - NMT_AREA_BLK_INDEX[area] = index; - } - - protected void Switch01KNMT(byte mirroring) - { - NMT_AREA_BLK_INDEX[0] = mirroring & 3; - NMT_AREA_BLK_INDEX[1] = (mirroring >> 2) & 3; - NMT_AREA_BLK_INDEX[2] = (mirroring >> 4) & 3; - NMT_AREA_BLK_INDEX[3] = (mirroring >> 6) & 3; - } - - protected void Switch01KNMTFromMirroring(Mirroring mirroring) - { - NMT_AREA_BLK_INDEX[0] = (int)(mirroring & (Mirroring)3); - NMT_AREA_BLK_INDEX[1] = ((int)mirroring >> 2) & 3; - NMT_AREA_BLK_INDEX[2] = ((int)mirroring >> 4) & 3; - NMT_AREA_BLK_INDEX[3] = ((int)mirroring >> 6) & 3; - } - - internal virtual void OnPPUAddressUpdate(ref ushort address) - { - if (!enabled_ppuA12ToggleTimer) - { - return; - } - old_vram_address = new_vram_address; - new_vram_address = address & 0x1000; - if (ppuA12TogglesOnRaisingEdge) - { - if (old_vram_address < new_vram_address) - { - if (ppu_cycles_timer > 8) - { - OnPPUA12RaisingEdge(); - } - ppu_cycles_timer = 0; - } - } - else if (old_vram_address > new_vram_address) - { - if (ppu_cycles_timer > 8) - { - OnPPUA12RaisingEdge(); - } - ppu_cycles_timer = 0; - } - } - - internal virtual void OnCPUClock() - { - } - - internal virtual void OnPPUClock() - { - if (enabled_ppuA12ToggleTimer) - { - ppu_cycles_timer++; - } - } - - internal virtual void OnPPUA12RaisingEdge() - { - } - - internal virtual void OnPPUScanlineTick() - { - } - - internal virtual void OnAPUClockDuration() - { - } - - internal virtual void OnAPUClockEnvelope() - { - } - - internal virtual void OnAPUClockSingle() - { - } - - internal virtual void OnAPUClock() - { - } - - internal virtual double APUGetSample() - { - return 0.0; - } - - internal virtual void APUApplyChannelsSettings() - { - } - - internal void SetupGameGenie(bool IsGameGenieActive, GameGenieCode[] GameGenieCodes) - { - this.IsGameGenieActive = IsGameGenieActive; - this.GameGenieCodes = GameGenieCodes; - } - - internal virtual void WriteStateData(ref BinaryWriter bin) - { - for (int i = 0; i < PRG_RAM.Length; i++) - { - bin.Write(PRG_RAM[i]); - } - for (int j = 0; j < PRG_RAM_ENABLED.Length; j++) - { - bin.Write(PRG_RAM_ENABLED[j]); - } - for (int k = 0; k < PRG_RAM_WRITABLE.Length; k++) - { - bin.Write(PRG_RAM_WRITABLE[k]); - } - for (int l = 0; l < PRG_RAM_BATTERY.Length; l++) - { - bin.Write(PRG_RAM_BATTERY[l]); - } - for (int m = 0; m < PRG_AREA_BLK_RAM.Length; m++) - { - bin.Write(PRG_AREA_BLK_RAM[m]); - } - for (int n = 0; n < PRG_AREA_BLK_INDEX.Length; n++) - { - bin.Write(PRG_AREA_BLK_INDEX[n]); - } - bin.Write(PRG_TMP_INDX); - bin.Write(PRG_TMP_AREA); - for (int num = 0; num < CHR_RAM.Length; num++) - { - bin.Write(CHR_RAM[num]); - } - for (int num2 = 0; num2 < CHR_RAM_ENABLED.Length; num2++) - { - bin.Write(CHR_RAM_ENABLED[num2]); - } - for (int num3 = 0; num3 < CHR_RAM_WRITABLE.Length; num3++) - { - bin.Write(CHR_RAM_WRITABLE[num3]); - } - for (int num4 = 0; num4 < CHR_RAM_BATTERY.Length; num4++) - { - bin.Write(CHR_RAM_BATTERY[num4]); - } - for (int num5 = 0; num5 < CHR_AREA_BLK_RAM.Length; num5++) - { - bin.Write(CHR_AREA_BLK_RAM[num5]); - } - for (int num6 = 0; num6 < CHR_AREA_BLK_INDEX.Length; num6++) - { - bin.Write(CHR_AREA_BLK_INDEX[num6]); - } - bin.Write(CHR_TMP_INDX); - bin.Write(CHR_TMP_AREA); - for (int num7 = 0; num7 < NMT_RAM.Length; num7++) - { - bin.Write(NMT_RAM[num7]); - } - for (int num8 = 0; num8 < NMT_AREA_BLK_INDEX.Length; num8++) - { - bin.Write(NMT_AREA_BLK_INDEX[num8]); - } - bin.Write(NMT_TMP_INDX); - bin.Write(NMT_TMP_AREA); - } - - internal virtual void ReadStateData(ref BinaryReader bin) - { - for (int i = 0; i < PRG_RAM.Length; i++) - { - bin.Read(PRG_RAM[i], 0, PRG_RAM[i].Length); - } - for (int j = 0; j < PRG_RAM_ENABLED.Length; j++) - { - PRG_RAM_ENABLED[j] = bin.ReadBoolean(); - } - for (int k = 0; k < PRG_RAM_WRITABLE.Length; k++) - { - PRG_RAM_WRITABLE[k] = bin.ReadBoolean(); - } - for (int l = 0; l < PRG_RAM_BATTERY.Length; l++) - { - PRG_RAM_BATTERY[l] = bin.ReadBoolean(); - } - for (int m = 0; m < PRG_AREA_BLK_RAM.Length; m++) - { - PRG_AREA_BLK_RAM[m] = bin.ReadBoolean(); - } - for (int n = 0; n < PRG_AREA_BLK_INDEX.Length; n++) - { - PRG_AREA_BLK_INDEX[n] = bin.ReadInt32(); - } - PRG_TMP_INDX = bin.ReadInt32(); - PRG_TMP_AREA = bin.ReadInt32(); - for (int num = 0; num < CHR_RAM.Length; num++) - { - bin.Read(CHR_RAM[num], 0, CHR_RAM[num].Length); - } - for (int num2 = 0; num2 < CHR_RAM_ENABLED.Length; num2++) - { - CHR_RAM_ENABLED[num2] = bin.ReadBoolean(); - } - for (int num3 = 0; num3 < CHR_RAM_WRITABLE.Length; num3++) - { - CHR_RAM_WRITABLE[num3] = bin.ReadBoolean(); - } - for (int num4 = 0; num4 < CHR_RAM_BATTERY.Length; num4++) - { - CHR_RAM_BATTERY[num4] = bin.ReadBoolean(); - } - for (int num5 = 0; num5 < CHR_AREA_BLK_RAM.Length; num5++) - { - CHR_AREA_BLK_RAM[num5] = bin.ReadBoolean(); - } - for (int num6 = 0; num6 < CHR_AREA_BLK_INDEX.Length; num6++) - { - CHR_AREA_BLK_INDEX[num6] = bin.ReadInt32(); - } - CHR_TMP_INDX = bin.ReadInt32(); - CHR_TMP_AREA = bin.ReadInt32(); - for (int num7 = 0; num7 < NMT_RAM.Length; num7++) - { - bin.Read(NMT_RAM[num7], 0, NMT_RAM[num7].Length); - } - for (int num8 = 0; num8 < NMT_AREA_BLK_INDEX.Length; num8++) - { - NMT_AREA_BLK_INDEX[num8] = bin.ReadInt32(); - } - NMT_TMP_INDX = bin.ReadInt32(); - NMT_TMP_AREA = bin.ReadInt32(); - } - - internal void SaveSRAM(Stream stream) - { - for (int i = 0; i < PRG_RAM_04KB_Count; i++) - { - if (PRG_RAM_BATTERY[i]) - { - stream.Write(PRG_RAM[i], 0, 4096); - } - } - } - - internal byte[] GetSRAMBuffer() - { - List list = new List(); - for (int i = 0; i < PRG_RAM_04KB_Count; i++) - { - if (PRG_RAM_BATTERY[i]) - { - list.AddRange(PRG_RAM[i]); - } - } - return list.ToArray(); - } - - internal void LoadSRAM(Stream stream) - { - for (int i = 0; i < PRG_RAM_04KB_Count; i++) - { - if (PRG_RAM_BATTERY[i]) - { - stream.Read(PRG_RAM[i], 0, 4096); - } - } - } - - internal void LoadSRAM(byte[] buffer) - { - int num = 0; - for (int i = 0; i < PRG_RAM_04KB_Count; i++) - { - if (PRG_RAM_BATTERY[i]) - { - for (int j = 0; j < 4096; j++) - { - PRG_RAM[i][j] = buffer[j + num]; - } - num += 4096; - } - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Board.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Board.cs.meta deleted file mode 100644 index 633023e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Board.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a649aa2f72c13234481b8a2db2b101f8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoAttribute.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoAttribute.cs deleted file mode 100644 index 7ca8060..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoAttribute.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class BoardInfoAttribute : Attribute - { - public string Name { get; private set; } - - public int Mapper { get; private set; } - - public int DefaultPRG_RAM_8KB_BanksCount { get; private set; } - - public int DefaultCHR_RAM_1KB_BanksCount { get; private set; } - - public bool Enabled_ppuA12ToggleTimer { get; private set; } - - public bool PPUA12TogglesOnRaisingEdge { get; private set; } - - public BoardInfoAttribute(string boardName, int inesMapperNumber) - { - Name = boardName; - Mapper = inesMapperNumber; - DefaultPRG_RAM_8KB_BanksCount = 1; - DefaultCHR_RAM_1KB_BanksCount = 8; - Enabled_ppuA12ToggleTimer = (PPUA12TogglesOnRaisingEdge = false); - } - - public BoardInfoAttribute(string boardName, int inesMapperNumber, int defaultPRG_RAM_8KB_BanksCount, int defaultCHR_RAM_1KB_BanksCount) - { - Name = boardName; - Mapper = inesMapperNumber; - DefaultPRG_RAM_8KB_BanksCount = defaultPRG_RAM_8KB_BanksCount; - DefaultCHR_RAM_1KB_BanksCount = defaultCHR_RAM_1KB_BanksCount; - Enabled_ppuA12ToggleTimer = (PPUA12TogglesOnRaisingEdge = false); - } - - public BoardInfoAttribute(string boardName, int inesMapperNumber, bool Enabled_ppuA12ToggleTimer, bool PPUA12TogglesOnRaisingEdge) - { - Name = boardName; - Mapper = inesMapperNumber; - DefaultPRG_RAM_8KB_BanksCount = 1; - DefaultCHR_RAM_1KB_BanksCount = 8; - this.Enabled_ppuA12ToggleTimer = Enabled_ppuA12ToggleTimer; - this.PPUA12TogglesOnRaisingEdge = PPUA12TogglesOnRaisingEdge; - } - - public BoardInfoAttribute(string boardName, int inesMapperNumber, int defaultPRG_RAM_8KB_BanksCount, int defaultCHR_RAM_1KB_BanksCount, bool Enabled_ppuA12ToggleTimer, bool PPUA12TogglesOnRaisingEdge) - { - Name = boardName; - Mapper = inesMapperNumber; - DefaultPRG_RAM_8KB_BanksCount = defaultPRG_RAM_8KB_BanksCount; - DefaultCHR_RAM_1KB_BanksCount = defaultCHR_RAM_1KB_BanksCount; - this.Enabled_ppuA12ToggleTimer = Enabled_ppuA12ToggleTimer; - this.PPUA12TogglesOnRaisingEdge = PPUA12TogglesOnRaisingEdge; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoAttribute.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoAttribute.cs.meta deleted file mode 100644 index 1b46dc5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoAttribute.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 42db8567eb222464faed6061346980df -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoObject.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoObject.cs deleted file mode 100644 index bf1d238..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoObject.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class BoardInfoObject - { - public string Name { get; internal set; } - - public int MapperNumber { get; internal set; } - - public bool IsSupported { get; internal set; } - - public string Issues { get; internal set; } - - public bool HasIssues { get; internal set; } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoObject.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoObject.cs.meta deleted file mode 100644 index 35a33db..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BoardInfoObject.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 02faf494147d32b4d9288978c3ae6145 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/CHRArea.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/CHRArea.cs deleted file mode 100644 index 7d9637b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/CHRArea.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace MyNes.Core -{ - internal enum CHRArea : byte - { - Area0000, - Area0400, - Area0800, - Area0C00, - Area1000, - Area1400, - Area1800, - Area1C00 - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/CHRArea.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/CHRArea.cs.meta deleted file mode 100644 index 6fd0dbe..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/CHRArea.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 682bde94b329bbe40bca1f57566c3bdd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Adler32.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Adler32.cs deleted file mode 100644 index 3a6fcd5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Adler32.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace ComponentAce.Compression.Libs.zlib -{ - internal sealed class Adler32 - { - private const int BASE = 65521; - - private const int NMAX = 5552; - - internal long adler32(long adler, byte[] buf, int index, int len) - { - if (buf == null) - { - return 1L; - } - long num = adler & 0xFFFF; - long num2 = (adler >> 16) & 0xFFFF; - while (len > 0) - { - int num3 = ((len < 5552) ? len : 5552); - len -= num3; - while (num3 >= 16) - { - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num += buf[index++] & 0xFF; - num2 += num; - num3 -= 16; - } - if (num3 != 0) - { - do - { - num += buf[index++] & 0xFF; - num2 += num; - } - while (--num3 != 0); - } - num %= 65521; - num2 %= 65521; - } - return (num2 << 16) | num; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Adler32.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Adler32.cs.meta deleted file mode 100644 index 17aacb1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Adler32.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5f0afef237e01da488c3afdb23b495d4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Deflate.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Deflate.cs deleted file mode 100644 index 9272bee..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Deflate.cs +++ /dev/null @@ -1,1412 +0,0 @@ -using System; - -namespace ComponentAce.Compression.Libs.zlib -{ - public sealed class Deflate - { - internal class Config - { - internal int good_length; - - internal int max_lazy; - - internal int nice_length; - - internal int max_chain; - - internal int func; - - internal Config(int good_length, int max_lazy, int nice_length, int max_chain, int func) - { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; - } - } - - private const int MAX_MEM_LEVEL = 9; - - private const int Z_DEFAULT_COMPRESSION = -1; - - private const int MAX_WBITS = 15; - - private const int DEF_MEM_LEVEL = 8; - - private const int STORED = 0; - - private const int FAST = 1; - - private const int SLOW = 2; - - private static Config[] config_table; - - private static readonly string[] z_errmsg; - - private const int NeedMore = 0; - - private const int BlockDone = 1; - - private const int FinishStarted = 2; - - private const int FinishDone = 3; - - private const int PRESET_DICT = 32; - - private const int Z_FILTERED = 1; - - private const int Z_HUFFMAN_ONLY = 2; - - private const int Z_DEFAULT_STRATEGY = 0; - - private const int Z_NO_FLUSH = 0; - - private const int Z_PARTIAL_FLUSH = 1; - - private const int Z_SYNC_FLUSH = 2; - - private const int Z_FULL_FLUSH = 3; - - private const int Z_FINISH = 4; - - private const int Z_OK = 0; - - private const int Z_STREAM_END = 1; - - private const int Z_NEED_DICT = 2; - - private const int Z_ERRNO = -1; - - private const int Z_STREAM_ERROR = -2; - - private const int Z_DATA_ERROR = -3; - - private const int Z_MEM_ERROR = -4; - - private const int Z_BUF_ERROR = -5; - - private const int Z_VERSION_ERROR = -6; - - private const int INIT_STATE = 42; - - private const int BUSY_STATE = 113; - - private const int FINISH_STATE = 666; - - private const int Z_DEFLATED = 8; - - private const int STORED_BLOCK = 0; - - private const int STATIC_TREES = 1; - - private const int DYN_TREES = 2; - - private const int Z_BINARY = 0; - - private const int Z_ASCII = 1; - - private const int Z_UNKNOWN = 2; - - private const int Buf_size = 16; - - private const int REP_3_6 = 16; - - private const int REPZ_3_10 = 17; - - private const int REPZ_11_138 = 18; - - private const int MIN_MATCH = 3; - - private const int MAX_MATCH = 258; - - private static readonly int MIN_LOOKAHEAD; - - private const int MAX_BITS = 15; - - private const int D_CODES = 30; - - private const int BL_CODES = 19; - - private const int LENGTH_CODES = 29; - - private const int LITERALS = 256; - - private static readonly int L_CODES; - - private static readonly int HEAP_SIZE; - - private const int END_BLOCK = 256; - - internal ZStream strm; - - internal int status; - - internal byte[] pending_buf; - - internal int pending_buf_size; - - internal int pending_out; - - internal int pending; - - internal int noheader; - - internal byte data_type; - - internal byte method; - - internal int last_flush; - - internal int w_size; - - internal int w_bits; - - internal int w_mask; - - internal byte[] window; - - internal int window_size; - - internal short[] prev; - - internal short[] head; - - internal int ins_h; - - internal int hash_size; - - internal int hash_bits; - - internal int hash_mask; - - internal int hash_shift; - - internal int block_start; - - internal int match_length; - - internal int prev_match; - - internal int match_available; - - internal int strstart; - - internal int match_start; - - internal int lookahead; - - internal int prev_length; - - internal int max_chain_length; - - internal int max_lazy_match; - - internal int level; - - internal int strategy; - - internal int good_match; - - internal int nice_match; - - internal short[] dyn_ltree; - - internal short[] dyn_dtree; - - internal short[] bl_tree; - - internal Tree l_desc = new Tree(); - - internal Tree d_desc = new Tree(); - - internal Tree bl_desc = new Tree(); - - internal short[] bl_count = new short[16]; - - internal int[] heap = new int[2 * L_CODES + 1]; - - internal int heap_len; - - internal int heap_max; - - internal byte[] depth = new byte[2 * L_CODES + 1]; - - internal int l_buf; - - internal int lit_bufsize; - - internal int last_lit; - - internal int d_buf; - - internal int opt_len; - - internal int static_len; - - internal int matches; - - internal int last_eob_len; - - internal short bi_buf; - - internal int bi_valid; - - internal Deflate() - { - dyn_ltree = new short[HEAP_SIZE * 2]; - dyn_dtree = new short[122]; - bl_tree = new short[78]; - } - - internal void lm_init() - { - window_size = 2 * w_size; - head[hash_size - 1] = 0; - for (int i = 0; i < hash_size - 1; i++) - { - head[i] = 0; - } - max_lazy_match = config_table[level].max_lazy; - good_match = config_table[level].good_length; - nice_match = config_table[level].nice_length; - max_chain_length = config_table[level].max_chain; - strstart = 0; - block_start = 0; - lookahead = 0; - match_length = (prev_length = 2); - match_available = 0; - ins_h = 0; - } - - internal void tr_init() - { - l_desc.dyn_tree = dyn_ltree; - l_desc.stat_desc = StaticTree.static_l_desc; - d_desc.dyn_tree = dyn_dtree; - d_desc.stat_desc = StaticTree.static_d_desc; - bl_desc.dyn_tree = bl_tree; - bl_desc.stat_desc = StaticTree.static_bl_desc; - bi_buf = 0; - bi_valid = 0; - last_eob_len = 8; - init_block(); - } - - internal void init_block() - { - for (int i = 0; i < L_CODES; i++) - { - dyn_ltree[i * 2] = 0; - } - for (int j = 0; j < 30; j++) - { - dyn_dtree[j * 2] = 0; - } - for (int k = 0; k < 19; k++) - { - bl_tree[k * 2] = 0; - } - dyn_ltree[512] = 1; - opt_len = (static_len = 0); - last_lit = (matches = 0); - } - - internal void pqdownheap(short[] tree, int k) - { - int num = heap[k]; - for (int num2 = k << 1; num2 <= heap_len; num2 <<= 1) - { - if (num2 < heap_len && smaller(tree, heap[num2 + 1], heap[num2], depth)) - { - num2++; - } - if (smaller(tree, num, heap[num2], depth)) - { - break; - } - heap[k] = heap[num2]; - k = num2; - } - heap[k] = num; - } - - internal static bool smaller(short[] tree, int n, int m, byte[] depth) - { - if (tree[n * 2] >= tree[m * 2]) - { - if (tree[n * 2] == tree[m * 2]) - { - return depth[n] <= depth[m]; - } - return false; - } - return true; - } - - internal void scan_tree(short[] tree, int max_code) - { - int num = -1; - int num2 = tree[1]; - int num3 = 0; - int num4 = 7; - int num5 = 4; - if (num2 == 0) - { - num4 = 138; - num5 = 3; - } - tree[(max_code + 1) * 2 + 1] = (short)SupportClass.Identity(65535L); - for (int i = 0; i <= max_code; i++) - { - int num6 = num2; - num2 = tree[(i + 1) * 2 + 1]; - if (++num3 < num4 && num6 == num2) - { - continue; - } - if (num3 < num5) - { - bl_tree[num6 * 2] = (short)(bl_tree[num6 * 2] + num3); - } - else if (num6 != 0) - { - if (num6 != num) - { - bl_tree[num6 * 2]++; - } - bl_tree[32]++; - } - else if (num3 <= 10) - { - bl_tree[34]++; - } - else - { - bl_tree[36]++; - } - num3 = 0; - num = num6; - if (num2 == 0) - { - num4 = 138; - num5 = 3; - } - else if (num6 == num2) - { - num4 = 6; - num5 = 3; - } - else - { - num4 = 7; - num5 = 4; - } - } - } - - internal int build_bl_tree() - { - scan_tree(dyn_ltree, l_desc.max_code); - scan_tree(dyn_dtree, d_desc.max_code); - bl_desc.build_tree(this); - int num = 18; - while (num >= 3 && bl_tree[Tree.bl_order[num] * 2 + 1] == 0) - { - num--; - } - opt_len += 3 * (num + 1) + 5 + 5 + 4; - return num; - } - - internal void send_all_trees(int lcodes, int dcodes, int blcodes) - { - send_bits(lcodes - 257, 5); - send_bits(dcodes - 1, 5); - send_bits(blcodes - 4, 4); - for (int i = 0; i < blcodes; i++) - { - send_bits(bl_tree[Tree.bl_order[i] * 2 + 1], 3); - } - send_tree(dyn_ltree, lcodes - 1); - send_tree(dyn_dtree, dcodes - 1); - } - - internal void send_tree(short[] tree, int max_code) - { - int num = -1; - int num2 = tree[1]; - int num3 = 0; - int num4 = 7; - int num5 = 4; - if (num2 == 0) - { - num4 = 138; - num5 = 3; - } - for (int i = 0; i <= max_code; i++) - { - int num6 = num2; - num2 = tree[(i + 1) * 2 + 1]; - if (++num3 < num4 && num6 == num2) - { - continue; - } - if (num3 < num5) - { - do - { - send_code(num6, bl_tree); - } - while (--num3 != 0); - } - else if (num6 != 0) - { - if (num6 != num) - { - send_code(num6, bl_tree); - num3--; - } - send_code(16, bl_tree); - send_bits(num3 - 3, 2); - } - else if (num3 <= 10) - { - send_code(17, bl_tree); - send_bits(num3 - 3, 3); - } - else - { - send_code(18, bl_tree); - send_bits(num3 - 11, 7); - } - num3 = 0; - num = num6; - if (num2 == 0) - { - num4 = 138; - num5 = 3; - } - else if (num6 == num2) - { - num4 = 6; - num5 = 3; - } - else - { - num4 = 7; - num5 = 4; - } - } - } - - internal void put_byte(byte[] p, int start, int len) - { - Array.Copy(p, start, pending_buf, pending, len); - pending += len; - } - - internal void put_byte(byte c) - { - pending_buf[pending++] = c; - } - - internal void put_short(int w) - { - put_byte((byte)w); - put_byte((byte)SupportClass.URShift(w, 8)); - } - - internal void putShortMSB(int b) - { - put_byte((byte)(b >> 8)); - put_byte((byte)b); - } - - internal void send_code(int c, short[] tree) - { - send_bits(tree[c * 2] & 0xFFFF, tree[c * 2 + 1] & 0xFFFF); - } - - internal void send_bits(int value_Renamed, int length) - { - if (bi_valid > 16 - length) - { - bi_buf = (short)((ushort)bi_buf | (ushort)((value_Renamed << bi_valid) & 0xFFFF)); - put_short(bi_buf); - bi_buf = (short)SupportClass.URShift(value_Renamed, 16 - bi_valid); - bi_valid += length - 16; - } - else - { - bi_buf = (short)((ushort)bi_buf | (ushort)((value_Renamed << bi_valid) & 0xFFFF)); - bi_valid += length; - } - } - - internal void _tr_align() - { - send_bits(2, 3); - send_code(256, StaticTree.static_ltree); - bi_flush(); - if (1 + last_eob_len + 10 - bi_valid < 9) - { - send_bits(2, 3); - send_code(256, StaticTree.static_ltree); - bi_flush(); - } - last_eob_len = 7; - } - - internal bool _tr_tally(int dist, int lc) - { - pending_buf[d_buf + last_lit * 2] = (byte)SupportClass.URShift(dist, 8); - pending_buf[d_buf + last_lit * 2 + 1] = (byte)dist; - pending_buf[l_buf + last_lit] = (byte)lc; - last_lit++; - if (dist == 0) - { - dyn_ltree[lc * 2]++; - } - else - { - matches++; - dist--; - dyn_ltree[(Tree._length_code[lc] + 256 + 1) * 2]++; - dyn_dtree[Tree.d_code(dist) * 2]++; - } - if ((last_lit & 0x1FFF) == 0 && level > 2) - { - int num = last_lit * 8; - int num2 = strstart - block_start; - for (int i = 0; i < 30; i++) - { - num = (int)(num + dyn_dtree[i * 2] * (5L + (long)Tree.extra_dbits[i])); - } - num = SupportClass.URShift(num, 3); - if (matches < last_lit / 2 && num < num2 / 2) - { - return true; - } - } - return last_lit == lit_bufsize - 1; - } - - internal void compress_block(short[] ltree, short[] dtree) - { - int num = 0; - if (last_lit != 0) - { - do - { - int num2 = ((pending_buf[d_buf + num * 2] << 8) & 0xFF00) | (pending_buf[d_buf + num * 2 + 1] & 0xFF); - int num3 = pending_buf[l_buf + num] & 0xFF; - num++; - if (num2 == 0) - { - send_code(num3, ltree); - continue; - } - int num4 = Tree._length_code[num3]; - send_code(num4 + 256 + 1, ltree); - int num5 = Tree.extra_lbits[num4]; - if (num5 != 0) - { - num3 -= Tree.base_length[num4]; - send_bits(num3, num5); - } - num2--; - num4 = Tree.d_code(num2); - send_code(num4, dtree); - num5 = Tree.extra_dbits[num4]; - if (num5 != 0) - { - num2 -= Tree.base_dist[num4]; - send_bits(num2, num5); - } - } - while (num < last_lit); - } - send_code(256, ltree); - last_eob_len = ltree[513]; - } - - internal void set_data_type() - { - int i = 0; - int num = 0; - int num2 = 0; - for (; i < 7; i++) - { - num2 += dyn_ltree[i * 2]; - } - for (; i < 128; i++) - { - num += dyn_ltree[i * 2]; - } - for (; i < 256; i++) - { - num2 += dyn_ltree[i * 2]; - } - data_type = (byte)((num2 <= SupportClass.URShift(num, 2)) ? 1u : 0u); - } - - internal void bi_flush() - { - if (bi_valid == 16) - { - put_short(bi_buf); - bi_buf = 0; - bi_valid = 0; - } - else if (bi_valid >= 8) - { - put_byte((byte)bi_buf); - bi_buf = (short)SupportClass.URShift(bi_buf, 8); - bi_valid -= 8; - } - } - - internal void bi_windup() - { - if (bi_valid > 8) - { - put_short(bi_buf); - } - else if (bi_valid > 0) - { - put_byte((byte)bi_buf); - } - bi_buf = 0; - bi_valid = 0; - } - - internal void copy_block(int buf, int len, bool header) - { - bi_windup(); - last_eob_len = 8; - if (header) - { - put_short((short)len); - put_short((short)(~len)); - } - put_byte(window, buf, len); - } - - internal void flush_block_only(bool eof) - { - _tr_flush_block((block_start >= 0) ? block_start : (-1), strstart - block_start, eof); - block_start = strstart; - strm.flush_pending(); - } - - internal int deflate_stored(int flush) - { - int num = 65535; - if (num > pending_buf_size - 5) - { - num = pending_buf_size - 5; - } - while (true) - { - if (lookahead <= 1) - { - fill_window(); - if (lookahead == 0 && flush == 0) - { - return 0; - } - if (lookahead == 0) - { - break; - } - } - strstart += lookahead; - lookahead = 0; - int num2 = block_start + num; - if (strstart == 0 || strstart >= num2) - { - lookahead = strstart - num2; - strstart = num2; - flush_block_only(eof: false); - if (strm.avail_out == 0) - { - return 0; - } - } - if (strstart - block_start >= w_size - MIN_LOOKAHEAD) - { - flush_block_only(eof: false); - if (strm.avail_out == 0) - { - return 0; - } - } - } - flush_block_only(flush == 4); - if (strm.avail_out == 0) - { - if (flush != 4) - { - return 0; - } - return 2; - } - if (flush != 4) - { - return 1; - } - return 3; - } - - internal void _tr_stored_block(int buf, int stored_len, bool eof) - { - send_bits(eof ? 1 : 0, 3); - copy_block(buf, stored_len, header: true); - } - - internal void _tr_flush_block(int buf, int stored_len, bool eof) - { - int num = 0; - int num2; - int num3; - if (level > 0) - { - if (data_type == 2) - { - set_data_type(); - } - l_desc.build_tree(this); - d_desc.build_tree(this); - num = build_bl_tree(); - num2 = SupportClass.URShift(opt_len + 3 + 7, 3); - num3 = SupportClass.URShift(static_len + 3 + 7, 3); - if (num3 <= num2) - { - num2 = num3; - } - } - else - { - num2 = (num3 = stored_len + 5); - } - if (stored_len + 4 <= num2 && buf != -1) - { - _tr_stored_block(buf, stored_len, eof); - } - else if (num3 == num2) - { - send_bits(2 + (eof ? 1 : 0), 3); - compress_block(StaticTree.static_ltree, StaticTree.static_dtree); - } - else - { - send_bits(4 + (eof ? 1 : 0), 3); - send_all_trees(l_desc.max_code + 1, d_desc.max_code + 1, num + 1); - compress_block(dyn_ltree, dyn_dtree); - } - init_block(); - if (eof) - { - bi_windup(); - } - } - - internal void fill_window() - { - do - { - int num = window_size - lookahead - strstart; - int num2; - if (num == 0 && strstart == 0 && lookahead == 0) - { - num = w_size; - } - else if (num == -1) - { - num--; - } - else if (strstart >= w_size + w_size - MIN_LOOKAHEAD) - { - Array.Copy(window, w_size, window, 0, w_size); - match_start -= w_size; - strstart -= w_size; - block_start -= w_size; - num2 = hash_size; - int num3 = num2; - do - { - int num4 = head[--num3] & 0xFFFF; - head[num3] = (short)((num4 >= w_size) ? (num4 - w_size) : 0); - } - while (--num2 != 0); - num2 = w_size; - num3 = num2; - do - { - int num4 = prev[--num3] & 0xFFFF; - prev[num3] = (short)((num4 >= w_size) ? (num4 - w_size) : 0); - } - while (--num2 != 0); - num += w_size; - } - if (strm.avail_in == 0) - { - break; - } - num2 = strm.read_buf(window, strstart + lookahead, num); - lookahead += num2; - if (lookahead >= 3) - { - ins_h = window[strstart] & 0xFF; - ins_h = ((ins_h << hash_shift) ^ (window[strstart + 1] & 0xFF)) & hash_mask; - } - } - while (lookahead < MIN_LOOKAHEAD && strm.avail_in != 0); - } - - internal int deflate_fast(int flush) - { - int num = 0; - while (true) - { - if (lookahead < MIN_LOOKAHEAD) - { - fill_window(); - if (lookahead < MIN_LOOKAHEAD && flush == 0) - { - return 0; - } - if (lookahead == 0) - { - break; - } - } - if (lookahead >= 3) - { - ins_h = ((ins_h << hash_shift) ^ (window[strstart + 2] & 0xFF)) & hash_mask; - num = head[ins_h] & 0xFFFF; - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short)strstart; - } - if (num != 0L && ((strstart - num) & 0xFFFF) <= w_size - MIN_LOOKAHEAD && strategy != 2) - { - match_length = longest_match(num); - } - bool flag; - if (match_length >= 3) - { - flag = _tr_tally(strstart - match_start, match_length - 3); - lookahead -= match_length; - if (match_length <= max_lazy_match && lookahead >= 3) - { - match_length--; - do - { - strstart++; - ins_h = ((ins_h << hash_shift) ^ (window[strstart + 2] & 0xFF)) & hash_mask; - num = head[ins_h] & 0xFFFF; - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short)strstart; - } - while (--match_length != 0); - strstart++; - } - else - { - strstart += match_length; - match_length = 0; - ins_h = window[strstart] & 0xFF; - ins_h = ((ins_h << hash_shift) ^ (window[strstart + 1] & 0xFF)) & hash_mask; - } - } - else - { - flag = _tr_tally(0, window[strstart] & 0xFF); - lookahead--; - strstart++; - } - if (flag) - { - flush_block_only(eof: false); - if (strm.avail_out == 0) - { - return 0; - } - } - } - flush_block_only(flush == 4); - if (strm.avail_out == 0) - { - if (flush == 4) - { - return 2; - } - return 0; - } - if (flush != 4) - { - return 1; - } - return 3; - } - - internal int deflate_slow(int flush) - { - int num = 0; - while (true) - { - if (lookahead < MIN_LOOKAHEAD) - { - fill_window(); - if (lookahead < MIN_LOOKAHEAD && flush == 0) - { - return 0; - } - if (lookahead == 0) - { - break; - } - } - if (lookahead >= 3) - { - ins_h = ((ins_h << hash_shift) ^ (window[strstart + 2] & 0xFF)) & hash_mask; - num = head[ins_h] & 0xFFFF; - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short)strstart; - } - prev_length = match_length; - prev_match = match_start; - match_length = 2; - if (num != 0 && prev_length < max_lazy_match && ((strstart - num) & 0xFFFF) <= w_size - MIN_LOOKAHEAD) - { - if (strategy != 2) - { - match_length = longest_match(num); - } - if (match_length <= 5 && (strategy == 1 || (match_length == 3 && strstart - match_start > 4096))) - { - match_length = 2; - } - } - if (prev_length >= 3 && match_length <= prev_length) - { - int num2 = strstart + lookahead - 3; - bool flag = _tr_tally(strstart - 1 - prev_match, prev_length - 3); - lookahead -= prev_length - 1; - prev_length -= 2; - do - { - if (++strstart <= num2) - { - ins_h = ((ins_h << hash_shift) ^ (window[strstart + 2] & 0xFF)) & hash_mask; - num = head[ins_h] & 0xFFFF; - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short)strstart; - } - } - while (--prev_length != 0); - match_available = 0; - match_length = 2; - strstart++; - if (flag) - { - flush_block_only(eof: false); - if (strm.avail_out == 0) - { - return 0; - } - } - } - else if (match_available != 0) - { - if (_tr_tally(0, window[strstart - 1] & 0xFF)) - { - flush_block_only(eof: false); - } - strstart++; - lookahead--; - if (strm.avail_out == 0) - { - return 0; - } - } - else - { - match_available = 1; - strstart++; - lookahead--; - } - } - if (match_available != 0) - { - bool flag = _tr_tally(0, window[strstart - 1] & 0xFF); - match_available = 0; - } - flush_block_only(flush == 4); - if (strm.avail_out == 0) - { - if (flush == 4) - { - return 2; - } - return 0; - } - if (flush != 4) - { - return 1; - } - return 3; - } - - internal int longest_match(int cur_match) - { - int num = max_chain_length; - int num2 = strstart; - int num3 = prev_length; - int num4 = ((strstart > w_size - MIN_LOOKAHEAD) ? (strstart - (w_size - MIN_LOOKAHEAD)) : 0); - int num5 = nice_match; - int num6 = w_mask; - int num7 = strstart + 258; - byte b = window[num2 + num3 - 1]; - byte b2 = window[num2 + num3]; - if (prev_length >= good_match) - { - num >>= 2; - } - if (num5 > lookahead) - { - num5 = lookahead; - } - do - { - int num8 = cur_match; - if (window[num8 + num3] != b2 || window[num8 + num3 - 1] != b || window[num8] != window[num2] || window[++num8] != window[num2 + 1]) - { - continue; - } - num2 += 2; - num8++; - while (window[++num2] == window[++num8] && window[++num2] == window[++num8] && window[++num2] == window[++num8] && window[++num2] == window[++num8] && window[++num2] == window[++num8] && window[++num2] == window[++num8] && window[++num2] == window[++num8] && window[++num2] == window[++num8] && num2 < num7) - { - } - int num9 = 258 - (num7 - num2); - num2 = num7 - 258; - if (num9 > num3) - { - match_start = cur_match; - num3 = num9; - if (num9 >= num5) - { - break; - } - b = window[num2 + num3 - 1]; - b2 = window[num2 + num3]; - } - } - while ((cur_match = prev[cur_match & num6] & 0xFFFF) > num4 && --num != 0); - if (num3 <= lookahead) - { - return num3; - } - return lookahead; - } - - internal int deflateInit(ZStream strm, int level, int bits) - { - return deflateInit2(strm, level, 8, bits, 8, 0); - } - - internal int deflateInit(ZStream strm, int level) - { - return deflateInit(strm, level, 15); - } - - internal int deflateInit2(ZStream strm, int level, int method, int windowBits, int memLevel, int strategy) - { - int num = 0; - strm.msg = null; - if (level == -1) - { - level = 6; - } - if (windowBits < 0) - { - num = 1; - windowBits = -windowBits; - } - if (memLevel < 1 || memLevel > 9 || method != 8 || windowBits < 9 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > 2) - { - return -2; - } - strm.dstate = this; - noheader = num; - w_bits = windowBits; - w_size = 1 << w_bits; - w_mask = w_size - 1; - hash_bits = memLevel + 7; - hash_size = 1 << hash_bits; - hash_mask = hash_size - 1; - hash_shift = (hash_bits + 3 - 1) / 3; - window = new byte[w_size * 2]; - prev = new short[w_size]; - head = new short[hash_size]; - lit_bufsize = 1 << memLevel + 6; - pending_buf = new byte[lit_bufsize * 4]; - pending_buf_size = lit_bufsize * 4; - d_buf = lit_bufsize; - l_buf = 3 * lit_bufsize; - this.level = level; - this.strategy = strategy; - this.method = (byte)method; - return deflateReset(strm); - } - - internal int deflateReset(ZStream strm) - { - strm.total_in = (strm.total_out = 0L); - strm.msg = null; - strm.data_type = 2; - pending = 0; - pending_out = 0; - if (noheader < 0) - { - noheader = 0; - } - status = ((noheader != 0) ? 113 : 42); - strm.adler = strm._adler.adler32(0L, null, 0, 0); - last_flush = 0; - tr_init(); - lm_init(); - return 0; - } - - internal int deflateEnd() - { - if (status != 42 && status != 113 && status != 666) - { - return -2; - } - pending_buf = null; - head = null; - prev = null; - window = null; - if (status != 113) - { - return 0; - } - return -3; - } - - internal int deflateParams(ZStream strm, int _level, int _strategy) - { - int result = 0; - if (_level == -1) - { - _level = 6; - } - if (_level < 0 || _level > 9 || _strategy < 0 || _strategy > 2) - { - return -2; - } - if (config_table[level].func != config_table[_level].func && strm.total_in != 0L) - { - result = strm.deflate(1); - } - if (level != _level) - { - level = _level; - max_lazy_match = config_table[level].max_lazy; - good_match = config_table[level].good_length; - nice_match = config_table[level].nice_length; - max_chain_length = config_table[level].max_chain; - } - strategy = _strategy; - return result; - } - - internal int deflateSetDictionary(ZStream strm, byte[] dictionary, int dictLength) - { - int num = dictLength; - int sourceIndex = 0; - if (dictionary == null || status != 42) - { - return -2; - } - strm.adler = strm._adler.adler32(strm.adler, dictionary, 0, dictLength); - if (num < 3) - { - return 0; - } - if (num > w_size - MIN_LOOKAHEAD) - { - num = w_size - MIN_LOOKAHEAD; - sourceIndex = dictLength - num; - } - Array.Copy(dictionary, sourceIndex, window, 0, num); - strstart = num; - block_start = num; - ins_h = window[0] & 0xFF; - ins_h = ((ins_h << hash_shift) ^ (window[1] & 0xFF)) & hash_mask; - for (int i = 0; i <= num - 3; i++) - { - ins_h = ((ins_h << hash_shift) ^ (window[i + 2] & 0xFF)) & hash_mask; - prev[i & w_mask] = head[ins_h]; - head[ins_h] = (short)i; - } - return 0; - } - - internal int deflate(ZStream strm, int flush) - { - if (flush > 4 || flush < 0) - { - return -2; - } - if (strm.next_out == null || (strm.next_in == null && strm.avail_in != 0) || (status == 666 && flush != 4)) - { - strm.msg = z_errmsg[4]; - return -2; - } - if (strm.avail_out == 0) - { - strm.msg = z_errmsg[7]; - return -5; - } - this.strm = strm; - int num = last_flush; - last_flush = flush; - if (status == 42) - { - int num2 = 8 + (w_bits - 8 << 4) << 8; - int num3 = ((level - 1) & 0xFF) >> 1; - if (num3 > 3) - { - num3 = 3; - } - num2 |= num3 << 6; - if (strstart != 0) - { - num2 |= 0x20; - } - num2 += 31 - num2 % 31; - status = 113; - putShortMSB(num2); - if (strstart != 0) - { - putShortMSB((int)SupportClass.URShift(strm.adler, 16)); - putShortMSB((int)(strm.adler & 0xFFFF)); - } - strm.adler = strm._adler.adler32(0L, null, 0, 0); - } - if (pending != 0) - { - strm.flush_pending(); - if (strm.avail_out == 0) - { - last_flush = -1; - return 0; - } - } - else if (strm.avail_in == 0 && flush <= num && flush != 4) - { - strm.msg = z_errmsg[7]; - return -5; - } - if (status == 666 && strm.avail_in != 0) - { - strm.msg = z_errmsg[7]; - return -5; - } - if (strm.avail_in != 0 || lookahead != 0 || (flush != 0 && status != 666)) - { - int num4 = -1; - switch (config_table[level].func) - { - case 0: - num4 = deflate_stored(flush); - break; - case 1: - num4 = deflate_fast(flush); - break; - case 2: - num4 = deflate_slow(flush); - break; - } - if (num4 == 2 || num4 == 3) - { - status = 666; - } - switch (num4) - { - case 0: - case 2: - if (strm.avail_out == 0) - { - last_flush = -1; - } - return 0; - case 1: - if (flush == 1) - { - _tr_align(); - } - else - { - _tr_stored_block(0, 0, eof: false); - if (flush == 3) - { - for (int i = 0; i < hash_size; i++) - { - head[i] = 0; - } - } - } - strm.flush_pending(); - if (strm.avail_out == 0) - { - last_flush = -1; - return 0; - } - break; - } - } - if (flush != 4) - { - return 0; - } - if (noheader != 0) - { - return 1; - } - putShortMSB((int)SupportClass.URShift(strm.adler, 16)); - putShortMSB((int)(strm.adler & 0xFFFF)); - strm.flush_pending(); - noheader = -1; - if (pending == 0) - { - return 1; - } - return 0; - } - - static Deflate() - { - z_errmsg = new string[10] { "need dictionary", "stream end", "", "file error", "stream error", "data error", "insufficient memory", "buffer error", "incompatible version", "" }; - MIN_LOOKAHEAD = 262; - L_CODES = 286; - HEAP_SIZE = 2 * L_CODES + 1; - config_table = new Config[10]; - config_table[0] = new Config(0, 0, 0, 0, 0); - config_table[1] = new Config(4, 4, 8, 4, 1); - config_table[2] = new Config(4, 5, 16, 8, 1); - config_table[3] = new Config(4, 6, 32, 32, 1); - config_table[4] = new Config(4, 4, 16, 16, 2); - config_table[5] = new Config(8, 16, 32, 32, 2); - config_table[6] = new Config(8, 16, 128, 128, 2); - config_table[7] = new Config(8, 32, 128, 256, 2); - config_table[8] = new Config(32, 128, 258, 1024, 2); - config_table[9] = new Config(32, 258, 258, 4096, 2); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Deflate.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Deflate.cs.meta deleted file mode 100644 index 191cf63..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Deflate.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2dfc48049b9e04b4eadd12cb50383cb8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfBlocks.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfBlocks.cs deleted file mode 100644 index e9373ee..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfBlocks.cs +++ /dev/null @@ -1,661 +0,0 @@ -using System; - -namespace ComponentAce.Compression.Libs.zlib -{ - internal sealed class InfBlocks - { - private const int MANY = 1440; - - private static readonly int[] inflate_mask = new int[17] - { - 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, - 1023, 2047, 4095, 8191, 16383, 32767, 65535 - }; - - internal static readonly int[] border = new int[19] - { - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, - 11, 4, 12, 3, 13, 2, 14, 1, 15 - }; - - private const int Z_OK = 0; - - private const int Z_STREAM_END = 1; - - private const int Z_NEED_DICT = 2; - - private const int Z_ERRNO = -1; - - private const int Z_STREAM_ERROR = -2; - - private const int Z_DATA_ERROR = -3; - - private const int Z_MEM_ERROR = -4; - - private const int Z_BUF_ERROR = -5; - - private const int Z_VERSION_ERROR = -6; - - private const int TYPE = 0; - - private const int LENS = 1; - - private const int STORED = 2; - - private const int TABLE = 3; - - private const int BTREE = 4; - - private const int DTREE = 5; - - private const int CODES = 6; - - private const int DRY = 7; - - private const int DONE = 8; - - private const int BAD = 9; - - internal int mode; - - internal int left; - - internal int table; - - internal int index; - - internal int[] blens; - - internal int[] bb = new int[1]; - - internal int[] tb = new int[1]; - - internal InfCodes codes; - - internal int last; - - internal int bitk; - - internal int bitb; - - internal int[] hufts; - - internal byte[] window; - - internal int end; - - internal int read; - - internal int write; - - internal object checkfn; - - internal long check; - - internal InfBlocks(ZStream z, object checkfn, int w) - { - hufts = new int[4320]; - window = new byte[w]; - end = w; - this.checkfn = checkfn; - mode = 0; - reset(z, null); - } - - internal void reset(ZStream z, long[] c) - { - if (c != null) - { - c[0] = check; - } - if (mode == 4 || mode == 5) - { - blens = null; - } - if (mode == 6) - { - codes.free(z); - } - mode = 0; - bitk = 0; - bitb = 0; - read = (write = 0); - if (checkfn != null) - { - z.adler = (check = z._adler.adler32(0L, null, 0, 0)); - } - } - - internal int proc(ZStream z, int r) - { - int num = z.next_in_index; - int num2 = z.avail_in; - int num3 = bitb; - int i = bitk; - int num4 = write; - int num5 = ((num4 < read) ? (read - num4 - 1) : (end - num4)); - while (true) - { - switch (mode) - { - case 0: - { - for (; i < 3; i += 8) - { - if (num2 != 0) - { - r = 0; - num2--; - num3 |= (z.next_in[num++] & 0xFF) << i; - continue; - } - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - int num6 = num3 & 7; - last = num6 & 1; - switch (SupportClass.URShift(num6, 1)) - { - case 0: - num3 = SupportClass.URShift(num3, 3); - i -= 3; - num6 = i & 7; - num3 = SupportClass.URShift(num3, num6); - i -= num6; - mode = 1; - break; - case 1: - { - int[] array5 = new int[1]; - int[] array6 = new int[1]; - int[][] array7 = new int[1][]; - int[][] array8 = new int[1][]; - InfTree.inflate_trees_fixed(array5, array6, array7, array8, z); - codes = new InfCodes(array5[0], array6[0], array7[0], array8[0], z); - num3 = SupportClass.URShift(num3, 3); - i -= 3; - mode = 6; - break; - } - case 2: - num3 = SupportClass.URShift(num3, 3); - i -= 3; - mode = 3; - break; - case 3: - num3 = SupportClass.URShift(num3, 3); - i -= 3; - mode = 9; - z.msg = "invalid block type"; - r = -3; - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - break; - } - case 1: - for (; i < 32; i += 8) - { - if (num2 != 0) - { - r = 0; - num2--; - num3 |= (z.next_in[num++] & 0xFF) << i; - continue; - } - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - if ((SupportClass.URShift(~num3, 16) & 0xFFFF) != (num3 & 0xFFFF)) - { - mode = 9; - z.msg = "invalid stored block lengths"; - r = -3; - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - left = num3 & 0xFFFF; - num3 = (i = 0); - mode = ((left != 0) ? 2 : ((last != 0) ? 7 : 0)); - break; - case 2: - { - if (num2 == 0) - { - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - if (num5 == 0) - { - if (num4 == end && read != 0) - { - num4 = 0; - num5 = ((num4 < read) ? (read - num4 - 1) : (end - num4)); - } - if (num5 == 0) - { - write = num4; - r = inflate_flush(z, r); - num4 = write; - num5 = ((num4 < read) ? (read - num4 - 1) : (end - num4)); - if (num4 == end && read != 0) - { - num4 = 0; - num5 = ((num4 < read) ? (read - num4 - 1) : (end - num4)); - } - if (num5 == 0) - { - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - } - } - r = 0; - int num6 = left; - if (num6 > num2) - { - num6 = num2; - } - if (num6 > num5) - { - num6 = num5; - } - Array.Copy(z.next_in, num, window, num4, num6); - num += num6; - num2 -= num6; - num4 += num6; - num5 -= num6; - if ((left -= num6) == 0) - { - mode = ((last != 0) ? 7 : 0); - } - break; - } - case 3: - { - for (; i < 14; i += 8) - { - if (num2 != 0) - { - r = 0; - num2--; - num3 |= (z.next_in[num++] & 0xFF) << i; - continue; - } - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - int num6 = (table = num3 & 0x3FFF); - if ((num6 & 0x1F) > 29 || ((num6 >> 5) & 0x1F) > 29) - { - mode = 9; - z.msg = "too many length or distance symbols"; - r = -3; - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - num6 = 258 + (num6 & 0x1F) + ((num6 >> 5) & 0x1F); - blens = new int[num6]; - num3 = SupportClass.URShift(num3, 14); - i -= 14; - index = 0; - mode = 4; - goto case 4; - } - case 4: - { - while (index < 4 + SupportClass.URShift(table, 10)) - { - for (; i < 3; i += 8) - { - if (num2 != 0) - { - r = 0; - num2--; - num3 |= (z.next_in[num++] & 0xFF) << i; - continue; - } - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - blens[border[index++]] = num3 & 7; - num3 = SupportClass.URShift(num3, 3); - i -= 3; - } - while (index < 19) - { - blens[border[index++]] = 0; - } - bb[0] = 7; - int num6 = InfTree.inflate_trees_bits(blens, bb, tb, hufts, z); - if (num6 != 0) - { - r = num6; - if (r == -3) - { - blens = null; - mode = 9; - } - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - index = 0; - mode = 5; - goto case 5; - } - case 5: - { - int num6; - while (true) - { - num6 = table; - if (index >= 258 + (num6 & 0x1F) + ((num6 >> 5) & 0x1F)) - { - break; - } - for (num6 = bb[0]; i < num6; i += 8) - { - if (num2 != 0) - { - r = 0; - num2--; - num3 |= (z.next_in[num++] & 0xFF) << i; - continue; - } - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - _ = tb[0]; - _ = -1; - num6 = hufts[(tb[0] + (num3 & inflate_mask[num6])) * 3 + 1]; - int num7 = hufts[(tb[0] + (num3 & inflate_mask[num6])) * 3 + 2]; - if (num7 < 16) - { - num3 = SupportClass.URShift(num3, num6); - i -= num6; - blens[index++] = num7; - continue; - } - int num8 = ((num7 == 18) ? 7 : (num7 - 14)); - int num9 = ((num7 == 18) ? 11 : 3); - for (; i < num6 + num8; i += 8) - { - if (num2 != 0) - { - r = 0; - num2--; - num3 |= (z.next_in[num++] & 0xFF) << i; - continue; - } - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - num3 = SupportClass.URShift(num3, num6); - i -= num6; - num9 += num3 & inflate_mask[num8]; - num3 = SupportClass.URShift(num3, num8); - i -= num8; - num8 = index; - num6 = table; - if (num8 + num9 > 258 + (num6 & 0x1F) + ((num6 >> 5) & 0x1F) || (num7 == 16 && num8 < 1)) - { - blens = null; - mode = 9; - z.msg = "invalid bit length repeat"; - r = -3; - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - num7 = ((num7 == 16) ? blens[num8 - 1] : 0); - do - { - blens[num8++] = num7; - } - while (--num9 != 0); - index = num8; - } - tb[0] = -1; - int[] array = new int[1]; - int[] array2 = new int[1]; - int[] array3 = new int[1]; - int[] array4 = new int[1]; - array[0] = 9; - array2[0] = 6; - num6 = table; - num6 = InfTree.inflate_trees_dynamic(257 + (num6 & 0x1F), 1 + ((num6 >> 5) & 0x1F), blens, array, array2, array3, array4, hufts, z); - if (num6 != 0) - { - if (num6 == -3) - { - blens = null; - mode = 9; - } - r = num6; - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - codes = new InfCodes(array[0], array2[0], hufts, array3[0], hufts, array4[0], z); - blens = null; - mode = 6; - goto case 6; - } - case 6: - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - if ((r = codes.proc(this, z, r)) != 1) - { - return inflate_flush(z, r); - } - r = 0; - codes.free(z); - num = z.next_in_index; - num2 = z.avail_in; - num3 = bitb; - i = bitk; - num4 = write; - num5 = ((num4 < read) ? (read - num4 - 1) : (end - num4)); - if (last == 0) - { - mode = 0; - break; - } - mode = 7; - goto case 7; - case 7: - write = num4; - r = inflate_flush(z, r); - num4 = write; - num5 = ((num4 < read) ? (read - num4 - 1) : (end - num4)); - if (read != write) - { - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - mode = 8; - goto case 8; - case 8: - r = 1; - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - case 9: - r = -3; - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - default: - r = -2; - bitb = num3; - bitk = i; - z.avail_in = num2; - z.total_in += num - z.next_in_index; - z.next_in_index = num; - write = num4; - return inflate_flush(z, r); - } - } - } - - internal void free(ZStream z) - { - reset(z, null); - window = null; - hufts = null; - } - - internal void set_dictionary(byte[] d, int start, int n) - { - Array.Copy(d, start, window, 0, n); - read = (write = n); - } - - internal int sync_point() - { - if (mode != 1) - { - return 0; - } - return 1; - } - - internal int inflate_flush(ZStream z, int r) - { - int next_out_index = z.next_out_index; - int num = read; - int num2 = ((num <= write) ? write : end) - num; - if (num2 > z.avail_out) - { - num2 = z.avail_out; - } - if (num2 != 0 && r == -5) - { - r = 0; - } - z.avail_out -= num2; - z.total_out += num2; - if (checkfn != null) - { - z.adler = (check = z._adler.adler32(check, window, num, num2)); - } - Array.Copy(window, num, z.next_out, next_out_index, num2); - next_out_index += num2; - num += num2; - if (num == end) - { - num = 0; - if (write == end) - { - write = 0; - } - num2 = write - num; - if (num2 > z.avail_out) - { - num2 = z.avail_out; - } - if (num2 != 0 && r == -5) - { - r = 0; - } - z.avail_out -= num2; - z.total_out += num2; - if (checkfn != null) - { - z.adler = (check = z._adler.adler32(check, window, num, num2)); - } - Array.Copy(window, num, z.next_out, next_out_index, num2); - next_out_index += num2; - num += num2; - } - z.next_out_index = next_out_index; - read = num; - return r; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfBlocks.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfBlocks.cs.meta deleted file mode 100644 index 553006c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfBlocks.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 38ff23616a4cf9349add205940d1e8de -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfCodes.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfCodes.cs deleted file mode 100644 index 47e6970..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfCodes.cs +++ /dev/null @@ -1,664 +0,0 @@ -using System; - -namespace ComponentAce.Compression.Libs.zlib -{ - internal sealed class InfCodes - { - private static readonly int[] inflate_mask = new int[17] - { - 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, - 1023, 2047, 4095, 8191, 16383, 32767, 65535 - }; - - private const int Z_OK = 0; - - private const int Z_STREAM_END = 1; - - private const int Z_NEED_DICT = 2; - - private const int Z_ERRNO = -1; - - private const int Z_STREAM_ERROR = -2; - - private const int Z_DATA_ERROR = -3; - - private const int Z_MEM_ERROR = -4; - - private const int Z_BUF_ERROR = -5; - - private const int Z_VERSION_ERROR = -6; - - private const int START = 0; - - private const int LEN = 1; - - private const int LENEXT = 2; - - private const int DIST = 3; - - private const int DISTEXT = 4; - - private const int COPY = 5; - - private const int LIT = 6; - - private const int WASH = 7; - - private const int END = 8; - - private const int BADCODE = 9; - - internal int mode; - - internal int len; - - internal int[] tree; - - internal int tree_index; - - internal int need; - - internal int lit; - - internal int get_Renamed; - - internal int dist; - - internal byte lbits; - - internal byte dbits; - - internal int[] ltree; - - internal int ltree_index; - - internal int[] dtree; - - internal int dtree_index; - - internal InfCodes(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, ZStream z) - { - mode = 0; - lbits = (byte)bl; - dbits = (byte)bd; - ltree = tl; - ltree_index = tl_index; - dtree = td; - dtree_index = td_index; - } - - internal InfCodes(int bl, int bd, int[] tl, int[] td, ZStream z) - { - mode = 0; - lbits = (byte)bl; - dbits = (byte)bd; - ltree = tl; - ltree_index = 0; - dtree = td; - dtree_index = 0; - } - - internal int proc(InfBlocks s, ZStream z, int r) - { - int num = 0; - int num2 = 0; - int num3 = 0; - num3 = z.next_in_index; - int num4 = z.avail_in; - num = s.bitb; - num2 = s.bitk; - int num5 = s.write; - int num6 = ((num5 < s.read) ? (s.read - num5 - 1) : (s.end - num5)); - while (true) - { - switch (mode) - { - case 0: - if (num6 >= 258 && num4 >= 10) - { - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - r = inflate_fast(lbits, dbits, ltree, ltree_index, dtree, dtree_index, s, z); - num3 = z.next_in_index; - num4 = z.avail_in; - num = s.bitb; - num2 = s.bitk; - num5 = s.write; - num6 = ((num5 < s.read) ? (s.read - num5 - 1) : (s.end - num5)); - if (r != 0) - { - mode = ((r == 1) ? 7 : 9); - break; - } - } - need = lbits; - tree = ltree; - tree_index = ltree_index; - mode = 1; - goto case 1; - case 1: - { - int num7; - for (num7 = need; num2 < num7; num2 += 8) - { - if (num4 != 0) - { - r = 0; - num4--; - num |= (z.next_in[num3++] & 0xFF) << num2; - continue; - } - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - int num8 = (tree_index + (num & inflate_mask[num7])) * 3; - num = SupportClass.URShift(num, tree[num8 + 1]); - num2 -= tree[num8 + 1]; - int num9 = tree[num8]; - if (num9 == 0) - { - lit = tree[num8 + 2]; - mode = 6; - break; - } - if (((uint)num9 & 0x10u) != 0) - { - get_Renamed = num9 & 0xF; - len = tree[num8 + 2]; - mode = 2; - break; - } - if ((num9 & 0x40) == 0) - { - need = num9; - tree_index = num8 / 3 + tree[num8 + 2]; - break; - } - if (((uint)num9 & 0x20u) != 0) - { - mode = 7; - break; - } - mode = 9; - z.msg = "invalid literal/length code"; - r = -3; - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - case 2: - { - int num7; - for (num7 = get_Renamed; num2 < num7; num2 += 8) - { - if (num4 != 0) - { - r = 0; - num4--; - num |= (z.next_in[num3++] & 0xFF) << num2; - continue; - } - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - len += num & inflate_mask[num7]; - num >>= num7; - num2 -= num7; - need = dbits; - tree = dtree; - tree_index = dtree_index; - mode = 3; - goto case 3; - } - case 3: - { - int num7; - for (num7 = need; num2 < num7; num2 += 8) - { - if (num4 != 0) - { - r = 0; - num4--; - num |= (z.next_in[num3++] & 0xFF) << num2; - continue; - } - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - int num8 = (tree_index + (num & inflate_mask[num7])) * 3; - num >>= tree[num8 + 1]; - num2 -= tree[num8 + 1]; - int num9 = tree[num8]; - if (((uint)num9 & 0x10u) != 0) - { - get_Renamed = num9 & 0xF; - dist = tree[num8 + 2]; - mode = 4; - break; - } - if ((num9 & 0x40) == 0) - { - need = num9; - tree_index = num8 / 3 + tree[num8 + 2]; - break; - } - mode = 9; - z.msg = "invalid distance code"; - r = -3; - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - case 4: - { - int num7; - for (num7 = get_Renamed; num2 < num7; num2 += 8) - { - if (num4 != 0) - { - r = 0; - num4--; - num |= (z.next_in[num3++] & 0xFF) << num2; - continue; - } - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - dist += num & inflate_mask[num7]; - num >>= num7; - num2 -= num7; - mode = 5; - goto case 5; - } - case 5: - { - int i; - for (i = num5 - dist; i < 0; i += s.end) - { - } - while (len != 0) - { - if (num6 == 0) - { - if (num5 == s.end && s.read != 0) - { - num5 = 0; - num6 = ((num5 < s.read) ? (s.read - num5 - 1) : (s.end - num5)); - } - if (num6 == 0) - { - s.write = num5; - r = s.inflate_flush(z, r); - num5 = s.write; - num6 = ((num5 < s.read) ? (s.read - num5 - 1) : (s.end - num5)); - if (num5 == s.end && s.read != 0) - { - num5 = 0; - num6 = ((num5 < s.read) ? (s.read - num5 - 1) : (s.end - num5)); - } - if (num6 == 0) - { - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - } - } - s.window[num5++] = s.window[i++]; - num6--; - if (i == s.end) - { - i = 0; - } - len--; - } - mode = 0; - break; - } - case 6: - if (num6 == 0) - { - if (num5 == s.end && s.read != 0) - { - num5 = 0; - num6 = ((num5 < s.read) ? (s.read - num5 - 1) : (s.end - num5)); - } - if (num6 == 0) - { - s.write = num5; - r = s.inflate_flush(z, r); - num5 = s.write; - num6 = ((num5 < s.read) ? (s.read - num5 - 1) : (s.end - num5)); - if (num5 == s.end && s.read != 0) - { - num5 = 0; - num6 = ((num5 < s.read) ? (s.read - num5 - 1) : (s.end - num5)); - } - if (num6 == 0) - { - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - } - } - r = 0; - s.window[num5++] = (byte)lit; - num6--; - mode = 0; - break; - case 7: - if (num2 > 7) - { - num2 -= 8; - num4++; - num3--; - } - s.write = num5; - r = s.inflate_flush(z, r); - num5 = s.write; - num6 = ((num5 < s.read) ? (s.read - num5 - 1) : (s.end - num5)); - if (s.read != s.write) - { - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - mode = 8; - goto case 8; - case 8: - r = 1; - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - case 9: - r = -3; - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - default: - r = -2; - s.bitb = num; - s.bitk = num2; - z.avail_in = num4; - z.total_in += num3 - z.next_in_index; - z.next_in_index = num3; - s.write = num5; - return s.inflate_flush(z, r); - } - } - } - - internal void free(ZStream z) - { - } - - internal int inflate_fast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InfBlocks s, ZStream z) - { - int next_in_index = z.next_in_index; - int num = z.avail_in; - int num2 = s.bitb; - int num3 = s.bitk; - int num4 = s.write; - int num5 = ((num4 < s.read) ? (s.read - num4 - 1) : (s.end - num4)); - int num6 = inflate_mask[bl]; - int num7 = inflate_mask[bd]; - int num11; - while (true) - { - if (num3 < 20) - { - num--; - num2 |= (z.next_in[next_in_index++] & 0xFF) << num3; - num3 += 8; - continue; - } - int num8 = num2 & num6; - int[] array = tl; - int num9 = tl_index; - int num10; - if ((num10 = array[(num9 + num8) * 3]) == 0) - { - num2 >>= array[(num9 + num8) * 3 + 1]; - num3 -= array[(num9 + num8) * 3 + 1]; - s.window[num4++] = (byte)array[(num9 + num8) * 3 + 2]; - num5--; - } - else - { - while (true) - { - num2 >>= array[(num9 + num8) * 3 + 1]; - num3 -= array[(num9 + num8) * 3 + 1]; - if (((uint)num10 & 0x10u) != 0) - { - num10 &= 0xF; - num11 = array[(num9 + num8) * 3 + 2] + (num2 & inflate_mask[num10]); - num2 >>= num10; - for (num3 -= num10; num3 < 15; num3 += 8) - { - num--; - num2 |= (z.next_in[next_in_index++] & 0xFF) << num3; - } - num8 = num2 & num7; - array = td; - num9 = td_index; - num10 = array[(num9 + num8) * 3]; - while (true) - { - num2 >>= array[(num9 + num8) * 3 + 1]; - num3 -= array[(num9 + num8) * 3 + 1]; - if (((uint)num10 & 0x10u) != 0) - { - break; - } - if ((num10 & 0x40) == 0) - { - num8 += array[(num9 + num8) * 3 + 2]; - num8 += num2 & inflate_mask[num10]; - num10 = array[(num9 + num8) * 3]; - continue; - } - z.msg = "invalid distance code"; - num11 = z.avail_in - num; - num11 = ((num3 >> 3 < num11) ? (num3 >> 3) : num11); - num += num11; - next_in_index -= num11; - num3 -= num11 << 3; - s.bitb = num2; - s.bitk = num3; - z.avail_in = num; - z.total_in += next_in_index - z.next_in_index; - z.next_in_index = next_in_index; - s.write = num4; - return -3; - } - for (num10 &= 0xF; num3 < num10; num3 += 8) - { - num--; - num2 |= (z.next_in[next_in_index++] & 0xFF) << num3; - } - int num12 = array[(num9 + num8) * 3 + 2] + (num2 & inflate_mask[num10]); - num2 >>= num10; - num3 -= num10; - num5 -= num11; - int num13; - if (num4 >= num12) - { - num13 = num4 - num12; - if (num4 - num13 > 0 && 2 > num4 - num13) - { - s.window[num4++] = s.window[num13++]; - num11--; - s.window[num4++] = s.window[num13++]; - num11--; - } - else - { - Array.Copy(s.window, num13, s.window, num4, 2); - num4 += 2; - num13 += 2; - num11 -= 2; - } - } - else - { - num13 = num4 - num12; - do - { - num13 += s.end; - } - while (num13 < 0); - num10 = s.end - num13; - if (num11 > num10) - { - num11 -= num10; - if (num4 - num13 > 0 && num10 > num4 - num13) - { - do - { - s.window[num4++] = s.window[num13++]; - } - while (--num10 != 0); - } - else - { - Array.Copy(s.window, num13, s.window, num4, num10); - num4 += num10; - num13 += num10; - num10 = 0; - } - num13 = 0; - } - } - if (num4 - num13 > 0 && num11 > num4 - num13) - { - do - { - s.window[num4++] = s.window[num13++]; - } - while (--num11 != 0); - break; - } - Array.Copy(s.window, num13, s.window, num4, num11); - num4 += num11; - num13 += num11; - num11 = 0; - break; - } - if ((num10 & 0x40) == 0) - { - num8 += array[(num9 + num8) * 3 + 2]; - num8 += num2 & inflate_mask[num10]; - if ((num10 = array[(num9 + num8) * 3]) == 0) - { - num2 >>= array[(num9 + num8) * 3 + 1]; - num3 -= array[(num9 + num8) * 3 + 1]; - s.window[num4++] = (byte)array[(num9 + num8) * 3 + 2]; - num5--; - break; - } - continue; - } - if (((uint)num10 & 0x20u) != 0) - { - num11 = z.avail_in - num; - num11 = ((num3 >> 3 < num11) ? (num3 >> 3) : num11); - num += num11; - next_in_index -= num11; - num3 -= num11 << 3; - s.bitb = num2; - s.bitk = num3; - z.avail_in = num; - z.total_in += next_in_index - z.next_in_index; - z.next_in_index = next_in_index; - s.write = num4; - return 1; - } - z.msg = "invalid literal/length code"; - num11 = z.avail_in - num; - num11 = ((num3 >> 3 < num11) ? (num3 >> 3) : num11); - num += num11; - next_in_index -= num11; - num3 -= num11 << 3; - s.bitb = num2; - s.bitk = num3; - z.avail_in = num; - z.total_in += next_in_index - z.next_in_index; - z.next_in_index = next_in_index; - s.write = num4; - return -3; - } - } - if (num5 < 258 || num < 10) - { - break; - } - } - num11 = z.avail_in - num; - num11 = ((num3 >> 3 < num11) ? (num3 >> 3) : num11); - num += num11; - next_in_index -= num11; - num3 -= num11 << 3; - s.bitb = num2; - s.bitk = num3; - z.avail_in = num; - z.total_in += next_in_index - z.next_in_index; - z.next_in_index = next_in_index; - s.write = num4; - return 0; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfCodes.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfCodes.cs.meta deleted file mode 100644 index e6eeab3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfCodes.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 848289b37732055419a0cc1d6f28d36a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfTree.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfTree.cs deleted file mode 100644 index 0541076..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfTree.cs +++ /dev/null @@ -1,479 +0,0 @@ -using System; - -namespace ComponentAce.Compression.Libs.zlib -{ - internal sealed class InfTree - { - private const int MANY = 1440; - - private const int Z_OK = 0; - - private const int Z_STREAM_END = 1; - - private const int Z_NEED_DICT = 2; - - private const int Z_ERRNO = -1; - - private const int Z_STREAM_ERROR = -2; - - private const int Z_DATA_ERROR = -3; - - private const int Z_MEM_ERROR = -4; - - private const int Z_BUF_ERROR = -5; - - private const int Z_VERSION_ERROR = -6; - - internal const int fixed_bl = 9; - - internal const int fixed_bd = 5; - - internal static readonly int[] fixed_tl = new int[1536] - { - 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, - 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, - 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, - 0, 8, 32, 0, 9, 160, 0, 8, 0, 0, - 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, - 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, - 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, - 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, - 40, 0, 9, 176, 0, 8, 8, 0, 8, 136, - 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, - 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, - 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, - 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, - 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, - 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, - 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, - 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, - 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, - 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, - 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, - 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, - 0, 8, 50, 0, 9, 196, 81, 7, 11, 0, - 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, - 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, - 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, - 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, - 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, - 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, - 8, 138, 0, 8, 74, 0, 9, 244, 80, 7, - 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, - 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, - 9, 204, 81, 7, 15, 0, 8, 102, 0, 8, - 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, - 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, - 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, - 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, - 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, - 9, 188, 0, 8, 14, 0, 8, 142, 0, 8, - 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, - 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, - 8, 113, 0, 8, 49, 0, 9, 194, 80, 7, - 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, - 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, - 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, - 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, - 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, - 8, 105, 0, 8, 41, 0, 9, 178, 0, 8, - 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, - 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, - 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, - 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, - 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, - 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, - 8, 0, 8, 93, 0, 8, 29, 0, 9, 154, - 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, - 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, - 45, 0, 9, 186, 0, 8, 13, 0, 8, 141, - 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, - 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, - 35, 0, 8, 115, 0, 8, 51, 0, 9, 198, - 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, - 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, - 67, 0, 9, 230, 80, 7, 7, 0, 8, 91, - 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, - 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, - 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, - 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, - 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, - 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, - 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, - 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, - 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, - 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, - 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, - 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, - 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, - 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, - 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, - 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, - 9, 193, 80, 7, 10, 0, 8, 96, 0, 8, - 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, - 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, - 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, - 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, - 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, - 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, - 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, - 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, - 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, - 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, - 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, - 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, - 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, - 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, - 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, - 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, - 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, - 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, - 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, - 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, - 8, 130, 0, 8, 66, 0, 9, 229, 80, 7, - 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, - 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, - 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, - 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, - 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, - 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, - 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, - 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, - 9, 173, 0, 8, 6, 0, 8, 134, 0, 8, - 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, - 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, - 8, 126, 0, 8, 62, 0, 9, 221, 82, 7, - 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, - 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, - 9, 253, 96, 7, 256, 0, 8, 81, 0, 8, - 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, - 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, - 8, 97, 0, 8, 33, 0, 9, 163, 0, 8, - 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, - 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, - 9, 147, 83, 7, 59, 0, 8, 121, 0, 8, - 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, - 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, - 8, 137, 0, 8, 73, 0, 9, 243, 80, 7, - 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, - 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, - 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, - 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, - 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, - 8, 93, 0, 8, 29, 0, 9, 155, 84, 7, - 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, - 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, - 9, 187, 0, 8, 13, 0, 8, 141, 0, 8, - 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, - 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, - 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, - 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, - 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, - 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, - 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, - 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, - 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, - 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, - 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, - 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, - 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, - 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, - 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, - 9, 0, 8, 95, 0, 8, 31, 0, 9, 159, - 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, - 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, - 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, - 0, 8, 79, 0, 9, 255 - }; - - internal static readonly int[] fixed_td = new int[96] - { - 80, 5, 1, 87, 5, 257, 83, 5, 17, 91, - 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, - 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, - 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, - 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, - 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, - 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, - 5, 24577, 80, 5, 4, 88, 5, 769, 84, 5, - 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, - 86, 5, 193, 192, 5, 24577 - }; - - internal static readonly int[] cplens = new int[31] - { - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, - 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, - 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, - 0 - }; - - internal static readonly int[] cplext = new int[31] - { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, - 112 - }; - - internal static readonly int[] cpdist = new int[30] - { - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, - 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, - 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 - }; - - internal static readonly int[] cpdext = new int[30] - { - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, - 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, - 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 - }; - - internal const int BMAX = 15; - - internal static int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v) - { - int[] array = new int[16]; - int[] array2 = new int[3]; - int[] array3 = new int[15]; - int[] array4 = new int[16]; - int num = 0; - int num2 = n; - do - { - array[b[bindex + num]]++; - num++; - num2--; - } - while (num2 != 0); - if (array[0] == n) - { - t[0] = -1; - m[0] = 0; - return 0; - } - int num3 = m[0]; - int i; - for (i = 1; i <= 15 && array[i] == 0; i++) - { - } - int j = i; - if (num3 < i) - { - num3 = i; - } - num2 = 15; - while (num2 != 0 && array[num2] == 0) - { - num2--; - } - int num4 = num2; - if (num3 > num2) - { - num3 = num2; - } - m[0] = num3; - int num5 = 1 << i; - while (i < num2) - { - if ((num5 -= array[i]) < 0) - { - return -3; - } - i++; - num5 <<= 1; - } - if ((num5 -= array[num2]) < 0) - { - return -3; - } - array[num2] += num5; - i = (array4[1] = 0); - num = 1; - int num6 = 2; - while (--num2 != 0) - { - i = (array4[num6] = i + array[num]); - num6++; - num++; - } - num2 = 0; - num = 0; - do - { - if ((i = b[bindex + num]) != 0) - { - v[array4[i]++] = num2; - } - num++; - } - while (++num2 < n); - n = array4[num4]; - num2 = (array4[0] = 0); - num = 0; - int num7 = -1; - int num8 = -num3; - array3[0] = 0; - int num9 = 0; - int num10 = 0; - for (; j <= num4; j++) - { - int num11 = array[j]; - while (num11-- != 0) - { - int num12; - while (j > num8 + num3) - { - num7++; - num8 += num3; - num10 = num4 - num8; - num10 = ((num10 > num3) ? num3 : num10); - if ((num12 = 1 << (i = j - num8)) > num11 + 1) - { - num12 -= num11 + 1; - num6 = j; - if (i < num10) - { - while (++i < num10 && (num12 <<= 1) > array[++num6]) - { - num12 -= array[num6]; - } - } - } - num10 = 1 << i; - if (hn[0] + num10 > 1440) - { - return -3; - } - num9 = (array3[num7] = hn[0]); - hn[0] += num10; - if (num7 != 0) - { - array4[num7] = num2; - array2[0] = (byte)i; - array2[1] = (byte)num3; - i = SupportClass.URShift(num2, num8 - num3); - array2[2] = num9 - array3[num7 - 1] - i; - Array.Copy(array2, 0, hp, (array3[num7 - 1] + i) * 3, 3); - } - else - { - t[0] = num9; - } - } - array2[1] = (byte)(j - num8); - if (num >= n) - { - array2[0] = 192; - } - else if (v[num] < s) - { - array2[0] = (byte)((v[num] >= 256) ? 96 : 0); - array2[2] = v[num++]; - } - else - { - array2[0] = (byte)(e[v[num] - s] + 16 + 64); - array2[2] = d[v[num++] - s]; - } - num12 = 1 << j - num8; - for (i = SupportClass.URShift(num2, num8); i < num10; i += num12) - { - Array.Copy(array2, 0, hp, (num9 + i) * 3, 3); - } - i = 1 << j - 1; - while ((num2 & i) != 0) - { - num2 ^= i; - i = SupportClass.URShift(i, 1); - } - num2 ^= i; - int num13 = (1 << num8) - 1; - while ((num2 & num13) != array4[num7]) - { - num7--; - num8 -= num3; - num13 = (1 << num8) - 1; - } - } - } - if (num5 == 0 || num4 == 1) - { - return 0; - } - return -5; - } - - internal static int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZStream z) - { - int[] hn = new int[1]; - int[] v = new int[19]; - int num = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v); - if (num == -3) - { - z.msg = "oversubscribed dynamic bit lengths tree"; - } - else if (num == -5 || bb[0] == 0) - { - z.msg = "incomplete dynamic bit lengths tree"; - num = -3; - } - return num; - } - - internal static int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZStream z) - { - int[] hn = new int[1]; - int[] v = new int[288]; - int num = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v); - if (num != 0 || bl[0] == 0) - { - switch (num) - { - case -3: - z.msg = "oversubscribed literal/length tree"; - break; - default: - z.msg = "incomplete literal/length tree"; - num = -3; - break; - case -4: - break; - } - return num; - } - num = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v); - if (num != 0 || (bd[0] == 0 && nl > 257)) - { - switch (num) - { - case -3: - z.msg = "oversubscribed distance tree"; - break; - case -5: - z.msg = "incomplete distance tree"; - num = -3; - break; - default: - z.msg = "empty distance tree with lengths"; - num = -3; - break; - case -4: - break; - } - return num; - } - return 0; - } - - internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZStream z) - { - bl[0] = 9; - bd[0] = 5; - tl[0] = fixed_tl; - td[0] = fixed_td; - return 0; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfTree.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfTree.cs.meta deleted file mode 100644 index 23d1b6a..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/InfTree.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 12c1095bcb2a9e748af19115781c4483 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Inflate.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Inflate.cs deleted file mode 100644 index d2ee7f1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Inflate.cs +++ /dev/null @@ -1,409 +0,0 @@ -namespace ComponentAce.Compression.Libs.zlib -{ - internal sealed class Inflate - { - private const int MAX_WBITS = 15; - - private const int PRESET_DICT = 32; - - internal const int Z_NO_FLUSH = 0; - - internal const int Z_PARTIAL_FLUSH = 1; - - internal const int Z_SYNC_FLUSH = 2; - - internal const int Z_FULL_FLUSH = 3; - - internal const int Z_FINISH = 4; - - private const int Z_DEFLATED = 8; - - private const int Z_OK = 0; - - private const int Z_STREAM_END = 1; - - private const int Z_NEED_DICT = 2; - - private const int Z_ERRNO = -1; - - private const int Z_STREAM_ERROR = -2; - - private const int Z_DATA_ERROR = -3; - - private const int Z_MEM_ERROR = -4; - - private const int Z_BUF_ERROR = -5; - - private const int Z_VERSION_ERROR = -6; - - private const int METHOD = 0; - - private const int FLAG = 1; - - private const int DICT4 = 2; - - private const int DICT3 = 3; - - private const int DICT2 = 4; - - private const int DICT1 = 5; - - private const int DICT0 = 6; - - private const int BLOCKS = 7; - - private const int CHECK4 = 8; - - private const int CHECK3 = 9; - - private const int CHECK2 = 10; - - private const int CHECK1 = 11; - - private const int DONE = 12; - - private const int BAD = 13; - - internal int mode; - - internal int method; - - internal long[] was = new long[1]; - - internal long need; - - internal int marker; - - internal int nowrap; - - internal int wbits; - - internal InfBlocks blocks; - - private static byte[] mark = new byte[4] - { - 0, - 0, - (byte)SupportClass.Identity(255L), - (byte)SupportClass.Identity(255L) - }; - - internal int inflateReset(ZStream z) - { - if (z == null || z.istate == null) - { - return -2; - } - z.total_in = (z.total_out = 0L); - z.msg = null; - z.istate.mode = ((z.istate.nowrap != 0) ? 7 : 0); - z.istate.blocks.reset(z, null); - return 0; - } - - internal int inflateEnd(ZStream z) - { - if (blocks != null) - { - blocks.free(z); - } - blocks = null; - return 0; - } - - internal int inflateInit(ZStream z, int w) - { - z.msg = null; - blocks = null; - nowrap = 0; - if (w < 0) - { - w = -w; - nowrap = 1; - } - if (w < 8 || w > 15) - { - inflateEnd(z); - return -2; - } - wbits = w; - z.istate.blocks = new InfBlocks(z, (z.istate.nowrap != 0) ? null : this, 1 << w); - inflateReset(z); - return 0; - } - - internal int inflate(ZStream z, int f) - { - if (z == null || z.istate == null || z.next_in == null) - { - return -2; - } - f = ((f == 4) ? (-5) : 0); - int num = -5; - while (true) - { - switch (z.istate.mode) - { - case 0: - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - if (((z.istate.method = z.next_in[z.next_in_index++]) & 0xF) != 8) - { - z.istate.mode = 13; - z.msg = "unknown compression method"; - z.istate.marker = 5; - break; - } - if ((z.istate.method >> 4) + 8 > z.istate.wbits) - { - z.istate.mode = 13; - z.msg = "invalid window size"; - z.istate.marker = 5; - break; - } - z.istate.mode = 1; - goto case 1; - case 1: - { - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - int num2 = z.next_in[z.next_in_index++] & 0xFF; - if (((z.istate.method << 8) + num2) % 31 != 0) - { - z.istate.mode = 13; - z.msg = "incorrect header check"; - z.istate.marker = 5; - break; - } - if ((num2 & 0x20) == 0) - { - z.istate.mode = 7; - break; - } - z.istate.mode = 2; - goto case 2; - } - case 2: - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - z.istate.need = ((z.next_in[z.next_in_index++] & 0xFF) << 24) & -16777216; - z.istate.mode = 3; - goto case 3; - case 3: - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - z.istate.need += (long)((ulong)((z.next_in[z.next_in_index++] & 0xFF) << 16) & 0xFF0000uL); - z.istate.mode = 4; - goto case 4; - case 4: - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - z.istate.need += (long)((ulong)((z.next_in[z.next_in_index++] & 0xFF) << 8) & 0xFF00uL); - z.istate.mode = 5; - goto case 5; - case 5: - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - z.istate.need += (long)((ulong)z.next_in[z.next_in_index++] & 0xFFuL); - z.adler = z.istate.need; - z.istate.mode = 6; - return 2; - case 6: - z.istate.mode = 13; - z.msg = "need dictionary"; - z.istate.marker = 0; - return -2; - case 7: - num = z.istate.blocks.proc(z, num); - switch (num) - { - case -3: - z.istate.mode = 13; - z.istate.marker = 0; - goto end_IL_0031; - case 0: - num = f; - break; - } - if (num != 1) - { - return num; - } - num = f; - z.istate.blocks.reset(z, z.istate.was); - if (z.istate.nowrap != 0) - { - z.istate.mode = 12; - break; - } - z.istate.mode = 8; - goto case 8; - case 8: - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - z.istate.need = ((z.next_in[z.next_in_index++] & 0xFF) << 24) & -16777216; - z.istate.mode = 9; - goto case 9; - case 9: - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - z.istate.need += (long)((ulong)((z.next_in[z.next_in_index++] & 0xFF) << 16) & 0xFF0000uL); - z.istate.mode = 10; - goto case 10; - case 10: - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - z.istate.need += (long)((ulong)((z.next_in[z.next_in_index++] & 0xFF) << 8) & 0xFF00uL); - z.istate.mode = 11; - goto case 11; - case 11: - if (z.avail_in == 0) - { - return num; - } - num = f; - z.avail_in--; - z.total_in++; - z.istate.need += (long)((ulong)z.next_in[z.next_in_index++] & 0xFFuL); - if ((int)z.istate.was[0] != (int)z.istate.need) - { - z.istate.mode = 13; - z.msg = "incorrect data check"; - z.istate.marker = 5; - break; - } - z.istate.mode = 12; - goto case 12; - case 12: - return 1; - case 13: - return -3; - default: - { - return -2; - } - end_IL_0031: - break; - } - } - } - - internal int inflateSetDictionary(ZStream z, byte[] dictionary, int dictLength) - { - int start = 0; - int num = dictLength; - if (z == null || z.istate == null || z.istate.mode != 6) - { - return -2; - } - if (z._adler.adler32(1L, dictionary, 0, dictLength) != z.adler) - { - return -3; - } - z.adler = z._adler.adler32(0L, null, 0, 0); - if (num >= 1 << z.istate.wbits) - { - num = (1 << z.istate.wbits) - 1; - start = dictLength - num; - } - z.istate.blocks.set_dictionary(dictionary, start, num); - z.istate.mode = 7; - return 0; - } - - internal int inflateSync(ZStream z) - { - if (z == null || z.istate == null) - { - return -2; - } - if (z.istate.mode != 13) - { - z.istate.mode = 13; - z.istate.marker = 0; - } - int num; - if ((num = z.avail_in) == 0) - { - return -5; - } - int num2 = z.next_in_index; - int num3 = z.istate.marker; - while (num != 0 && num3 < 4) - { - num3 = ((z.next_in[num2] != mark[num3]) ? ((z.next_in[num2] == 0) ? (4 - num3) : 0) : (num3 + 1)); - num2++; - num--; - } - z.total_in += num2 - z.next_in_index; - z.next_in_index = num2; - z.avail_in = num; - z.istate.marker = num3; - if (num3 != 4) - { - return -3; - } - long total_in = z.total_in; - long total_out = z.total_out; - inflateReset(z); - z.total_in = total_in; - z.total_out = total_out; - z.istate.mode = 7; - return 0; - } - - internal int inflateSyncPoint(ZStream z) - { - if (z == null || z.istate == null || z.istate.blocks == null) - { - return -2; - } - return z.istate.blocks.sync_point(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Inflate.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Inflate.cs.meta deleted file mode 100644 index a814ad8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Inflate.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f0c7c284a3a696541b95af8150097d7d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/StaticTree.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/StaticTree.cs deleted file mode 100644 index a19fb00..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/StaticTree.cs +++ /dev/null @@ -1,126 +0,0 @@ -namespace ComponentAce.Compression.Libs.zlib -{ - internal sealed class StaticTree - { - private const int MAX_BITS = 15; - - private const int BL_CODES = 19; - - private const int D_CODES = 30; - - private const int LITERALS = 256; - - private const int LENGTH_CODES = 29; - - private static readonly int L_CODES; - - internal const int MAX_BL_BITS = 7; - - internal static readonly short[] static_ltree; - - internal static readonly short[] static_dtree; - - internal static StaticTree static_l_desc; - - internal static StaticTree static_d_desc; - - internal static StaticTree static_bl_desc; - - internal short[] static_tree; - - internal int[] extra_bits; - - internal int extra_base; - - internal int elems; - - internal int max_length; - - internal StaticTree(short[] static_tree, int[] extra_bits, int extra_base, int elems, int max_length) - { - this.static_tree = static_tree; - this.extra_bits = extra_bits; - this.extra_base = extra_base; - this.elems = elems; - this.max_length = max_length; - } - - static StaticTree() - { - L_CODES = 286; - static_ltree = new short[576] - { - 12, 8, 140, 8, 76, 8, 204, 8, 44, 8, - 172, 8, 108, 8, 236, 8, 28, 8, 156, 8, - 92, 8, 220, 8, 60, 8, 188, 8, 124, 8, - 252, 8, 2, 8, 130, 8, 66, 8, 194, 8, - 34, 8, 162, 8, 98, 8, 226, 8, 18, 8, - 146, 8, 82, 8, 210, 8, 50, 8, 178, 8, - 114, 8, 242, 8, 10, 8, 138, 8, 74, 8, - 202, 8, 42, 8, 170, 8, 106, 8, 234, 8, - 26, 8, 154, 8, 90, 8, 218, 8, 58, 8, - 186, 8, 122, 8, 250, 8, 6, 8, 134, 8, - 70, 8, 198, 8, 38, 8, 166, 8, 102, 8, - 230, 8, 22, 8, 150, 8, 86, 8, 214, 8, - 54, 8, 182, 8, 118, 8, 246, 8, 14, 8, - 142, 8, 78, 8, 206, 8, 46, 8, 174, 8, - 110, 8, 238, 8, 30, 8, 158, 8, 94, 8, - 222, 8, 62, 8, 190, 8, 126, 8, 254, 8, - 1, 8, 129, 8, 65, 8, 193, 8, 33, 8, - 161, 8, 97, 8, 225, 8, 17, 8, 145, 8, - 81, 8, 209, 8, 49, 8, 177, 8, 113, 8, - 241, 8, 9, 8, 137, 8, 73, 8, 201, 8, - 41, 8, 169, 8, 105, 8, 233, 8, 25, 8, - 153, 8, 89, 8, 217, 8, 57, 8, 185, 8, - 121, 8, 249, 8, 5, 8, 133, 8, 69, 8, - 197, 8, 37, 8, 165, 8, 101, 8, 229, 8, - 21, 8, 149, 8, 85, 8, 213, 8, 53, 8, - 181, 8, 117, 8, 245, 8, 13, 8, 141, 8, - 77, 8, 205, 8, 45, 8, 173, 8, 109, 8, - 237, 8, 29, 8, 157, 8, 93, 8, 221, 8, - 61, 8, 189, 8, 125, 8, 253, 8, 19, 9, - 275, 9, 147, 9, 403, 9, 83, 9, 339, 9, - 211, 9, 467, 9, 51, 9, 307, 9, 179, 9, - 435, 9, 115, 9, 371, 9, 243, 9, 499, 9, - 11, 9, 267, 9, 139, 9, 395, 9, 75, 9, - 331, 9, 203, 9, 459, 9, 43, 9, 299, 9, - 171, 9, 427, 9, 107, 9, 363, 9, 235, 9, - 491, 9, 27, 9, 283, 9, 155, 9, 411, 9, - 91, 9, 347, 9, 219, 9, 475, 9, 59, 9, - 315, 9, 187, 9, 443, 9, 123, 9, 379, 9, - 251, 9, 507, 9, 7, 9, 263, 9, 135, 9, - 391, 9, 71, 9, 327, 9, 199, 9, 455, 9, - 39, 9, 295, 9, 167, 9, 423, 9, 103, 9, - 359, 9, 231, 9, 487, 9, 23, 9, 279, 9, - 151, 9, 407, 9, 87, 9, 343, 9, 215, 9, - 471, 9, 55, 9, 311, 9, 183, 9, 439, 9, - 119, 9, 375, 9, 247, 9, 503, 9, 15, 9, - 271, 9, 143, 9, 399, 9, 79, 9, 335, 9, - 207, 9, 463, 9, 47, 9, 303, 9, 175, 9, - 431, 9, 111, 9, 367, 9, 239, 9, 495, 9, - 31, 9, 287, 9, 159, 9, 415, 9, 95, 9, - 351, 9, 223, 9, 479, 9, 63, 9, 319, 9, - 191, 9, 447, 9, 127, 9, 383, 9, 255, 9, - 511, 9, 0, 7, 64, 7, 32, 7, 96, 7, - 16, 7, 80, 7, 48, 7, 112, 7, 8, 7, - 72, 7, 40, 7, 104, 7, 24, 7, 88, 7, - 56, 7, 120, 7, 4, 7, 68, 7, 36, 7, - 100, 7, 20, 7, 84, 7, 52, 7, 116, 7, - 3, 8, 131, 8, 67, 8, 195, 8, 35, 8, - 163, 8, 99, 8, 227, 8 - }; - static_dtree = new short[60] - { - 0, 5, 16, 5, 8, 5, 24, 5, 4, 5, - 20, 5, 12, 5, 28, 5, 2, 5, 18, 5, - 10, 5, 26, 5, 6, 5, 22, 5, 14, 5, - 30, 5, 1, 5, 17, 5, 9, 5, 25, 5, - 5, 5, 21, 5, 13, 5, 29, 5, 3, 5, - 19, 5, 11, 5, 27, 5, 7, 5, 23, 5 - }; - static_l_desc = new StaticTree(static_ltree, Tree.extra_lbits, 257, L_CODES, 15); - static_d_desc = new StaticTree(static_dtree, Tree.extra_dbits, 0, 30, 15); - static_bl_desc = new StaticTree(null, Tree.extra_blbits, 0, 19, 7); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/StaticTree.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/StaticTree.cs.meta deleted file mode 100644 index ea36f10..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/StaticTree.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6d5351586a003ca4da795d2ce129ba8e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/SupportClass.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/SupportClass.cs deleted file mode 100644 index b55a3af..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/SupportClass.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.IO; -using System.Text; - -namespace ComponentAce.Compression.Libs.zlib -{ - public class SupportClass - { - public static long Identity(long literal) - { - return literal; - } - - public static ulong Identity(ulong literal) - { - return literal; - } - - public static float Identity(float literal) - { - return literal; - } - - public static double Identity(double literal) - { - return literal; - } - - public static int URShift(int number, int bits) - { - if (number >= 0) - { - return number >> bits; - } - return (number >> bits) + (2 << ~bits); - } - - public static int URShift(int number, long bits) - { - return URShift(number, (int)bits); - } - - public static long URShift(long number, int bits) - { - if (number >= 0) - { - return number >> bits; - } - return (number >> bits) + (2L << ~bits); - } - - public static long URShift(long number, long bits) - { - return URShift(number, (int)bits); - } - - public static int ReadInput(Stream sourceStream, byte[] target, int start, int count) - { - if (target.Length == 0) - { - return 0; - } - byte[] array = new byte[target.Length]; - int num = sourceStream.Read(array, start, count); - if (num == 0) - { - return -1; - } - for (int i = start; i < start + num; i++) - { - target[i] = array[i]; - } - return num; - } - - public static int ReadInput(TextReader sourceTextReader, byte[] target, int start, int count) - { - if (target.Length == 0) - { - return 0; - } - char[] array = new char[target.Length]; - int num = sourceTextReader.Read(array, start, count); - if (num == 0) - { - return -1; - } - for (int i = start; i < start + num; i++) - { - target[i] = (byte)array[i]; - } - return num; - } - - public static byte[] ToByteArray(string sourceString) - { - return Encoding.UTF8.GetBytes(sourceString); - } - - public static char[] ToCharArray(byte[] byteArray) - { - return Encoding.UTF8.GetChars(byteArray); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/SupportClass.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/SupportClass.cs.meta deleted file mode 100644 index f145dcd..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/SupportClass.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 192062774319d2845b2df445d3215268 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Tree.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Tree.cs deleted file mode 100644 index 163b300..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Tree.cs +++ /dev/null @@ -1,341 +0,0 @@ -using System; - -namespace ComponentAce.Compression.Libs.zlib -{ - internal sealed class Tree - { - private const int MAX_BITS = 15; - - private const int BL_CODES = 19; - - private const int D_CODES = 30; - - private const int LITERALS = 256; - - private const int LENGTH_CODES = 29; - - private static readonly int L_CODES = 286; - - private static readonly int HEAP_SIZE = 2 * L_CODES + 1; - - internal const int MAX_BL_BITS = 7; - - internal const int END_BLOCK = 256; - - internal const int REP_3_6 = 16; - - internal const int REPZ_3_10 = 17; - - internal const int REPZ_11_138 = 18; - - internal static readonly int[] extra_lbits = new int[29] - { - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, - 4, 4, 4, 4, 5, 5, 5, 5, 0 - }; - - internal static readonly int[] extra_dbits = new int[30] - { - 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, - 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, - 9, 9, 10, 10, 11, 11, 12, 12, 13, 13 - }; - - internal static readonly int[] extra_blbits = new int[19] - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 2, 3, 7 - }; - - internal static readonly byte[] bl_order = new byte[19] - { - 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, - 11, 4, 12, 3, 13, 2, 14, 1, 15 - }; - - internal const int Buf_size = 16; - - internal const int DIST_CODE_LEN = 512; - - internal static readonly byte[] _dist_code = new byte[512] - { - 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, - 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, - 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, - 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, - 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, - 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, - 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29 - }; - - internal static readonly byte[] _length_code = new byte[256] - { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, - 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, - 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, - 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, - 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, - 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, - 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 28 - }; - - internal static readonly int[] base_length = new int[29] - { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 10, - 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, - 64, 80, 96, 112, 128, 160, 192, 224, 0 - }; - - internal static readonly int[] base_dist = new int[30] - { - 0, 1, 2, 3, 4, 6, 8, 12, 16, 24, - 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, - 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576 - }; - - internal short[] dyn_tree; - - internal int max_code; - - internal StaticTree stat_desc; - - internal static int d_code(int dist) - { - if (dist >= 256) - { - return _dist_code[256 + SupportClass.URShift(dist, 7)]; - } - return _dist_code[dist]; - } - - internal void gen_bitlen(Deflate s) - { - short[] array = dyn_tree; - short[] static_tree = stat_desc.static_tree; - int[] extra_bits = stat_desc.extra_bits; - int extra_base = stat_desc.extra_base; - int max_length = stat_desc.max_length; - int num = 0; - for (int i = 0; i <= 15; i++) - { - s.bl_count[i] = 0; - } - array[s.heap[s.heap_max] * 2 + 1] = 0; - int j; - for (j = s.heap_max + 1; j < HEAP_SIZE; j++) - { - int num2 = s.heap[j]; - int i = array[array[num2 * 2 + 1] * 2 + 1] + 1; - if (i > max_length) - { - i = max_length; - num++; - } - array[num2 * 2 + 1] = (short)i; - if (num2 <= max_code) - { - s.bl_count[i]++; - int num3 = 0; - if (num2 >= extra_base) - { - num3 = extra_bits[num2 - extra_base]; - } - short num4 = array[num2 * 2]; - s.opt_len += num4 * (i + num3); - if (static_tree != null) - { - s.static_len += num4 * (static_tree[num2 * 2 + 1] + num3); - } - } - } - if (num == 0) - { - return; - } - do - { - int i = max_length - 1; - while (s.bl_count[i] == 0) - { - i--; - } - s.bl_count[i]--; - s.bl_count[i + 1] = (short)(s.bl_count[i + 1] + 2); - s.bl_count[max_length]--; - num -= 2; - } - while (num > 0); - for (int i = max_length; i != 0; i--) - { - int num2 = s.bl_count[i]; - while (num2 != 0) - { - int num5 = s.heap[--j]; - if (num5 <= max_code) - { - if (array[num5 * 2 + 1] != i) - { - s.opt_len = (int)(s.opt_len + ((long)i - (long)array[num5 * 2 + 1]) * array[num5 * 2]); - array[num5 * 2 + 1] = (short)i; - } - num2--; - } - } - } - } - - internal void build_tree(Deflate s) - { - short[] array = dyn_tree; - short[] static_tree = stat_desc.static_tree; - int elems = stat_desc.elems; - int num = -1; - s.heap_len = 0; - s.heap_max = HEAP_SIZE; - for (int i = 0; i < elems; i++) - { - if (array[i * 2] != 0) - { - num = (s.heap[++s.heap_len] = i); - s.depth[i] = 0; - } - else - { - array[i * 2 + 1] = 0; - } - } - int num2; - while (s.heap_len < 2) - { - num2 = (s.heap[++s.heap_len] = ((num < 2) ? (++num) : 0)); - array[num2 * 2] = 1; - s.depth[num2] = 0; - s.opt_len--; - if (static_tree != null) - { - s.static_len -= static_tree[num2 * 2 + 1]; - } - } - max_code = num; - for (int i = s.heap_len / 2; i >= 1; i--) - { - s.pqdownheap(array, i); - } - num2 = elems; - do - { - int i = s.heap[1]; - s.heap[1] = s.heap[s.heap_len--]; - s.pqdownheap(array, 1); - int num3 = s.heap[1]; - s.heap[--s.heap_max] = i; - s.heap[--s.heap_max] = num3; - array[num2 * 2] = (short)(array[i * 2] + array[num3 * 2]); - s.depth[num2] = (byte)(Math.Max(s.depth[i], s.depth[num3]) + 1); - array[i * 2 + 1] = (array[num3 * 2 + 1] = (short)num2); - s.heap[1] = num2++; - s.pqdownheap(array, 1); - } - while (s.heap_len >= 2); - s.heap[--s.heap_max] = s.heap[1]; - gen_bitlen(s); - gen_codes(array, num, s.bl_count); - } - - internal static void gen_codes(short[] tree, int max_code, short[] bl_count) - { - short[] array = new short[16]; - short num = 0; - for (int i = 1; i <= 15; i++) - { - num = (array[i] = (short)(num + bl_count[i - 1] << 1)); - } - for (int j = 0; j <= max_code; j++) - { - int num2 = tree[j * 2 + 1]; - if (num2 != 0) - { - tree[j * 2] = (short)bi_reverse(array[num2]++, num2); - } - } - } - - internal static int bi_reverse(int code, int len) - { - int num = 0; - do - { - num |= code & 1; - code = SupportClass.URShift(code, 1); - num <<= 1; - } - while (--len > 0); - return SupportClass.URShift(num, 1); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Tree.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Tree.cs.meta deleted file mode 100644 index dc2f835..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/Tree.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 09b036b3d0426fe42bf7d0dd3bd0cca9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZInputStream.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZInputStream.cs deleted file mode 100644 index 4cb829c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZInputStream.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System.IO; - -namespace ComponentAce.Compression.Libs.zlib -{ - public class ZInputStream : BinaryReader - { - protected ZStream z = new ZStream(); - - protected int bufsize = 512; - - protected int flush; - - protected byte[] buf; - - protected byte[] buf1 = new byte[1]; - - protected bool compress; - - internal Stream in_Renamed; - - internal bool nomoreinput; - - public virtual int FlushMode - { - get - { - return flush; - } - set - { - flush = value; - } - } - - public virtual long TotalIn => z.total_in; - - public virtual long TotalOut => z.total_out; - - internal void InitBlock() - { - flush = 0; - buf = new byte[bufsize]; - } - - public ZInputStream(Stream in_Renamed) - : base(in_Renamed) - { - InitBlock(); - this.in_Renamed = in_Renamed; - z.inflateInit(); - compress = false; - z.next_in = buf; - z.next_in_index = 0; - z.avail_in = 0; - } - - public ZInputStream(Stream in_Renamed, int level) - : base(in_Renamed) - { - InitBlock(); - this.in_Renamed = in_Renamed; - z.deflateInit(level); - compress = true; - z.next_in = buf; - z.next_in_index = 0; - z.avail_in = 0; - } - - public override int Read() - { - if (read(buf1, 0, 1) == -1) - { - return -1; - } - return buf1[0] & 0xFF; - } - - public int read(byte[] b, int off, int len) - { - if (len == 0) - { - return 0; - } - z.next_out = b; - z.next_out_index = off; - z.avail_out = len; - int num; - do - { - if (z.avail_in == 0 && !nomoreinput) - { - z.next_in_index = 0; - z.avail_in = SupportClass.ReadInput(in_Renamed, buf, 0, bufsize); - if (z.avail_in == -1) - { - z.avail_in = 0; - nomoreinput = true; - } - } - num = ((!compress) ? z.inflate(flush) : z.deflate(flush)); - if (nomoreinput && num == -5) - { - return -1; - } - if (num != 0 && num != 1) - { - throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); - } - if (nomoreinput && z.avail_out == len) - { - return -1; - } - } - while (z.avail_out == len && num == 0); - return len - z.avail_out; - } - - public long skip(long n) - { - int num = 512; - if (n < num) - { - num = (int)n; - } - byte[] array = new byte[num]; - return SupportClass.ReadInput(BaseStream, array, 0, array.Length); - } - - public override void Close() - { - in_Renamed.Close(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZInputStream.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZInputStream.cs.meta deleted file mode 100644 index e9ed2b9..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZInputStream.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 005058a4e4fb325449d934f67cfa0ce9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZOutputStream.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZOutputStream.cs deleted file mode 100644 index 0681b55..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZOutputStream.cs +++ /dev/null @@ -1,193 +0,0 @@ -using System; -using System.IO; - -namespace ComponentAce.Compression.Libs.zlib -{ - public class ZOutputStream : Stream - { - protected internal ZStream z = new ZStream(); - - protected internal int bufsize = 4096; - - protected internal int flush_Renamed_Field; - - protected internal byte[] buf; - - protected internal byte[] buf1 = new byte[1]; - - protected internal bool compress; - - private Stream out_Renamed; - - public virtual int FlushMode - { - get - { - return flush_Renamed_Field; - } - set - { - flush_Renamed_Field = value; - } - } - - public virtual long TotalIn => z.total_in; - - public virtual long TotalOut => z.total_out; - - public override bool CanRead => false; - - public override bool CanSeek => false; - - public override bool CanWrite => false; - - public override long Length => 0L; - - public override long Position - { - get - { - return 0L; - } - set - { - } - } - - private void InitBlock() - { - flush_Renamed_Field = 0; - buf = new byte[bufsize]; - } - - public ZOutputStream(Stream out_Renamed) - { - InitBlock(); - this.out_Renamed = out_Renamed; - z.inflateInit(); - compress = false; - } - - public ZOutputStream(Stream out_Renamed, int level) - { - InitBlock(); - this.out_Renamed = out_Renamed; - z.deflateInit(level); - compress = true; - } - - public void WriteByte(int b) - { - buf1[0] = (byte)b; - Write(buf1, 0, 1); - } - - public override void WriteByte(byte b) - { - WriteByte(b); - } - - public override void Write(byte[] b1, int off, int len) - { - if (len == 0) - { - return; - } - byte[] array = new byte[b1.Length]; - Array.Copy(b1, 0, array, 0, b1.Length); - z.next_in = array; - z.next_in_index = off; - z.avail_in = len; - do - { - z.next_out = buf; - z.next_out_index = 0; - z.avail_out = bufsize; - int num = ((!compress) ? z.inflate(flush_Renamed_Field) : z.deflate(flush_Renamed_Field)); - if (num != 0 && num != 1) - { - throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); - } - out_Renamed.Write(buf, 0, bufsize - z.avail_out); - } - while (z.avail_in > 0 || z.avail_out == 0); - } - - public virtual void finish() - { - do - { - z.next_out = buf; - z.next_out_index = 0; - z.avail_out = bufsize; - int num = ((!compress) ? z.inflate(4) : z.deflate(4)); - if (num != 1 && num != 0) - { - throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); - } - if (bufsize - z.avail_out > 0) - { - out_Renamed.Write(buf, 0, bufsize - z.avail_out); - } - } - while (z.avail_in > 0 || z.avail_out == 0); - try - { - Flush(); - } - catch - { - } - } - - public virtual void end() - { - if (compress) - { - z.deflateEnd(); - } - else - { - z.inflateEnd(); - } - z.free(); - z = null; - } - - public override void Close() - { - try - { - finish(); - } - catch - { - } - finally - { - end(); - out_Renamed.Close(); - out_Renamed = null; - } - } - - public override void Flush() - { - out_Renamed.Flush(); - } - - public override int Read(byte[] buffer, int offset, int count) - { - return 0; - } - - public override void SetLength(long value) - { - } - - public override long Seek(long offset, SeekOrigin origin) - { - return 0L; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZOutputStream.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZOutputStream.cs.meta deleted file mode 100644 index 569e09b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZOutputStream.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7c3c209ceb37db9499856d560dffd88e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStream.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStream.cs deleted file mode 100644 index c94d957..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStream.cs +++ /dev/null @@ -1,224 +0,0 @@ -using System; - -namespace ComponentAce.Compression.Libs.zlib -{ - public sealed class ZStream - { - private const int MAX_WBITS = 15; - - private static readonly int DEF_WBITS = 15; - - private const int Z_NO_FLUSH = 0; - - private const int Z_PARTIAL_FLUSH = 1; - - private const int Z_SYNC_FLUSH = 2; - - private const int Z_FULL_FLUSH = 3; - - private const int Z_FINISH = 4; - - private const int MAX_MEM_LEVEL = 9; - - private const int Z_OK = 0; - - private const int Z_STREAM_END = 1; - - private const int Z_NEED_DICT = 2; - - private const int Z_ERRNO = -1; - - private const int Z_STREAM_ERROR = -2; - - private const int Z_DATA_ERROR = -3; - - private const int Z_MEM_ERROR = -4; - - private const int Z_BUF_ERROR = -5; - - private const int Z_VERSION_ERROR = -6; - - public byte[] next_in; - - public int next_in_index; - - public int avail_in; - - public long total_in; - - public byte[] next_out; - - public int next_out_index; - - public int avail_out; - - public long total_out; - - public string msg; - - internal Deflate dstate; - - internal Inflate istate; - - internal int data_type; - - public long adler; - - internal Adler32 _adler = new Adler32(); - - public int inflateInit() - { - return inflateInit(DEF_WBITS); - } - - public int inflateInit(int w) - { - istate = new Inflate(); - return istate.inflateInit(this, w); - } - - public int inflate(int f) - { - if (istate == null) - { - return -2; - } - return istate.inflate(this, f); - } - - public int inflateEnd() - { - if (istate == null) - { - return -2; - } - int result = istate.inflateEnd(this); - istate = null; - return result; - } - - public int inflateSync() - { - if (istate == null) - { - return -2; - } - return istate.inflateSync(this); - } - - public int inflateSetDictionary(byte[] dictionary, int dictLength) - { - if (istate == null) - { - return -2; - } - return istate.inflateSetDictionary(this, dictionary, dictLength); - } - - public int deflateInit(int level) - { - return deflateInit(level, 15); - } - - public int deflateInit(int level, int bits) - { - dstate = new Deflate(); - return dstate.deflateInit(this, level, bits); - } - - public int deflate(int flush) - { - if (dstate == null) - { - return -2; - } - return dstate.deflate(this, flush); - } - - public int deflateEnd() - { - if (dstate == null) - { - return -2; - } - int result = dstate.deflateEnd(); - dstate = null; - return result; - } - - public int deflateParams(int level, int strategy) - { - if (dstate == null) - { - return -2; - } - return dstate.deflateParams(this, level, strategy); - } - - public int deflateSetDictionary(byte[] dictionary, int dictLength) - { - if (dstate == null) - { - return -2; - } - return dstate.deflateSetDictionary(this, dictionary, dictLength); - } - - internal void flush_pending() - { - int pending = dstate.pending; - if (pending > avail_out) - { - pending = avail_out; - } - if (pending != 0) - { - if (dstate.pending_buf.Length > dstate.pending_out && next_out.Length > next_out_index && dstate.pending_buf.Length >= dstate.pending_out + pending) - { - _ = next_out.Length; - _ = next_out_index + pending; - } - Array.Copy(dstate.pending_buf, dstate.pending_out, next_out, next_out_index, pending); - next_out_index += pending; - dstate.pending_out += pending; - total_out += pending; - avail_out -= pending; - dstate.pending -= pending; - if (dstate.pending == 0) - { - dstate.pending_out = 0; - } - } - } - - internal int read_buf(byte[] buf, int start, int size) - { - int num = avail_in; - if (num > size) - { - num = size; - } - if (num == 0) - { - return 0; - } - avail_in -= num; - if (dstate.noheader == 0) - { - adler = _adler.adler32(adler, next_in, next_in_index, num); - } - Array.Copy(next_in, next_in_index, buf, start, num); - next_in_index += num; - total_in += num; - return num; - } - - public void free() - { - next_in = null; - next_out = null; - msg = null; - _adler = null; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStream.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStream.cs.meta deleted file mode 100644 index fd3afb8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStream.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a7dac276d0775834da0bd77f4b3bca54 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStreamException.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStreamException.cs deleted file mode 100644 index 5d3cf67..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStreamException.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.IO; - -namespace ComponentAce.Compression.Libs.zlib -{ - public class ZStreamException : IOException - { - public ZStreamException() - { - } - - public ZStreamException(string s) - : base(s) - { - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStreamException.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStreamException.cs.meta deleted file mode 100644 index 865aa54..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/ZStreamException.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9059b75bb33b8f546a3634f6c1f15418 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/zlibConst.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/zlibConst.cs deleted file mode 100644 index 3211281..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/zlibConst.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace ComponentAce.Compression.Libs.zlib -{ - public sealed class zlibConst - { - private const string version_Renamed_Field = "1.0.2"; - - public const int Z_NO_COMPRESSION = 0; - - public const int Z_BEST_SPEED = 1; - - public const int Z_BEST_COMPRESSION = 9; - - public const int Z_DEFAULT_COMPRESSION = -1; - - public const int Z_FILTERED = 1; - - public const int Z_HUFFMAN_ONLY = 2; - - public const int Z_DEFAULT_STRATEGY = 0; - - public const int Z_NO_FLUSH = 0; - - public const int Z_PARTIAL_FLUSH = 1; - - public const int Z_SYNC_FLUSH = 2; - - public const int Z_FULL_FLUSH = 3; - - public const int Z_FINISH = 4; - - public const int Z_OK = 0; - - public const int Z_STREAM_END = 1; - - public const int Z_NEED_DICT = 2; - - public const int Z_ERRNO = -1; - - public const int Z_STREAM_ERROR = -2; - - public const int Z_DATA_ERROR = -3; - - public const int Z_MEM_ERROR = -4; - - public const int Z_BUF_ERROR = -5; - - public const int Z_VERSION_ERROR = -6; - - public static string version() - { - return "1.0.2"; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/zlibConst.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/zlibConst.cs.meta deleted file mode 100644 index d5c4e96..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib/zlibConst.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 189574d77199372408e8e294f65e987a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Crc32.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Crc32.cs deleted file mode 100644 index db98f0f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Crc32.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System.Security.Cryptography; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class Crc32 : HashAlgorithm - { - public const uint DefaultPolynomial = 3988292384u; - - public const uint DefaultSeed = uint.MaxValue; - - private uint hash; - - private uint seed; - - private uint[] table; - - private static uint[] defaultTable; - - public override int HashSize => 32; - - public Crc32() - { - table = InitializeTable(3988292384u); - seed = uint.MaxValue; - Initialize(); - } - - public Crc32(uint polynomial, uint seed) - { - table = InitializeTable(polynomial); - this.seed = seed; - Initialize(); - } - - public override void Initialize() - { - hash = seed; - } - - protected override void HashCore(byte[] buffer, int start, int length) - { - hash = CalculateHash(table, hash, buffer, start, length); - } - - protected override byte[] HashFinal() - { - return HashValue = UInt32ToBigEndianBytes(~hash); - } - - public static uint Compute(byte[] buffer) - { - return ~CalculateHash(InitializeTable(3988292384u), uint.MaxValue, buffer, 0, buffer.Length); - } - - public static uint Compute(uint seed, byte[] buffer) - { - return ~CalculateHash(InitializeTable(3988292384u), seed, buffer, 0, buffer.Length); - } - - public static uint Compute(uint polynomial, uint seed, byte[] buffer) - { - return ~CalculateHash(InitializeTable(polynomial), seed, buffer, 0, buffer.Length); - } - - private static uint[] InitializeTable(uint polynomial) - { - if (polynomial == 3988292384u && defaultTable != null) - { - return defaultTable; - } - uint[] array = new uint[256]; - for (int i = 0; i < 256; i++) - { - uint num = (uint)i; - for (int j = 0; j < 8; j++) - { - num = (((num & 1) != 1) ? (num >> 1) : ((num >> 1) ^ polynomial)); - } - array[i] = num; - } - if (polynomial == 3988292384u) - { - defaultTable = array; - } - return array; - } - - private static uint CalculateHash(uint[] table, uint seed, byte[] buffer, int start, int size) - { - uint num = seed; - for (int i = start; i < size; i++) - { - num = (num >> 8) ^ table[buffer[i] ^ (num & 0xFF)]; - } - return num; - } - - private byte[] UInt32ToBigEndianBytes(uint x) - { - return new byte[4] - { - (byte)((x >> 24) & 0xFFu), - (byte)((x >> 16) & 0xFFu), - (byte)((x >> 8) & 0xFFu), - (byte)(x & 0xFFu) - }; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Crc32.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Crc32.cs.meta deleted file mode 100644 index 1b43454..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Crc32.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6735365dc98ead64aacb1d9fa1b79cbc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuRegion.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuRegion.cs deleted file mode 100644 index 3c162cb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuRegion.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace MyNes.Core -{ - public enum EmuRegion - { - NTSC, - PALB, - DENDY - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuRegion.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuRegion.cs.meta deleted file mode 100644 index 94d3767..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuRegion.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f091eb23796c9f2469aca986fc0c75d6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuSettings.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuSettings.cs deleted file mode 100644 index 6718559..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuSettings.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class EmuSettings : ISettings - { - public string SnapsFolder = "Snaps"; - - public string WavesFolder = "SoundRecords"; - - public string SnapsFormat = ".png"; - - public bool SnapsReplace; - - public int RegionSetting; - - public string StateFolder = "States"; - - public string GameGenieFolder = "GMCodes"; - - public string SRAMFolder = "Srams"; - - public bool SaveSRAMAtEmuShutdown = true; - - public EmuSettings(string path) - : base(path) - { - } - - public override void LoadSettings() - { - base.LoadSettings(); - if (MyNesMain.WorkingFolder == null) - { - MyNesMain.MakeWorkingFolder(); - } - if (SnapsFolder == "Snaps") - { - SnapsFolder = Path.Combine(MyNesMain.WorkingFolder, "Snaps"); - } - if (StateFolder == "States") - { - StateFolder = Path.Combine(MyNesMain.WorkingFolder, "States"); - } - if (GameGenieFolder == "GMCodes") - { - GameGenieFolder = Path.Combine(MyNesMain.WorkingFolder, "GMCodes"); - } - if (SRAMFolder == "Srams") - { - SRAMFolder = Path.Combine(MyNesMain.WorkingFolder, "Srams"); - } - if (WavesFolder == "SoundRecords") - { - WavesFolder = Path.Combine(MyNesMain.WorkingFolder, "SoundRecords"); - } - try - { - Directory.CreateDirectory(WavesFolder); - } - catch - { - Tracer.WriteError("Cannot create sound records folder !!"); - } - try - { - Directory.CreateDirectory(SnapsFolder); - } - catch - { - Tracer.WriteError("Cannot create snaps folder !!"); - } - try - { - Directory.CreateDirectory(StateFolder); - } - catch - { - Tracer.WriteError("Cannot create states folder !!"); - } - try - { - Directory.CreateDirectory(SRAMFolder); - } - catch - { - Tracer.WriteError("Cannot create srams folder !!"); - } - try - { - Directory.CreateDirectory(GameGenieFolder); - } - catch - { - Tracer.WriteError("Cannot create game genie codes folder !!"); - } - StateHandler.StateFolder = StateFolder; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuSettings.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuSettings.cs.meta deleted file mode 100644 index 273ac16..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/EmuSettings.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f3b3769eaf4c4d54f9ac64295acde90b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Eprom.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Eprom.cs deleted file mode 100644 index a0dcfa3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Eprom.cs +++ /dev/null @@ -1,387 +0,0 @@ -using System; -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class Eprom - { - private enum EpromDevice - { - X24C01, - X24C02 - } - - private enum EpromMode - { - Data, - Addressing, - Idle, - Read, - Write, - Ack, - NotAck, - AckWait - } - - private byte[] data; - - private EpromMode mode; - - private EpromMode nextmode; - - private EpromDevice device; - - private bool psda; - - private bool pscl; - - private int output; - - private int cbit; - - private int caddress; - - private int cdata; - - private bool isRead; - - private bool cSCL; - - private bool cSDA; - - public Eprom(int memorySize) - { - Console.WriteLine("Initializing Eprom ..."); - data = new byte[memorySize]; - device = ((memorySize == 256) ? EpromDevice.X24C02 : EpromDevice.X24C01); - Console.WriteLine("Eprom memory size = " + memorySize); - Console.WriteLine("Eprom device = " + device); - } - - public void HardReset() - { - pscl = false; - psda = false; - mode = EpromMode.Idle; - nextmode = EpromMode.Idle; - cbit = 0; - caddress = 0; - cdata = 0; - isRead = false; - output = 16; - } - - public void Write(int address, byte data) - { - cSCL = (data & 0x20) == 32; - cSDA = (data & 0x40) == 64; - if (pscl && (!cSDA & psda)) - { - Start(); - } - else if (pscl && (cSDA & !psda)) - { - Stop(); - } - else if (cSCL & !pscl) - { - switch (device) - { - case EpromDevice.X24C01: - RiseX24C01((data >> 6) & 1); - break; - case EpromDevice.X24C02: - RiseX24C02((data >> 6) & 1); - break; - } - } - else if (!cSCL & pscl) - { - switch (device) - { - case EpromDevice.X24C01: - FallX24C01(); - break; - case EpromDevice.X24C02: - FallX24C02(); - break; - } - } - pscl = cSCL; - psda = cSDA; - } - - public byte Read(int address) - { - return (byte)output; - } - - private void Start() - { - switch (device) - { - case EpromDevice.X24C01: - mode = EpromMode.Addressing; - cbit = 0; - caddress = 0; - output = 16; - break; - case EpromDevice.X24C02: - mode = EpromMode.Data; - cbit = 0; - output = 16; - break; - } - } - - private void Stop() - { - mode = EpromMode.Idle; - output = 16; - } - - private void RiseX24C01(int bit) - { - switch (mode) - { - case EpromMode.Addressing: - if (cbit < 7) - { - caddress &= ~(1 << cbit); - caddress |= bit << cbit++; - } - else if (cbit < 8) - { - cbit = 8; - if (bit != 0) - { - nextmode = EpromMode.Read; - cdata = data[caddress]; - } - else - { - nextmode = EpromMode.Write; - } - } - break; - case EpromMode.Ack: - output = 0; - break; - case EpromMode.Read: - if (cbit < 8) - { - output = (((cdata & (1 << cbit++)) != 0) ? 16 : 0); - } - break; - case EpromMode.Write: - if (cbit < 8) - { - cdata &= ~(1 << cbit); - cdata |= bit << cbit++; - } - break; - case EpromMode.AckWait: - if (bit == 0) - { - nextmode = EpromMode.Idle; - } - break; - case EpromMode.Idle: - case EpromMode.NotAck: - break; - } - } - - private void RiseX24C02(int bit) - { - switch (mode) - { - case EpromMode.Data: - if (cbit < 8) - { - cdata &= ~(1 << 7 - cbit); - cdata |= bit << 7 - cbit++; - } - break; - case EpromMode.Addressing: - if (cbit < 8) - { - caddress &= ~(1 << 7 - cbit); - caddress |= bit << 7 - cbit++; - } - break; - case EpromMode.Read: - if (cbit < 8) - { - output = (((cdata & (1 << 7 - cbit++)) != 0) ? 16 : 0); - } - break; - case EpromMode.Write: - if (cbit < 8) - { - cdata &= ~(1 << 7 - cbit); - cdata |= bit << 7 - cbit++; - } - break; - case EpromMode.NotAck: - output = 16; - break; - case EpromMode.Ack: - output = 0; - break; - case EpromMode.AckWait: - if (bit == 0) - { - nextmode = EpromMode.Read; - cdata = data[caddress]; - } - break; - case EpromMode.Idle: - break; - } - } - - private void FallX24C01() - { - switch (mode) - { - case EpromMode.Addressing: - if (cbit == 8) - { - mode = EpromMode.Ack; - output = 16; - } - break; - case EpromMode.Ack: - mode = nextmode; - cbit = 0; - output = 16; - break; - case EpromMode.Read: - if (cbit == 8) - { - mode = EpromMode.AckWait; - caddress = (caddress + 1) & 0x7F; - } - break; - case EpromMode.Write: - if (cbit == 8) - { - mode = EpromMode.Ack; - nextmode = EpromMode.Idle; - data[caddress] = (byte)cdata; - caddress = (caddress + 1) & 0x7F; - } - break; - case EpromMode.Idle: - break; - } - } - - private void FallX24C02() - { - switch (mode) - { - case EpromMode.Data: - if (cbit != 8) - { - break; - } - if ((cdata & 0xA0) == 160) - { - cbit = 0; - mode = EpromMode.Ack; - isRead = (cdata & 1) == 1; - output = 16; - if (isRead) - { - nextmode = EpromMode.Read; - cdata = data[caddress]; - } - else - { - nextmode = EpromMode.Addressing; - } - } - else - { - mode = EpromMode.NotAck; - nextmode = EpromMode.Idle; - output = 16; - } - break; - case EpromMode.Addressing: - if (cbit == 8) - { - cbit = 0; - mode = EpromMode.Ack; - nextmode = (isRead ? EpromMode.Idle : EpromMode.Write); - output = 16; - } - break; - case EpromMode.Read: - if (cbit == 8) - { - mode = EpromMode.AckWait; - caddress = (caddress + 1) & 0xFF; - } - break; - case EpromMode.Write: - if (cbit == 8) - { - cbit = 0; - mode = EpromMode.Ack; - nextmode = EpromMode.Write; - data[caddress] = (byte)cdata; - caddress = (caddress + 1) & 0xFF; - } - break; - case EpromMode.NotAck: - mode = EpromMode.Idle; - cbit = 0; - output = 16; - break; - case EpromMode.Ack: - case EpromMode.AckWait: - mode = nextmode; - cbit = 0; - output = 16; - break; - case EpromMode.Idle: - break; - } - } - - public void SaveState(BinaryWriter stream) - { - stream.Write(data); - stream.Write((int)mode); - stream.Write((int)nextmode); - stream.Write(psda); - stream.Write(pscl); - stream.Write(output); - stream.Write(cbit); - stream.Write(caddress); - stream.Write(cdata); - stream.Write(isRead); - } - - public void LoadState(BinaryReader stream) - { - stream.Read(data, 0, data.Length); - mode = (EpromMode)stream.ReadInt32(); - nextmode = (EpromMode)stream.ReadInt32(); - psda = stream.ReadBoolean(); - pscl = stream.ReadBoolean(); - output = stream.ReadInt32(); - cbit = stream.ReadInt32(); - caddress = stream.ReadInt32(); - cdata = stream.ReadInt32(); - isRead = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Eprom.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Eprom.cs.meta deleted file mode 100644 index bfc4ec5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Eprom.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bf9a039fae5474f4d9699753440312cf -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/FFE.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/FFE.cs deleted file mode 100644 index 880b175..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/FFE.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal abstract class FFE : Board - { - protected bool irqEnable; - - protected int irqCounter; - - internal override void WriteEX(ref ushort address, ref byte data) - { - switch (address) - { - case 17665: - irqEnable = false; - NesEmu.IRQFlags &= -9; - break; - case 17666: - irqCounter = (irqCounter & 0xFF00) | data; - break; - case 17667: - irqEnable = true; - irqCounter = (irqCounter & 0xFF) | (data << 8); - break; - } - } - - internal override void OnCPUClock() - { - if (irqEnable) - { - irqCounter++; - if (irqCounter >= 65535) - { - irqCounter = 0; - NesEmu.IRQFlags |= 8; - } - } - } - - internal override void WriteStateData(ref BinaryWriter bin) - { - base.WriteStateData(ref bin); - bin.Write(irqEnable); - bin.Write(irqCounter); - } - - internal override void ReadStateData(ref BinaryReader bin) - { - base.ReadStateData(ref bin); - irqEnable = bin.ReadBoolean(); - irqCounter = bin.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/FFE.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/FFE.cs.meta deleted file mode 100644 index 85c1a4e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/FFE.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 05457d6300519b04a966034b34ad95df -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenie.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenie.cs deleted file mode 100644 index 29c8c57..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenie.cs +++ /dev/null @@ -1,156 +0,0 @@ -using System.Collections.Generic; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class GameGenie - { - public string[] LettersTable = new string[16] - { - "A", "P", "Z", "L", "G", "I", "T", "Y", "E", "O", - "X", "U", "K", "S", "V", "N" - }; - - public byte[] HEXTable = new byte[16] - { - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 10, 11, 12, 13, 14, 15 - }; - - private List lettersTable = new List(); - - public GameGenie() - { - lettersTable = new List(LettersTable); - } - - public int GetCodeAsHEX(string code) - { - int num = 0; - int num2 = code.ToCharArray().Length - 1; - char[] array = code.ToCharArray(); - foreach (char c in array) - { - num |= HEXTable[lettersTable.IndexOf(c.ToString())] << num2 * 4; - num2--; - } - return num; - } - - public byte GetGGValue(int code, int length) - { - int num = 0; - int num2 = 0; - int num3 = 0; - int num4 = 0; - int num5 = 0; - int num6 = 0; - int num7 = 0; - int num8 = 0; - switch (length) - { - case 6: - num8 = (code & 0x800000) >> 23; - num7 = (code & 0x40000) >> 18; - num6 = (code & 0x20000) >> 17; - num5 = (code & 0x10000) >> 16; - num4 = (code & 8) >> 3; - num3 = (code & 0x400000) >> 22; - num2 = (code & 0x200000) >> 21; - num = (code & 0x100000) >> 20; - break; - case 8: - num8 = (code >> 31) & 1; - num7 = (code >> 27) & 1; - num6 = (code >> 26) & 1; - num5 = (code >> 25) & 1; - num4 = (code >> 3) & 1; - num3 = (code >> 30) & 1; - num2 = (code >> 29) & 1; - num = (code >> 28) & 1; - break; - } - return (byte)((num8 << 7) | (num7 << 6) | (num6 << 5) | (num5 << 4) | (num4 << 3) | (num3 << 2) | (num2 << 1) | num); - } - - public int GetGGAddress(int code, int length) - { - int num = 0; - int num2 = 0; - int num3 = 0; - int num4 = 0; - int num5 = 0; - int num6 = 0; - int num7 = 0; - int num8 = 0; - int num9 = 0; - int num10 = 0; - int num11 = 0; - int num12 = 0; - int num13 = 0; - int num14 = 0; - int num15 = 0; - switch (length) - { - case 6: - num15 = (code >> 10) & 1; - num14 = (code >> 9) & 1; - num13 = (code >> 8) & 1; - num12 = (code >> 7) & 1; - num11 = (code >> 2) & 1; - num10 = (code >> 1) & 1; - num9 = code & 1; - num8 = (code >> 19) & 1; - num7 = (code >> 14) & 1; - num6 = (code >> 13) & 1; - num5 = (code >> 12) & 1; - num4 = (code >> 11) & 1; - num3 = (code >> 6) & 1; - num2 = (code >> 5) & 1; - num = (code >> 4) & 1; - break; - case 8: - num15 = (code >> 18) & 1; - num14 = (code >> 17) & 1; - num13 = (code >> 16) & 1; - num12 = (code >> 15) & 1; - num11 = (code >> 10) & 1; - num10 = (code >> 9) & 1; - num9 = (code >> 8) & 1; - num8 = (code >> 25) & 1; - num7 = (code >> 22) & 1; - num6 = (code >> 21) & 1; - num5 = (code >> 20) & 1; - num4 = (code >> 19) & 1; - num3 = (code >> 14) & 1; - num2 = (code >> 13) & 1; - num = (code >> 12) & 1; - break; - } - return (num15 << 14) | (num14 << 13) | (num13 << 12) | (num12 << 11) | (num11 << 10) | (num10 << 9) | (num9 << 8) | (num8 << 7) | (num7 << 6) | (num6 << 5) | (num5 << 4) | (num4 << 3) | (num3 << 2) | (num2 << 1) | num; - } - - public byte GetGGCompareValue(int code) - { - int num = 0; - int num2 = 0; - int num3 = 0; - int num4 = 0; - int num5 = 0; - int num6 = 0; - int num7 = 0; - int num8 = (code >> 7) & 1; - num7 = (code >> 2) & 1; - num6 = (code >> 1) & 1; - num5 = code & 1; - num4 = (code >> 11) & 1; - num3 = (code >> 6) & 1; - num2 = (code >> 5) & 1; - num = (code >> 4) & 1; - return (byte)((num8 << 7) | (num7 << 6) | (num6 << 5) | (num5 << 4) | (num4 << 3) | (num3 << 2) | (num2 << 1) | num); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenie.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenie.cs.meta deleted file mode 100644 index 8cde216..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenie.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c440f367166527145bec0f405ad3b587 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenieCode.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenieCode.cs deleted file mode 100644 index b7bc201..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenieCode.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyNes.Core -{ - public struct GameGenieCode - { - public string Name; - - public string Descreption; - - public int Address; - - public byte Compare; - - public byte Value; - - public bool IsCompare; - - public bool Enabled; - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenieCode.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenieCode.cs.meta deleted file mode 100644 index 2237c1d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/GameGenieCode.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0be47c6f15a83aa48b41cf4e18b98e6d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/GetIsPlaying.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/GetIsPlaying.cs deleted file mode 100644 index 1fb3f87..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/GetIsPlaying.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace MyNes.Core -{ - internal delegate void GetIsPlaying(out bool playing); -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/GetIsPlaying.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/GetIsPlaying.cs.meta deleted file mode 100644 index 9a59786..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/GetIsPlaying.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d5e4818002a2f3140b2da0af5b1639fa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/HassIssuesAttribute.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/HassIssuesAttribute.cs deleted file mode 100644 index f7b92d3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/HassIssuesAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class HassIssuesAttribute : Attribute - { - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/HassIssuesAttribute.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/HassIssuesAttribute.cs.meta deleted file mode 100644 index 66e381d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/HassIssuesAttribute.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4ea93c2200789cd499484183e415c4c6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/HelperTools.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/HelperTools.cs deleted file mode 100644 index c7d1077..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/HelperTools.cs +++ /dev/null @@ -1,178 +0,0 @@ -using System.IO; -using System.Security.Cryptography; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class HelperTools - { - public static string GetFileSize(string FilePath) - { - if (File.Exists(Path.GetFullPath(FilePath))) - { - FileInfo fileInfo = new FileInfo(FilePath); - string text = " Byte"; - double num = fileInfo.Length; - if (fileInfo.Length >= 1024) - { - num = (double)fileInfo.Length / 1024.0; - text = " KB"; - } - if (num >= 1024.0) - { - num /= 1024.0; - text = " MB"; - } - if (num >= 1024.0) - { - num /= 1024.0; - text = " GB"; - } - return num.ToString("F2") + text; - } - return ""; - } - - public static string GetSize(long size) - { - string text = " Byte"; - double num = size; - if (size >= 1024) - { - num = (double)size / 1024.0; - text = " KB"; - } - if (num >= 1024.0) - { - num /= 1024.0; - text = " MB"; - } - if (num >= 1024.0) - { - num /= 1024.0; - text = " GB"; - } - if (num < 0.0) - { - return "???"; - } - return num.ToString("F2") + text; - } - - public static string GetSize(ulong size) - { - string text = " Byte"; - double num = size; - if (size >= 1024) - { - num = (double)size / 1024.0; - text = " KB"; - } - if (num >= 1024.0) - { - num /= 1024.0; - text = " MB"; - } - if (num >= 1024.0) - { - num /= 1024.0; - text = " GB"; - } - if (num < 0.0) - { - return "???"; - } - return num.ToString("F2") + text; - } - - public static long GetSizeAsBytes(string FilePath) - { - if (File.Exists(FilePath)) - { - return new FileInfo(FilePath).Length; - } - return 0L; - } - - public static bool IsStringContainsNumbers(string text) - { - char[] array = text.ToCharArray(); - foreach (char c in array) - { - int result = 0; - if (int.TryParse(c.ToString(), out result)) - { - return true; - } - } - return false; - } - - public static string CalculateCRC(string filePath) - { - if (File.Exists(filePath)) - { - Stream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); - byte[] buffer = new byte[stream.Length]; - stream.Read(buffer, 0, (int)stream.Length); - stream.Close(); - string text = ""; - byte[] array = new Crc32().ComputeHash(buffer); - foreach (byte b in array) - { - text += b.ToString("x2").ToLower(); - } - return text; - } - return ""; - } - - public static string CalculateCRC(string filePath, int bytesToSkip) - { - if (File.Exists(filePath)) - { - Stream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); - stream.Read(new byte[bytesToSkip], 0, bytesToSkip); - byte[] buffer = new byte[stream.Length - bytesToSkip]; - stream.Read(buffer, 0, (int)(stream.Length - bytesToSkip)); - stream.Close(); - string text = ""; - byte[] array = new Crc32().ComputeHash(buffer); - foreach (byte b in array) - { - text += b.ToString("x2").ToLower(); - } - return text; - } - return ""; - } - - public static string CalculateSHA1(string filePath) - { - if (File.Exists(filePath)) - { - byte[] buffer = GetBuffer(filePath); - string text = ""; - byte[] array = new SHA1Managed().ComputeHash(buffer); - foreach (byte b in array) - { - text += b.ToString("x2").ToLower(); - } - return text; - } - return ""; - } - - public static byte[] GetBuffer(string filePath) - { - Stream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); - byte[] array = new byte[stream.Length]; - stream.Read(array, 0, (int)stream.Length); - stream.Close(); - return array; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/HelperTools.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/HelperTools.cs.meta deleted file mode 100644 index 1b20073..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/HelperTools.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6edadafe72c2a374fb7abbbf03b14cb6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IAudioProvider.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/IAudioProvider.cs deleted file mode 100644 index 6388e3b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IAudioProvider.cs +++ /dev/null @@ -1,29 +0,0 @@ -namespace MyNes.Core -{ - public interface IAudioProvider - { - string Name { get; } - - string ID { get; } - - bool AllowBufferChange { get; } - - bool AllowFrequencyChange { get; } - - void SubmitSamples(ref short[] buffer, ref int samples_added); - - void TogglePause(bool paused); - - void GetIsPlaying(out bool playing); - - void Initialize(); - - void ShutDown(); - - void Reset(); - - void SignalToggle(bool started); - - void SetVolume(int Vol); - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IAudioProvider.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/IAudioProvider.cs.meta deleted file mode 100644 index c38a282..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IAudioProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4366c4b2360b48d4c87ff24651f8dec8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IJoypadConnecter.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/IJoypadConnecter.cs deleted file mode 100644 index f5e4bd8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IJoypadConnecter.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public abstract class IJoypadConnecter - { - protected byte DATA; - - public abstract void Update(); - - public virtual void Destroy() - { - } - - public virtual byte GetData() - { - return DATA; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IJoypadConnecter.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/IJoypadConnecter.cs.meta deleted file mode 100644 index fbbe109..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IJoypadConnecter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c613333925a94f44c85ef86668ea7636 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/INes.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/INes.cs deleted file mode 100644 index 489789b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/INes.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System.IO; -using System.Security.Cryptography; - -namespace MyNes.Core -{ - public class INes : IRom - { - public bool HasBattery { get; private set; } - - public bool IsPlaychoice10 { get; private set; } - - public bool IsVSUnisystem { get; private set; } - - public override void Load(string fileName, bool loadDumps) - { - var fileStream = MyNesMain.Supporter.OpenRomFile(fileName); - if (fileStream.Length < 16) - { - fileStream.Close(); - base.IsValid = false; - return; - } - byte[] array = new byte[16]; - fileStream.Read(array, 0, 16); - byte[] buffer = new byte[fileStream.Length - 16]; - fileStream.Read(buffer, 0, (int)(fileStream.Length - 16)); - base.SHA1 = ""; - byte[] array2 = new SHA1Managed().ComputeHash(buffer); - foreach (byte b in array2) - { - base.SHA1 += b.ToString("x2").ToLower(); - } - if (array[0] != 78 || array[1] != 69 || array[2] != 83 || array[3] != 26) - { - fileStream.Close(); - base.IsValid = false; - return; - } - base.PRGCount = array[4]; - base.CHRCount = array[5]; - switch (array[6] & 9) - { - case 0: - base.Mirroring = Mirroring.Horz; - break; - case 1: - base.Mirroring = Mirroring.Vert; - break; - case 8: - case 9: - base.Mirroring = Mirroring.Full; - break; - } - HasBattery = (array[6] & 2) != 0; - base.HasTrainer = (array[6] & 4) != 0; - if ((array[7] & 0xF) == 0) - { - base.MapperNumber = (byte)((array[7] & 0xF0) | (array[6] >> 4)); - } - else - { - base.MapperNumber = (byte)(array[6] >> 4); - } - IsVSUnisystem = (array[7] & 1) != 0; - IsPlaychoice10 = (array[7] & 2) != 0; - if (loadDumps) - { - fileStream.Seek(16L, SeekOrigin.Begin); - if (base.HasTrainer) - { - base.Trainer = new byte[512]; - fileStream.Read(base.Trainer, 0, 512); - } - else - { - base.Trainer = new byte[0]; - } - base.PRG = new byte[base.PRGCount * 16384]; - fileStream.Read(base.PRG, 0, base.PRGCount * 16384); - if (base.CHRCount > 0) - { - base.CHR = new byte[base.CHRCount * 8192]; - fileStream.Read(base.CHR, 0, base.CHRCount * 8192); - } - else - { - base.CHR = new byte[0]; - } - } - base.IsValid = true; - fileStream.Dispose(); - fileStream.Close(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/INes.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/INes.cs.meta deleted file mode 100644 index 80bb67b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/INes.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6d7f5c4eca034d148883c87e6c6b2443 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IRom.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/IRom.cs deleted file mode 100644 index e88bbae..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IRom.cs +++ /dev/null @@ -1,34 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public abstract class IRom - { - public bool IsValid { get; set; } - - public int PRGCount { get; set; } - - public int CHRCount { get; set; } - - public int MapperNumber { get; set; } - - public Mirroring Mirroring { get; set; } - - public bool HasTrainer { get; set; } - - public byte[] PRG { get; set; } - - public byte[] CHR { get; set; } - - public byte[] Trainer { get; set; } - - public string SHA1 { get; set; } - - public virtual void Load(string fileName, bool loadDumps) - { - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IRom.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/IRom.cs.meta deleted file mode 100644 index 25009e7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IRom.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 60fcaf7174409fc448d54f85371d31fc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ISettings.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ISettings.cs deleted file mode 100644 index d3f4652..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ISettings.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public abstract class ISettings - { - protected string filePath; - - protected FieldInfo[] Fields; - - public ISettings(string filePath) - { - this.filePath = filePath; - } - - public virtual void LoadSettings() - { - Fields = GetType().GetFields(); - if (!File.Exists(filePath)) - { - return; - } - string[] array = File.ReadAllLines(filePath); - for (int i = 0; i < array.Length; i++) - { - string[] array2 = array[i].Split('='); - if (array2 != null && array2.Length == 2) - { - SetField(array2[0], array2[1]); - } - } - } - - public virtual void SaveSettings() - { - Fields = GetType().GetFields(); - List list = new List(); - FieldInfo[] fields = Fields; - foreach (FieldInfo fieldInfo in fields) - { - if (fieldInfo.IsPublic) - { - list.Add(fieldInfo.Name + "=" + GetFieldValue(fieldInfo)); - } - } - File.WriteAllLines(filePath, list.ToArray()); - } - - protected virtual void SetField(string fieldName, string val) - { - for (int i = 0; i < Fields.Length; i++) - { - if (!(Fields[i].Name == fieldName)) - { - continue; - } - if (Fields[i].FieldType == typeof(string)) - { - Fields[i].SetValue(this, val); - } - else if (Fields[i].FieldType == typeof(bool)) - { - Fields[i].SetValue(this, val == "1"); - } - else if (Fields[i].FieldType == typeof(int)) - { - int result = 0; - if (int.TryParse(val, out result)) - { - Fields[i].SetValue(this, result); - } - } - else if (Fields[i].FieldType == typeof(float)) - { - float result2 = 0f; - if (float.TryParse(val, out result2)) - { - Fields[i].SetValue(this, result2); - } - } - else if (Fields[i].FieldType == typeof(string[])) - { - string[] value = val.Split(new string[1] { "*" }, StringSplitOptions.RemoveEmptyEntries); - Fields[i].SetValue(this, value); - } - else - { - Tracer.WriteLine("Unknown setting type = " + Fields[i].FieldType); - } - break; - } - } - - protected virtual string GetFieldValue(string fieldName) - { - for (int i = 0; i < Fields.Length; i++) - { - if (Fields[i].Name == fieldName) - { - return GetFieldValue(Fields[i]); - } - } - return ""; - } - - protected virtual string GetFieldValue(FieldInfo field) - { - object value = field.GetValue(this); - if (field.FieldType == typeof(string)) - { - return value.ToString(); - } - if (field.FieldType == typeof(bool)) - { - if (!(bool)value) - { - return "0"; - } - return "1"; - } - if (field.FieldType == typeof(int)) - { - return value.ToString(); - } - if (field.FieldType == typeof(float)) - { - return value.ToString(); - } - if (field.FieldType == typeof(string[])) - { - string text = ""; - string[] array = (string[])value; - if (array != null) - { - string[] array2 = array; - foreach (string text2 in array2) - { - text = text + text2 + "*"; - } - } - if (text.Length > 0) - { - return text.Substring(0, text.Length - 1); - } - return ""; - } - return ""; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ISettings.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ISettings.cs.meta deleted file mode 100644 index 8b0c3b2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ISettings.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3236f262a69a32f4395a1f17537be480 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IShortcutsHandler.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/IShortcutsHandler.cs deleted file mode 100644 index be2d2f4..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IShortcutsHandler.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyNes.Core -{ - public interface IShortcutsHandler - { - void Update(); - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IShortcutsHandler.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/IShortcutsHandler.cs.meta deleted file mode 100644 index cf4b445..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IShortcutsHandler.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e44becc2730cc364db0b40806a1dd8cd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IVSUnisystemDIPConnecter.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/IVSUnisystemDIPConnecter.cs deleted file mode 100644 index db70a23..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IVSUnisystemDIPConnecter.cs +++ /dev/null @@ -1,30 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public abstract class IVSUnisystemDIPConnecter - { - public abstract void Update(); - - public virtual void OnEmuShutdown() - { - } - - public virtual byte GetData4016() - { - return 0; - } - - public virtual byte GetData4017() - { - return 0; - } - - public virtual void Write4020(ref byte data) - { - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IVSUnisystemDIPConnecter.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/IVSUnisystemDIPConnecter.cs.meta deleted file mode 100644 index 870c2f0..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IVSUnisystemDIPConnecter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 593f15ab3ef85d14a8a4c462199c9775 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IVideoProvider.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/IVideoProvider.cs deleted file mode 100644 index b89152c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IVideoProvider.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace MyNes.Core -{ - public interface IVideoProvider - { - string Name { get; } - - string ID { get; } - - void WriteErrorNotification(string message, bool instant); - - void WriteInfoNotification(string message, bool instant); - - void WriteWarningNotification(string message, bool instant); - - void TakeSnapshotAs(string path, string format); - - void TakeSnapshot(); - - void Initialize(); - - void ShutDown(); - - void SignalToggle(bool started); - - void SubmitFrame(ref int[] buffer); - - void ResizeBegin(); - - void ResizeEnd(); - - void ApplyRegionChanges(); - - void Resume(); - - void ToggleAspectRatio(bool keep_aspect); - - void ToggleFPS(bool show_fps); - - void ApplyFilter(); - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IVideoProvider.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/IVideoProvider.cs.meta deleted file mode 100644 index f7a0941..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IVideoProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fe8b5545022785849a0b156b01d15972 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IZapperConnecter.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/IZapperConnecter.cs deleted file mode 100644 index 2d9ef3a..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IZapperConnecter.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public abstract class IZapperConnecter - { - protected bool Trigger; - - protected bool State; - - public abstract void Update(); - - public virtual byte GetData() - { - return (byte)((Trigger ? 16u : 0u) | (State ? 8u : 0u)); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/IZapperConnecter.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/IZapperConnecter.cs.meta deleted file mode 100644 index 3a72364..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/IZapperConnecter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b7e39cb978938d8478d799f539c44c3f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Il2CppSetOptionAttribute.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Il2CppSetOptionAttribute.cs deleted file mode 100644 index e7453df..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Il2CppSetOptionAttribute.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System; - -namespace Unity.IL2CPP.CompilerServices -{ - /// - /// The code generation options available for IL to C++ conversion. - /// Enable or disabled these with caution. - /// - public enum Option - { - /// - /// Enable or disable code generation for null checks. - /// - /// Global null check support is enabled by default when il2cpp.exe - /// is launched from the Unity editor. - /// - /// Disabling this will prevent NullReferenceException exceptions from - /// being thrown in generated code. In *most* cases, code that dereferences - /// a null pointer will crash then. Sometimes the point where the crash - /// happens is later than the location where the null reference check would - /// have been emitted though. - /// - NullChecks = 1, - /// - /// Enable or disable code generation for array bounds checks. - /// - /// Global array bounds check support is enabled by default when il2cpp.exe - /// is launched from the Unity editor. - /// - /// Disabling this will prevent IndexOutOfRangeException exceptions from - /// being thrown in generated code. This will allow reading and writing to - /// memory outside of the bounds of an array without any runtime checks. - /// Disable this check with extreme caution. - /// - ArrayBoundsChecks = 2, - /// - /// Enable or disable code generation for divide by zero checks. - /// - /// Global divide by zero check support is disabled by default when il2cpp.exe - /// is launched from the Unity editor. - /// - /// Enabling this will cause DivideByZeroException exceptions to be - /// thrown in generated code. Most code doesn't need to handle this - /// exception, so it is probably safe to leave it disabled. - /// - DivideByZeroChecks = 3, - } - - /// - /// Use this attribute on an assembly, struct, class, method, or property to inform the IL2CPP code conversion utility to override the - /// global setting for one of a few different runtime checks. - /// - /// Example: - /// - /// [Il2CppSetOption(Option.NullChecks, false)] - /// public static string MethodWithNullChecksDisabled() - /// { - /// var tmp = new Object(); - /// return tmp.ToString(); - /// } - /// - [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Delegate, Inherited = false, AllowMultiple = true)] - public class Il2CppSetOptionAttribute : Attribute - { - public Option Option { get; private set; } - public object Value { get; private set; } - - public Il2CppSetOptionAttribute(Option option, object value) - { - Option = option; - Value = value; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Il2CppSetOptionAttribute.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Il2CppSetOptionAttribute.cs.meta deleted file mode 100644 index 956232b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Il2CppSetOptionAttribute.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1fa3bc95a1fade84eb4f44a94a7409b5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC2.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC2.cs deleted file mode 100644 index 78b223c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC2.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal abstract class MMC2 : Board - { - private byte chr_reg0A; - - private byte chr_reg0B; - - private byte chr_reg1A; - - private byte chr_reg1B; - - private byte latch_a = 254; - - private byte latch_b = 254; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask - 2, PRGArea.AreaA000); - Switch08KPRG(PRG_ROM_08KB_Mask - 1, PRGArea.AreaC000); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - chr_reg0B = 4; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF000) - { - case 40960: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 45056: - chr_reg0A = data; - if (latch_a == 253) - { - Switch04KCHR(chr_reg0A, CHRArea.Area0000); - } - break; - case 49152: - chr_reg0B = data; - if (latch_a == 254) - { - Switch04KCHR(chr_reg0B, CHRArea.Area0000); - } - break; - case 53248: - chr_reg1A = data; - if (latch_b == 253) - { - Switch04KCHR(chr_reg1A, CHRArea.Area1000); - } - break; - case 57344: - chr_reg1B = data; - if (latch_b == 254) - { - Switch04KCHR(chr_reg1B, CHRArea.Area1000); - } - break; - case 61440: - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - break; - } - } - - internal override void ReadCHR(ref ushort address, out byte data) - { - if ((address & 0x1FF0) == 4048 && latch_a != 253) - { - latch_a = 253; - Switch04KCHR(chr_reg0A, CHRArea.Area0000); - } - else if ((address & 0x1FF0) == 4064 && latch_a != 254) - { - latch_a = 254; - Switch04KCHR(chr_reg0B, CHRArea.Area0000); - } - else if ((address & 0x1FF0) == 8144 && latch_b != 253) - { - latch_b = 253; - Switch04KCHR(chr_reg1A, CHRArea.Area1000); - } - else if ((address & 0x1FF0) == 8160 && latch_b != 254) - { - latch_b = 254; - Switch04KCHR(chr_reg1B, CHRArea.Area1000); - } - base.ReadCHR(ref address, out data); - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(chr_reg0A); - stream.Write(chr_reg0B); - stream.Write(chr_reg1A); - stream.Write(chr_reg1B); - stream.Write(latch_a); - stream.Write(latch_b); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - chr_reg0A = stream.ReadByte(); - chr_reg0B = stream.ReadByte(); - chr_reg1A = stream.ReadByte(); - chr_reg1B = stream.ReadByte(); - latch_a = stream.ReadByte(); - latch_b = stream.ReadByte(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC2.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC2.cs.meta deleted file mode 100644 index f081fbd..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC2.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c2fd2154d001d8c4297526ae3b12644a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Pcm.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Pcm.cs deleted file mode 100644 index 8e67a5b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Pcm.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class MMC5Pcm - { - internal byte output; - - internal bool Outputable; - - private bool readMode; - - private bool PCMIRQenable; - - private bool irqTrip; - - internal void HardReset() - { - output = 0; - readMode = false; - PCMIRQenable = false; - irqTrip = false; - } - - internal void SoftReset() - { - HardReset(); - } - - internal void Write5010(byte data) - { - readMode = (data & 1) == 1; - PCMIRQenable = (data & 0x80) == 128; - if (PCMIRQenable && irqTrip) - { - NesEmu.IRQFlags |= 8; - } - } - - internal byte Read5010() - { - byte result = (byte)((irqTrip & PCMIRQenable) ? 128 : 0); - irqTrip = false; - NesEmu.IRQFlags &= -9; - return result; - } - - internal void Write5011(byte data) - { - if (readMode) - { - return; - } - if (data == 0) - { - irqTrip = true; - } - else - { - irqTrip = false; - if (Outputable) - { - output = data; - } - } - if (PCMIRQenable && irqTrip) - { - NesEmu.IRQFlags |= 8; - } - } - - internal void SaveState(ref BinaryWriter stream) - { - stream.Write(readMode); - stream.Write(PCMIRQenable); - stream.Write(irqTrip); - } - - internal void LoadState(ref BinaryReader stream) - { - readMode = stream.ReadBoolean(); - PCMIRQenable = stream.ReadBoolean(); - irqTrip = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Pcm.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Pcm.cs.meta deleted file mode 100644 index 6cdb2d8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Pcm.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b4c531b467bf54c4a9d0874c00316b40 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Sqr.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Sqr.cs deleted file mode 100644 index 7e1c39e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Sqr.cs +++ /dev/null @@ -1,218 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class MMC5Sqr - { - private byte[][] duty_cycle_sequences = new byte[4][] - { - new byte[8] { 0, 0, 0, 0, 0, 0, 0, 1 }, - new byte[8] { 0, 0, 0, 0, 0, 0, 1, 1 }, - new byte[8] { 0, 0, 0, 0, 1, 1, 1, 1 }, - new byte[8] { 1, 1, 1, 1, 1, 1, 0, 0 } - }; - - private byte[] duration_table = new byte[32] - { - 10, 254, 20, 2, 40, 4, 80, 6, 160, 8, - 60, 10, 14, 12, 26, 14, 12, 16, 24, 18, - 48, 20, 96, 22, 192, 24, 72, 26, 16, 28, - 32, 30 - }; - - private byte duty_cycle; - - private bool length_halt; - - private bool constant_volume_envelope; - - private byte volume_devider_period; - - private int timer; - - private int period_devider; - - private byte seqencer; - - private bool length_enabled; - - private int length_counter; - - private bool envelope_start_flag; - - private byte envelope_devider; - - private byte envelope_decay_level_counter; - - private byte envelope; - - internal int output; - - internal bool Outputable; - - internal void HardReset() - { - duty_cycle = 0; - length_halt = false; - constant_volume_envelope = false; - volume_devider_period = 0; - timer = 0; - period_devider = 0; - seqencer = 0; - length_enabled = false; - length_counter = 0; - envelope_start_flag = false; - envelope_devider = 0; - envelope_decay_level_counter = 0; - envelope = 0; - } - - internal void SoftReset() - { - HardReset(); - } - - internal void Clock() - { - period_devider--; - if (period_devider > 0) - { - return; - } - period_devider = timer + 1; - if (length_counter > 0) - { - if (Outputable) - { - output = duty_cycle_sequences[duty_cycle][seqencer] * envelope; - } - } - else - { - output = 0; - } - if (seqencer == 0) - { - seqencer = 7; - } - else - { - seqencer--; - } - } - - internal void ClockLength() - { - if (length_counter > 0 && !length_halt) - { - length_counter--; - } - } - - internal void ClockEnvelope() - { - if (envelope_start_flag) - { - envelope_start_flag = false; - envelope_decay_level_counter = 15; - envelope_devider = (byte)(volume_devider_period + 1); - } - else if (envelope_devider > 0) - { - envelope_devider--; - } - else - { - envelope_devider = (byte)(volume_devider_period + 1); - if (envelope_decay_level_counter > 0) - { - envelope_decay_level_counter--; - } - else if (length_halt) - { - envelope_decay_level_counter = 15; - } - } - envelope = (constant_volume_envelope ? volume_devider_period : envelope_decay_level_counter); - } - - internal void Write0(ref byte value) - { - duty_cycle = (byte)((value & 0xC0) >> 6); - volume_devider_period = (byte)(value & 0xFu); - length_halt = (value & 0x20) != 0; - constant_volume_envelope = (value & 0x10) != 0; - envelope = (constant_volume_envelope ? volume_devider_period : envelope_decay_level_counter); - } - - internal void Write2(ref byte value) - { - timer = (timer & 0xFF00) | value; - } - - internal void Write3(ref byte value) - { - timer = (timer & 0xFF) | ((value & 7) << 8); - if (length_enabled) - { - length_counter = duration_table[value >> 3]; - } - seqencer = 0; - envelope_start_flag = true; - } - - internal void WriteEnabled(bool enabled) - { - length_enabled = enabled; - if (!length_enabled) - { - length_counter = 0; - } - } - - internal bool ReadEnable() - { - return length_counter > 0; - } - - internal void WriteStateData(ref BinaryWriter bin) - { - bin.Write(duty_cycle); - bin.Write(length_halt); - bin.Write(constant_volume_envelope); - bin.Write(volume_devider_period); - bin.Write(timer); - bin.Write(period_devider); - bin.Write(seqencer); - bin.Write(length_enabled); - bin.Write(length_counter); - bin.Write(envelope_start_flag); - bin.Write(envelope_devider); - bin.Write(envelope_decay_level_counter); - bin.Write(envelope); - bin.Write(output); - } - - internal void ReadStateData(ref BinaryReader bin) - { - duty_cycle = bin.ReadByte(); - length_halt = bin.ReadBoolean(); - constant_volume_envelope = bin.ReadBoolean(); - volume_devider_period = bin.ReadByte(); - timer = bin.ReadInt32(); - period_devider = bin.ReadInt32(); - seqencer = bin.ReadByte(); - length_enabled = bin.ReadBoolean(); - length_counter = bin.ReadInt32(); - envelope_start_flag = bin.ReadBoolean(); - envelope_devider = bin.ReadByte(); - envelope_decay_level_counter = bin.ReadByte(); - envelope = bin.ReadByte(); - output = bin.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Sqr.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Sqr.cs.meta deleted file mode 100644 index e80b342..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MMC5Sqr.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 21efe36faf5e4b74592b812f08f60773 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MNInterfaceLanguage.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/MNInterfaceLanguage.cs deleted file mode 100644 index decd246..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MNInterfaceLanguage.cs +++ /dev/null @@ -1,134 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class MNInterfaceLanguage - { - public static string Message_RomInfoCanBeOnlyShown = "Rom info can be shown only when emulation is on (i.e. game is loaded)"; - - public static string Message_StateSlotSetTo = "State slot set to"; - - public static string Message_LoadStateCanBeUsedOnly = "Load state as can be used only when emulation is on (i.e. game is loaded)"; - - public static string Message_SaveStateCanBeUseOnly = "Save state as can be used only when emulation is on (i.e. game is loaded)"; - - public static string Message_HardResetCanBeUsedOnly = "Hard reset can be used only when emulation is on (i.e. game is loaded)"; - - public static string Message_SoftResetCanBeUsedOnly = "Soft reset can be used only when emulation is on (i.e. game is loaded)"; - - public static string Message_TurboCanBeToggledOnly = "Turbo can be toggled only when emulation is on (i.e. game is loaded)"; - - public static string Message_GameGenieCanBeConfiguredOnly = "Game Genie can be enabled/configured only when emulation is on (i.e. game is loaded)"; - - public static string Message_Error1 = "Can't save state, emu is off."; - - public static string Message_Error2 = "Can't save state, no rom file is loaded."; - - public static string Message_Error3 = "Can't save state while loading a state !"; - - public static string Message_Error4 = "Already saving state !!"; - - public static string Message_Error5 = "Can't load state, emu is off."; - - public static string Message_Error6 = "Can't load state, no rom file is loaded."; - - public static string Message_Error7 = "Can't load state while saving a state !"; - - public static string Message_Error8 = "Already loading state !!"; - - public static string Message_Error9 = "No state found in slot"; - - public static string Message_Error10 = "Unable load state at slot"; - - public static string Message_Error11 = "Not My Nes State File !"; - - public static string Message_Error12 = "Not compatible state file version !"; - - public static string Message_Error13 = "This state file is not for this game; not same SHA1 !"; - - public static string Message_Error14 = "IS NOT LOCATED, mapper is not supported or unable to find it."; - - public static string Message_Error15 = "will be used instead, assigned successfully."; - - public static string Message_Error16 = "Game Genie code length cannot be more than 8 letters"; - - public static string Message_Error17 = "has issues and may not function probably with this game."; - - public static string Message_Info1 = "State saved at slot"; - - public static string Message_Info2 = "State loaded from slot"; - - public static string Message_Info3 = "Snapshot saved"; - - public static string Message_Info4 = "Interface language set to"; - - public static string Message_PleaseRestartToApply = "Please restart My Nes to apply."; - - public static string Message_HardReset = "HARD RESET !"; - - public static string Message_SoftReset = "SOFT RESET !"; - - public static string Message_Paused = "PAUSED"; - - public static string Mapper = "Mapper"; - - public static string IssueMapper5 = "Split screen not implemented.\nUchuu Keibitai SDF game graphic corruption for unknown reason in the intro (not in the split screen)."; - - public static string IssueMapper6 = "Mapper 6 is not tested, issues may occur"; - - public static string IssueMapper8 = "Mapper 8 is not tested, issues may occur"; - - public static string IssueMapper33 = "Mapper 33: Akira is not working for unknown reason."; - - public static string IssueMapper44 = "In game Super Big 7 - in - 1 : Double Dragon 3 game does not work."; - - public static string IssueMapper53 = "Mapper 53 does not work with the test roms i have, maybe something wrong with the implementation or the roms themselves"; - - public static string IssueMapper56 = "Mapper 56 does not work with the test roms i have, maybe something wrong with the implementation or the roms themselves"; - - public static string IssueMapper58 = "Study and Game 32-in-1 (Ch) [!].nes needs keyboard ?"; - - public static string IssueMapper60 = "Mapper 60 does not work with the test roms i have, maybe something wrong with the implementation or the roms themselves"; - - public static string IssueMapper85 = "VRC7 sound channels are not supported"; - - public static string IssueMapper90 = "DipSwitch is not implemented, the irq modes 2-3 are not implemented yet."; - - public static string IssueMapper96 = "Mapper 96 does not function probably and needs special controller to be implemented."; - - public static string IssueMapper105 = "Game hangs on title screen !"; - - public static string IssueMapper119 = "Mapper 119 does not function probably"; - - public static string IssueMapper154 = "Game shows glitches with chr"; - - public static string IssueMapper180 = "Crazy Climber needs special controller which not implemented yet."; - - public static string IssueMapper191 = "Mapper 191 is not tested, issues may occur"; - - public static string IssueMapper193 = "Game show nothing but fighter sprite !"; - - public static string IssueMapper202 = "150 in 1: some games not work well. Is it mapper or rom dump ?"; - - public static string IssueMapper203 = "64-in-1: some games not work, maybe something wrong with the implementation or the rom itself"; - - public static string IssueMapper207 = "Fudou Myouou Den is not assigned as mapper 207 while it should be !"; - - public static string IssueMapper222 = "Mapper 222 is not tested, issues may occur"; - - public static string IssueMapper228 = "Mapper 228 does not function probably"; - - public static string IssueMapper229 = "Mapper 229 is not tested, issues may occur"; - - public static string IssueMapper230 = "Only Contra works !?"; - - public static string IssueMapper243 = "Shows glitches in some games."; - - public static string IssueMapper245 = "Graphic glitches, maybe chr switches."; - - public static string IssueMapper255 = "Mapper 255 is not tested, issues may occur"; - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MNInterfaceLanguage.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/MNInterfaceLanguage.cs.meta deleted file mode 100644 index f42a587..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MNInterfaceLanguage.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 54f6278d37c378c4f9a6fe125f4505fd -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper000.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper000.cs deleted file mode 100644 index 4fe2623..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper000.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("NROM", 0)] - internal class Mapper000 : Board - { - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper000.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper000.cs.meta deleted file mode 100644 index a7515e7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper000.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 41b0e004e19b28f47812b3eab3da2622 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper001.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper001.cs deleted file mode 100644 index 099e21c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper001.cs +++ /dev/null @@ -1,245 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("MMC1", 1, 4, 64)] - internal class Mapper001 : Board - { - private int address_reg; - - private byte[] reg = new byte[4]; - - private byte shift; - - private byte buffer; - - private bool flag_p; - - private bool flag_c; - - private bool flag_s; - - private bool enable_wram_enable; - - private int prg_hijackedbit; - - private bool use_hijacked; - - private bool use_sram_switch; - - private int sram_switch_mask; - - private int cpuCycles; - - internal override void HardReset() - { - base.HardReset(); - cpuCycles = 0; - address_reg = 0; - reg = new byte[4]; - reg[0] = 12; - flag_c = false; - flag_s = (flag_p = true); - prg_hijackedbit = 0; - reg[1] = (reg[2] = (reg[3] = 0)); - buffer = 0; - shift = 0; - if (base.Chips.Contains("MMC1B") || base.Chips.Contains("MMC1B2")) - { - TogglePRGRAMEnable(enable: false); - Console.WriteLine("MMC1: SRAM Disabled."); - } - enable_wram_enable = !base.Chips.Contains("MMC1A"); - Console.WriteLine("MMC1: enable_wram_enable = " + enable_wram_enable); - use_hijacked = (PRG_ROM_16KB_Mask & 0x10) == 16; - if (use_hijacked) - { - prg_hijackedbit = 16; - } - use_sram_switch = false; - if (PRG_RAM_08KB_Count > 0) - { - use_sram_switch = true; - sram_switch_mask = (use_hijacked ? 8 : 24); - sram_switch_mask &= PRG_RAM_08KB_Mask << 3; - if (sram_switch_mask == 0) - { - use_sram_switch = false; - } - } - Switch16KPRG(0xF | prg_hijackedbit, PRGArea.AreaC000); - Console.WriteLine("MMC1: use_hijacked = " + use_hijacked); - Console.WriteLine("MMC1: use_sram_switch = " + use_sram_switch); - Console.WriteLine("MMC1: sram_switch_mask = " + sram_switch_mask.ToString("X2")); - } - - internal override void WritePRG(ref ushort address, ref byte value) - { - if (cpuCycles > 0) - { - return; - } - cpuCycles = 3; - if ((value & 0x80) == 128) - { - reg[0] |= 12; - flag_s = (flag_p = true); - shift = (buffer = 0); - return; - } - if ((value & 1) == 1) - { - buffer |= (byte)(1 << (int)shift); - } - if (++shift < 5) - { - return; - } - address_reg = (address & 0x7FFF) >> 13; - reg[address_reg] = buffer; - shift = (buffer = 0); - switch (address_reg) - { - case 0: - flag_c = (reg[0] & 0x10) != 0; - flag_p = (reg[0] & 8) != 0; - flag_s = (reg[0] & 4) != 0; - UpdatePRG(); - UpdateCHR(); - switch (reg[0] & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - } - break; - case 1: - if (!flag_c) - { - Switch08KCHR(reg[1] >> 1); - } - else - { - Switch04KCHR(reg[1], CHRArea.Area0000); - } - if (use_sram_switch) - { - Switch08KPRG((reg[1] & sram_switch_mask) >> 3, PRGArea.Area6000); - } - if (use_hijacked) - { - prg_hijackedbit = reg[1] & 0x10; - UpdatePRG(); - } - break; - case 2: - if (flag_c) - { - Switch04KCHR(reg[2], CHRArea.Area1000); - } - if (use_sram_switch) - { - Switch08KPRG((reg[2] & sram_switch_mask) >> 3, PRGArea.Area6000); - } - if (use_hijacked) - { - prg_hijackedbit = reg[2] & 0x10; - UpdatePRG(); - } - break; - case 3: - if (enable_wram_enable) - { - TogglePRGRAMEnable((reg[3] & 0x10) == 0); - } - UpdatePRG(); - break; - } - } - - private void UpdateCHR() - { - if (!flag_c) - { - Switch08KCHR(reg[1] >> 1); - } - else - { - Switch04KCHR(reg[1], CHRArea.Area0000); - Switch04KCHR(reg[2], CHRArea.Area1000); - } - if (use_sram_switch) - { - Switch08KPRG((reg[1] & sram_switch_mask) >> 3, PRGArea.Area6000); - } - } - - private void UpdatePRG() - { - if (!flag_p) - { - Switch32KPRG(((reg[3] & 0xF) | prg_hijackedbit) >> 1, PRGArea.Area8000); - } - else if (flag_s) - { - Switch16KPRG((reg[3] & 0xF) | prg_hijackedbit, PRGArea.Area8000); - Switch16KPRG(0xF | prg_hijackedbit, PRGArea.AreaC000); - } - else - { - Switch16KPRG(prg_hijackedbit, PRGArea.Area8000); - Switch16KPRG((reg[3] & 0xF) | prg_hijackedbit, PRGArea.AreaC000); - } - } - - internal override void OnCPUClock() - { - if (cpuCycles > 0) - { - cpuCycles--; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(reg); - stream.Write(shift); - stream.Write(buffer); - stream.Write(flag_p); - stream.Write(flag_c); - stream.Write(flag_s); - stream.Write(enable_wram_enable); - stream.Write(prg_hijackedbit); - stream.Write(use_hijacked); - stream.Write(use_sram_switch); - stream.Write(cpuCycles); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - stream.Read(reg, 0, reg.Length); - shift = stream.ReadByte(); - buffer = stream.ReadByte(); - flag_p = stream.ReadBoolean(); - flag_c = stream.ReadBoolean(); - flag_s = stream.ReadBoolean(); - enable_wram_enable = stream.ReadBoolean(); - prg_hijackedbit = stream.ReadInt32(); - use_hijacked = stream.ReadBoolean(); - use_sram_switch = stream.ReadBoolean(); - cpuCycles = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper001.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper001.cs.meta deleted file mode 100644 index 8cb1ef2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper001.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 42f133f6a434de742b44fc92425e28b8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper002.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper002.cs deleted file mode 100644 index c10202f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper002.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("UxROM", 2)] - internal class Mapper002 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort addr, ref byte val) - { - Switch16KPRG(val, PRGArea.Area8000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper002.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper002.cs.meta deleted file mode 100644 index db979eb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper002.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a977999313c88f0498ab5893280de143 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper003.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper003.cs deleted file mode 100644 index a4ff318..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper003.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("CNROM", 3)] - internal class Mapper003 : Board - { - private byte data_temp; - - internal override void WritePRG(ref ushort address, ref byte data) - { - ReadPRG(ref address, out data_temp); - data_temp &= data; - Switch08KCHR(data_temp); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper003.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper003.cs.meta deleted file mode 100644 index 58f60ec..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper003.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e59d7105def01754ab2fbe6d71f36875 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper004.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper004.cs deleted file mode 100644 index 1f8e5e7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper004.cs +++ /dev/null @@ -1,228 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - [BoardInfo("MMC3", 4, true, true)] - internal class Mapper004 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - mmc3_alt_behavior = false; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Tracer.WriteWarning("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Tracer.WriteWarning("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Tracer.WriteWarning("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WritePRG(ref ushort addr, ref byte val) - { - switch (addr & 0xE001) - { - case 32768: - address_8001 = val & 7; - flag_c = (val & 0x80) != 0; - flag_p = (val & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = val; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = val & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((val & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((val & 0x80) != 0); - TogglePRGRAMWritableEnable((val & 0x40) == 0); - break; - case 49152: - irq_reload = val; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter bin) - { - base.WriteStateData(ref bin); - bin.Write(flag_c); - bin.Write(flag_p); - bin.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - bin.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - bin.Write(prg_reg[j]); - } - bin.Write(irq_enabled); - bin.Write(irq_counter); - bin.Write(old_irq_counter); - bin.Write(irq_reload); - bin.Write(irq_clear); - bin.Write(mmc3_alt_behavior); - } - - internal override void ReadStateData(ref BinaryReader bin) - { - base.ReadStateData(ref bin); - flag_c = bin.ReadBoolean(); - flag_p = bin.ReadBoolean(); - address_8001 = bin.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = bin.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = bin.ReadInt32(); - } - irq_enabled = bin.ReadBoolean(); - irq_counter = bin.ReadByte(); - old_irq_counter = bin.ReadInt32(); - irq_reload = bin.ReadByte(); - irq_clear = bin.ReadBoolean(); - mmc3_alt_behavior = bin.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper004.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper004.cs.meta deleted file mode 100644 index 656b91e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper004.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e2b6fcc80f0fa6941bdd8fd3fb33c886 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper005.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper005.cs deleted file mode 100644 index 5f22e3d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper005.cs +++ /dev/null @@ -1,870 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("MMC5", 5, 8, 16)] - [WithExternalSound] - [HassIssues] - internal class Mapper005 : Board - { - private int ram_protectA; - - private int ram_protectB; - - private int ExRAM_mode; - - private int[] CHROffset_spr; - - private int[] CHROffsetEX; - - private int[] CHROffsetSP; - - private int[] chrRegA; - - private int[] chrRegB; - - private int[] prgReg; - - private bool useSRAMmirroring; - - private int chr_high; - - private int chr_mode; - - private int prg_mode; - - private bool chr_setB_last; - - private byte temp_val; - - private byte temp_fill; - - private int lastAccessVRAM; - - private int paletteNo; - - private int shift; - - private int EXtilenumber; - - private byte multiplicand; - - private byte multiplier; - - private ushort product; - - private bool split_enable; - - private bool split_right; - - private int split_tile; - - private int split_yscroll; - - private bool split_doit; - - private int split_watch_tile; - - private byte irq_line; - - private byte irq_enable; - - private int irq_pending; - - private int irq_current_counter; - - private int irq_current_inframe; - - private MMC5Sqr snd_1; - - private MMC5Sqr snd_2; - - private MMC5Pcm snd_3; - - private double[] audio_pulse_table; - - private double[] audio_tnd_table; - - internal override string Issues => MNInterfaceLanguage.IssueMapper5; - - internal override void Initialize(IRom rom) - { - base.Initialize(rom); - snd_1 = new MMC5Sqr(); - snd_2 = new MMC5Sqr(); - snd_3 = new MMC5Pcm(); - audio_pulse_table = new double[32]; - for (int i = 0; i < 32; i++) - { - audio_pulse_table[i] = 95.52 / (8128.0 / (double)i + 100.0); - } - audio_tnd_table = new double[204]; - for (int j = 0; j < 204; j++) - { - audio_tnd_table[j] = 163.67 / (24329.0 / (double)j + 100.0); - } - } - - internal override void HardReset() - { - base.HardReset(); - switch (SHA1.ToUpper()) - { - case "37267833C984F176DB4B0BC9D45DABA0FFF45304": - useSRAMmirroring = true; - break; - case "800AEFE756E85A0A78CCB4DAE68EBBA5DF24BF41": - useSRAMmirroring = true; - break; - } - Console.WriteLine("MMC5: using PRG RAM mirroring = " + useSRAMmirroring); - CHROffset_spr = new int[8]; - CHROffsetEX = new int[8]; - CHROffsetSP = new int[8]; - chrRegA = new int[8]; - chrRegB = new int[4]; - prgReg = new int[4]; - prgReg[3] = PRG_ROM_08KB_Mask; - prg_mode = 3; - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.Area8000); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaA000); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaC000); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - Switch04kCHREX(0, 0); - Switch04kCHRSP(0, 0); - Switch08kCHR_spr(0); - TogglePRGRAMWritableEnable(enable: true); - TogglePRGRAMEnable(enable: true); - APUApplyChannelsSettings(); - snd_1.HardReset(); - snd_2.HardReset(); - snd_3.HardReset(); - } - - internal override void SoftReset() - { - base.SoftReset(); - snd_1.SoftReset(); - snd_2.SoftReset(); - snd_3.SoftReset(); - } - - internal override void WriteEX(ref ushort address, ref byte value) - { - if (address >= 23552) - { - if (ExRAM_mode == 2) - { - NMT_RAM[2][address & 0x3FF] = value; - } - else if (ExRAM_mode < 2) - { - if (irq_current_inframe == 64) - { - NMT_RAM[2][address & 0x3FF] = value; - } - else - { - NMT_RAM[2][address & 0x3FF] = 0; - } - } - return; - } - switch (address) - { - case 20480: - snd_1.Write0(ref value); - break; - case 20482: - snd_1.Write2(ref value); - break; - case 20483: - snd_1.Write3(ref value); - break; - case 20484: - snd_2.Write0(ref value); - break; - case 20486: - snd_2.Write2(ref value); - break; - case 20487: - snd_2.Write3(ref value); - break; - case 20496: - snd_3.Write5010(value); - break; - case 20497: - snd_3.Write5011(value); - break; - case 20501: - snd_1.WriteEnabled((value & 1) != 0); - snd_2.WriteEnabled((value & 2) != 0); - break; - case 20736: - prg_mode = value & 3; - break; - case 20737: - chr_mode = value & 3; - break; - case 20738: - ram_protectA = value & 3; - UpdateRamProtect(); - break; - case 20739: - ram_protectB = value & 3; - UpdateRamProtect(); - break; - case 20740: - ExRAM_mode = value & 3; - break; - case 20741: - Switch01KNMT(value); - break; - case 20755: - if (!useSRAMmirroring) - { - Switch08KPRG(value & 7, PRGArea.Area6000); - } - else - { - Switch08KPRG((value >> 2) & 1, PRGArea.Area6000); - } - break; - case 20756: - if (prg_mode == 3) - { - Toggle08KPRG_RAM((value & 0x80) == 0, PRGArea.Area8000); - Switch08KPRG(value & 0x7F, PRGArea.Area8000); - } - break; - case 20757: - switch (prg_mode) - { - case 1: - Toggle16KPRG_RAM((value & 0x80) == 0, PRGArea.Area8000); - Switch16KPRG((value & 0x7F) >> 1, PRGArea.Area8000); - break; - case 2: - Toggle16KPRG_RAM((value & 0x80) == 0, PRGArea.Area8000); - Switch16KPRG((value & 0x7F) >> 1, PRGArea.Area8000); - break; - case 3: - Toggle08KPRG_RAM((value & 0x80) == 0, PRGArea.AreaA000); - Switch08KPRG(value & 0x7F, PRGArea.AreaA000); - break; - } - break; - case 20758: - { - int num = prg_mode; - if ((uint)(num - 2) <= 1u) - { - Toggle08KPRG_RAM((value & 0x80) == 0, PRGArea.AreaC000); - Switch08KPRG(value & 0x7F, PRGArea.AreaC000); - } - break; - } - case 20759: - switch (prg_mode) - { - case 0: - Switch32KPRG((value & 0x7C) >> 2, PRGArea.Area8000); - break; - case 1: - Switch16KPRG((value & 0x7F) >> 1, PRGArea.AreaC000); - break; - case 2: - Switch08KPRG(value & 0x7F, PRGArea.AreaE000); - break; - case 3: - Switch08KPRG(value & 0x7F, PRGArea.AreaE000); - break; - } - break; - case 20768: - chr_setB_last = false; - if (chr_mode == 3) - { - Switch01kCHR_spr(value | chr_high, 0); - } - break; - case 20769: - chr_setB_last = false; - switch (chr_mode) - { - case 2: - Switch02kCHR_spr(value | chr_high, 0); - break; - case 3: - Switch01kCHR_spr(value | chr_high, 1024); - break; - } - break; - case 20770: - chr_setB_last = false; - if (chr_mode == 3) - { - Switch01kCHR_spr(value | chr_high, 2048); - } - break; - case 20771: - chr_setB_last = false; - switch (chr_mode) - { - case 1: - Switch04kCHR_spr(value | chr_high, 0); - break; - case 2: - Switch02kCHR_spr(value | chr_high, 2048); - break; - case 3: - Switch01kCHR_spr(value | chr_high, 3072); - break; - } - break; - case 20772: - chr_setB_last = false; - if (chr_mode == 3) - { - Switch01kCHR_spr(value | chr_high, 4096); - } - break; - case 20773: - chr_setB_last = false; - switch (chr_mode) - { - case 2: - Switch02kCHR_spr(value | chr_high, 4096); - break; - case 3: - Switch01kCHR_spr(value | chr_high, 5120); - break; - } - break; - case 20774: - chr_setB_last = false; - if (chr_mode == 3) - { - Switch01kCHR_spr(value | chr_high, 6144); - } - break; - case 20775: - chr_setB_last = false; - switch (chr_mode) - { - case 0: - Switch08kCHR_spr(value | chr_high); - break; - case 1: - Switch04kCHR_spr(value | chr_high, 4096); - break; - case 2: - Switch02kCHR_spr(value | chr_high, 6144); - break; - case 3: - Switch01kCHR_spr(value | chr_high, 7168); - break; - } - break; - case 20776: - chr_setB_last = true; - if (chr_mode == 3) - { - Switch01KCHR(value | chr_high, CHRArea.Area0000); - Switch01KCHR(value | chr_high, CHRArea.Area1000); - } - break; - case 20777: - chr_setB_last = true; - switch (chr_mode) - { - case 2: - Switch02KCHR(value | chr_high, CHRArea.Area0000); - Switch02KCHR(value | chr_high, CHRArea.Area1000); - break; - case 3: - Switch01KCHR(value | chr_high, CHRArea.Area0400); - Switch01KCHR(value | chr_high, CHRArea.Area1400); - break; - } - break; - case 20778: - chr_setB_last = true; - if (chr_mode == 3) - { - Switch01KCHR(value | chr_high, CHRArea.Area0800); - Switch01KCHR(value | chr_high, CHRArea.Area1800); - } - break; - case 20779: - chr_setB_last = true; - switch (chr_mode) - { - case 0: - Switch04kCHR_bkg(value | chr_high, 0); - Switch04kCHR_bkg(value | chr_high, 4096); - break; - case 1: - Switch04KCHR(value | chr_high, CHRArea.Area0000); - Switch04KCHR(value | chr_high, CHRArea.Area1000); - break; - case 2: - Switch02KCHR(value | chr_high, CHRArea.Area0800); - Switch02KCHR(value | chr_high, CHRArea.Area1800); - break; - case 3: - Switch01KCHR(value | chr_high, CHRArea.Area0C00); - Switch01KCHR(value | chr_high, CHRArea.Area1C00); - break; - } - break; - case 20784: - chr_high = (value & 3) << 8; - break; - case 20742: - { - for (int j = 0; j < 960; j++) - { - NMT_RAM[3][j] = value; - } - break; - } - case 20743: - { - for (int i = 960; i < 1024; i++) - { - temp_fill = (byte)((uint)(2 << (value & 3)) | (value & 3u)); - temp_fill |= (byte)((temp_fill & 0xF) << 4); - NMT_RAM[3][i] = temp_fill; - } - break; - } - case 20992: - split_tile = value & 0x1F; - split_enable = (value & 0x80) == 128; - split_right = (value & 0x40) == 64; - break; - case 20993: - split_yscroll = value; - break; - case 20994: - Switch04kCHRSP(value, address & 0); - Switch04kCHRSP(value, address & 0x1000); - break; - case 20995: - irq_line = value; - break; - case 20996: - irq_enable = value; - break; - case 20997: - multiplicand = value; - product = (ushort)(multiplicand * multiplier); - break; - case 20998: - multiplier = value; - product = (ushort)(multiplicand * multiplier); - break; - } - } - - internal override void ReadEX(ref ushort address, out byte data) - { - if (address >= 23552 && ExRAM_mode >= 2) - { - data = NMT_RAM[2][address & 0x3FF]; - return; - } - switch (address) - { - case 20496: - data = snd_3.Read5010(); - break; - case 20996: - data = (byte)(irq_current_inframe | irq_pending); - irq_pending = 0; - NesEmu.IRQFlags &= -9; - break; - case 20997: - data = (byte)(product & 0xFFu); - break; - case 20998: - data = (byte)((product & 0xFF00) >> 8); - break; - case 20501: - data = (byte)((snd_1.ReadEnable() ? 1u : 0u) | (snd_2.ReadEnable() ? 2u : 0u)); - data = 0; - break; - default: - data = 0; - break; - } - } - - internal override void ReadCHR(ref ushort address, out byte data) - { - if (!NesEmu.ppu_is_sprfetch && split_enable && ExRAM_mode < 2) - { - split_watch_tile = address & 0x3F; - if (!split_right) - { - split_doit = split_watch_tile < split_tile; - } - else - { - split_doit = split_watch_tile >= split_tile; - } - _ = split_doit; - } - if (ExRAM_mode == 1) - { - if (!NesEmu.ppu_is_sprfetch) - { - EXtilenumber = NMT_RAM[2][lastAccessVRAM] & 0x3F; - Switch04kCHREX(EXtilenumber | chr_high, address & 0x1000); - data = CHR_ROM[CHROffsetEX[(address >> 10) & 7]][address & 0x3FF]; - } - else - { - data = CHR_ROM[CHROffset_spr[(address >> 10) & 7]][address & 0x3FF]; - } - } - else if (NesEmu.ppu_reg_2000_Sprite_size == 16) - { - if (!NesEmu.ppu_is_sprfetch) - { - data = CHR_ROM[CHR_AREA_BLK_INDEX[(address >> 10) & 7]][address & 0x3FF]; - } - else - { - data = CHR_ROM[CHROffset_spr[(address >> 10) & 7]][address & 0x3FF]; - } - } - else if (chr_setB_last) - { - data = CHR_ROM[CHR_AREA_BLK_INDEX[(address >> 10) & 7]][address & 0x3FF]; - } - else - { - data = CHR_ROM[CHROffset_spr[(address >> 10) & 7]][address & 0x3FF]; - } - } - - internal override void ReadNMT(ref ushort address, out byte data) - { - _ = split_doit; - if (ExRAM_mode == 1) - { - if ((address & 0x3FF) <= 959) - { - lastAccessVRAM = address & 0x3FF; - } - else - { - paletteNo = NMT_RAM[2][lastAccessVRAM] & 0xC0; - shift = ((lastAccessVRAM >> 4) & 4) | (lastAccessVRAM & 2); - switch (shift) - { - case 0: - data = (byte)(paletteNo >> 6); - return; - case 2: - data = (byte)(paletteNo >> 4); - return; - case 4: - data = (byte)(paletteNo >> 2); - return; - case 6: - data = (byte)paletteNo; - return; - } - } - } - data = NMT_RAM[NMT_AREA_BLK_INDEX[(address >> 10) & 3]][address & 0x3FF]; - } - - internal override void WriteNMT(ref ushort address, ref byte value) - { - if (ExRAM_mode == 1 && (address & 0x3FF) <= 959) - { - lastAccessVRAM = address & 0x3FF; - } - NMT_RAM[NMT_AREA_BLK_INDEX[(address >> 10) & 3]][address & 0x3FF] = value; - } - - private void UpdateRamProtect() - { - TogglePRGRAMWritableEnable(ram_protectA == 2 && ram_protectB == 1); - } - - private void Switch04kCHR_bkg(int index, int where) - { - int num = (where >> 10) & 7; - index <<= 2; - CHR_AREA_BLK_INDEX[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHR_AREA_BLK_INDEX[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHR_AREA_BLK_INDEX[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHR_AREA_BLK_INDEX[num] = index & CHR_ROM_01KB_Mask; - } - - private void Switch01kCHR_spr(int index, int where) - { - CHROffset_spr[(where >> 10) & 7] = index & CHR_ROM_01KB_Mask; - } - - private void Switch02kCHR_spr(int index, int where) - { - int num = (where >> 10) & 7; - index <<= 1; - CHROffset_spr[num] = index & CHR_ROM_01KB_Mask; - index++; - CHROffset_spr[num + 1] = index & CHR_ROM_01KB_Mask; - } - - private void Switch04kCHR_spr(int index, int where) - { - int num = (where >> 10) & 7; - index <<= 2; - CHROffset_spr[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHROffset_spr[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHROffset_spr[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHROffset_spr[num] = index & CHR_ROM_01KB_Mask; - } - - private void Switch08kCHR_spr(int index) - { - index <<= 3; - CHROffset_spr[0] = index & CHR_ROM_01KB_Mask; - index++; - CHROffset_spr[1] = index & CHR_ROM_01KB_Mask; - index++; - CHROffset_spr[2] = index & CHR_ROM_01KB_Mask; - index++; - CHROffset_spr[3] = index & CHR_ROM_01KB_Mask; - index++; - CHROffset_spr[4] = index & CHR_ROM_01KB_Mask; - index++; - CHROffset_spr[5] = index & CHR_ROM_01KB_Mask; - index++; - CHROffset_spr[6] = index & CHR_ROM_01KB_Mask; - index++; - CHROffset_spr[7] = index & CHR_ROM_01KB_Mask; - } - - private void Switch04kCHREX(int index, int where) - { - int num = (where >> 10) & 7; - index <<= 2; - CHROffsetEX[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHROffsetEX[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHROffsetEX[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHROffsetEX[num] = index & CHR_ROM_01KB_Mask; - } - - private void Switch04kCHRSP(int index, int where) - { - int num = (where >> 10) & 7; - index <<= 2; - CHROffsetSP[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHROffsetSP[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHROffsetSP[num] = index & CHR_ROM_01KB_Mask; - num++; - index++; - CHROffsetSP[num] = index & CHR_ROM_01KB_Mask; - } - - internal override void OnPPUScanlineTick() - { - irq_current_inframe = ((NesEmu.IsInRender() && NesEmu.IsRenderingOn()) ? 64 : 0); - if (irq_current_inframe == 0) - { - irq_current_inframe = 64; - irq_current_counter = 0; - irq_pending = 0; - NesEmu.IRQFlags &= -9; - return; - } - irq_current_counter++; - if (irq_current_counter == irq_line) - { - irq_pending = 128; - if (irq_enable == 128) - { - NesEmu.IRQFlags |= 8; - } - } - } - - internal override void OnAPUClock() - { - base.OnAPUClock(); - snd_1.Clock(); - snd_2.Clock(); - } - - internal override void OnAPUClockEnvelope() - { - base.OnAPUClockEnvelope(); - snd_1.ClockLength(); - snd_2.ClockLength(); - snd_1.ClockEnvelope(); - snd_2.ClockEnvelope(); - } - - internal override double APUGetSample() - { - return audio_pulse_table[snd_1.output + snd_2.output] + audio_tnd_table[snd_3.output]; - } - - internal override void APUApplyChannelsSettings() - { - base.APUApplyChannelsSettings(); - snd_1.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_MMC5_SQ1; - snd_2.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_MMC5_SQ2; - snd_3.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_MMC5_PCM; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(ram_protectA); - stream.Write(ram_protectB); - stream.Write(ExRAM_mode); - for (int i = 0; i < CHROffset_spr.Length; i++) - { - stream.Write(CHROffset_spr[i]); - } - for (int j = 0; j < CHROffsetEX.Length; j++) - { - stream.Write(CHROffsetEX[j]); - } - for (int k = 0; k < CHROffsetSP.Length; k++) - { - stream.Write(CHROffsetSP[k]); - } - for (int l = 0; l < chrRegA.Length; l++) - { - stream.Write(chrRegA[l]); - } - for (int m = 0; m < chrRegB.Length; m++) - { - stream.Write(chrRegB[m]); - } - for (int n = 0; n < prgReg.Length; n++) - { - stream.Write(prgReg[n]); - } - stream.Write(useSRAMmirroring); - stream.Write(chr_high); - stream.Write(chr_mode); - stream.Write(prg_mode); - stream.Write(chr_setB_last); - stream.Write(temp_val); - stream.Write(temp_fill); - stream.Write(lastAccessVRAM); - stream.Write(paletteNo); - stream.Write(shift); - stream.Write(EXtilenumber); - stream.Write(multiplicand); - stream.Write(multiplier); - stream.Write(product); - stream.Write(split_enable); - stream.Write(split_right); - stream.Write(split_tile); - stream.Write(split_yscroll); - stream.Write(split_doit); - stream.Write(split_watch_tile); - stream.Write(irq_line); - stream.Write(irq_enable); - stream.Write(irq_pending); - stream.Write(irq_current_counter); - stream.Write(irq_current_inframe); - snd_1.WriteStateData(ref stream); - snd_2.WriteStateData(ref stream); - snd_3.SaveState(ref stream); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - ram_protectA = stream.ReadInt32(); - ram_protectB = stream.ReadInt32(); - ExRAM_mode = stream.ReadInt32(); - for (int i = 0; i < CHROffset_spr.Length; i++) - { - CHROffset_spr[i] = stream.ReadInt32(); - } - for (int j = 0; j < CHROffsetEX.Length; j++) - { - CHROffsetEX[j] = stream.ReadInt32(); - } - for (int k = 0; k < CHROffsetSP.Length; k++) - { - CHROffsetSP[k] = stream.ReadInt32(); - } - for (int l = 0; l < chrRegA.Length; l++) - { - chrRegA[l] = stream.ReadInt32(); - } - for (int m = 0; m < chrRegB.Length; m++) - { - chrRegB[m] = stream.ReadInt32(); - } - for (int n = 0; n < prgReg.Length; n++) - { - prgReg[n] = stream.ReadInt32(); - } - useSRAMmirroring = stream.ReadBoolean(); - chr_high = stream.ReadInt32(); - chr_mode = stream.ReadInt32(); - prg_mode = stream.ReadInt32(); - chr_setB_last = stream.ReadBoolean(); - temp_val = stream.ReadByte(); - temp_fill = stream.ReadByte(); - lastAccessVRAM = stream.ReadInt32(); - paletteNo = stream.ReadInt32(); - shift = stream.ReadInt32(); - EXtilenumber = stream.ReadInt32(); - multiplicand = stream.ReadByte(); - multiplier = stream.ReadByte(); - product = stream.ReadUInt16(); - split_enable = stream.ReadBoolean(); - split_right = stream.ReadBoolean(); - split_tile = stream.ReadInt32(); - split_yscroll = stream.ReadInt32(); - split_doit = stream.ReadBoolean(); - split_watch_tile = stream.ReadInt32(); - irq_line = stream.ReadByte(); - irq_enable = stream.ReadByte(); - irq_pending = stream.ReadInt32(); - irq_current_counter = stream.ReadInt32(); - irq_current_inframe = stream.ReadInt32(); - snd_1.ReadStateData(ref stream); - snd_2.ReadStateData(ref stream); - snd_3.LoadState(ref stream); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper005.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper005.cs.meta deleted file mode 100644 index bdd5693..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper005.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bf04ed9f8d2fd1e4bb54763b3bc7bcfa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper006.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper006.cs deleted file mode 100644 index eb94d01..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper006.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("FFE F4xxx", 6)] - [HassIssues] - internal class Mapper006 : FFE - { - internal override string Issues => MNInterfaceLanguage.IssueMapper6; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(7, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR(data & 3); - Switch16KPRG((data >> 2) & 0xF, PRGArea.Area8000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper006.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper006.cs.meta deleted file mode 100644 index d05dd0f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper006.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a4104e887a80ef44f865e981d84b4d01 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper007.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper007.cs deleted file mode 100644 index c154ef8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper007.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("AxROM", 7)] - internal class Mapper007 : Board - { - internal override void WritePRG(ref ushort addr, ref byte val) - { - Switch01KNMTFromMirroring(((val & 0x10) == 16) ? Mirroring.OneScB : Mirroring.OneScA); - Switch32KPRG(val & 7, PRGArea.Area8000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper007.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper007.cs.meta deleted file mode 100644 index f142f13..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper007.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9829484ad2c88fd4ca0539447d126725 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper008.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper008.cs deleted file mode 100644 index 446db68..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper008.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("FFE F3xxx", 8)] - [HassIssues] - internal class Mapper008 : FFE - { - internal override string Issues => MNInterfaceLanguage.IssueMapper8; - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch32KPRG((data >> 4) & 3, PRGArea.Area8000); - Switch08KCHR(data & 3); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper008.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper008.cs.meta deleted file mode 100644 index b7e31ce..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper008.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e8b28ac4454361544919b7f879ab32d4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper009.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper009.cs deleted file mode 100644 index 4fa3514..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper009.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("MMC2", 9)] - internal class Mapper009 : MMC2 - { - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper009.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper009.cs.meta deleted file mode 100644 index c6bd0b7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper009.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b96edc1b48f9f6f44bcfa04f1d3bda1d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper010.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper010.cs deleted file mode 100644 index dfb28ae..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper010.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("MMC4", 10)] - internal class Mapper010 : MMC2 - { - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(0, PRGArea.Area8000); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if ((address & 0xF000) == 40960) - { - Switch16KPRG(data, PRGArea.Area8000); - } - else - { - base.WritePRG(ref address, ref data); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper010.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper010.cs.meta deleted file mode 100644 index f544b11..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper010.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4b1f6a01ae2d9b840b1bf3e87ba875f3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper011.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper011.cs deleted file mode 100644 index c758f09..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper011.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Color Dreams", 11)] - internal class Mapper011 : Board - { - private byte writeData; - - internal override void WritePRG(ref ushort address, ref byte data) - { - ReadPRG(ref address, out writeData); - writeData &= data; - Switch32KPRG(writeData & 3, PRGArea.Area8000); - Switch08KCHR((writeData >> 4) & 0xF); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper011.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper011.cs.meta deleted file mode 100644 index 36e2e45..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper011.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5c0a3239622d8e841b4cc5d0e35f15ae -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper013.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper013.cs deleted file mode 100644 index 8fe49f9..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper013.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("CPROM", 13, 1, 16)] - internal class Mapper013 : Board - { - private byte writeData; - - internal override void HardReset() - { - base.HardReset(); - Toggle08KCHR_RAM(ram: true); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - ReadPRG(ref address, out writeData); - writeData &= data; - Switch04KCHR(writeData & 3, CHRArea.Area1000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper013.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper013.cs.meta deleted file mode 100644 index ad302e8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper013.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6244402647756ed4c899d2d9e2b48754 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper015.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper015.cs deleted file mode 100644 index b8ed811..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper015.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("100-in-1 Contra Function 16", 15)] - internal class Mapper015 : Board - { - private int temp; - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 3) - { - case 0: - Switch16KPRG(data & 0x3F, PRGArea.Area8000); - Switch16KPRG((data & 0x3F) | 1, PRGArea.AreaC000); - break; - case 1: - Switch16KPRG(data & 0x3F, PRGArea.Area8000); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - break; - case 2: - temp = data << 1; - temp = ((data & 0x3F) << 1) | ((data >> 7) & 1); - Switch08KPRG(temp, PRGArea.Area8000); - Switch08KPRG(temp, PRGArea.AreaA000); - Switch08KPRG(temp, PRGArea.AreaC000); - Switch08KPRG(temp, PRGArea.AreaE000); - break; - case 3: - Switch16KPRG(data & 0x3F, PRGArea.Area8000); - Switch16KPRG(data & 0x3F, PRGArea.AreaC000); - break; - } - Switch01KNMTFromMirroring(((data & 0x40) == 64) ? Mirroring.Horz : Mirroring.Vert); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper015.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper015.cs.meta deleted file mode 100644 index 94eb1ed..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper015.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 91c36800c0238a84cbe2f1313237d9df -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper016.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper016.cs deleted file mode 100644 index b694bff..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper016.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Bandai", 16)] - internal class Mapper016 : Bandai - { - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper016.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper016.cs.meta deleted file mode 100644 index 52881ef..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper016.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0a10f96e86bb11143ba3f4bc30388390 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper017.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper017.cs deleted file mode 100644 index 68564b2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper017.cs +++ /dev/null @@ -1,64 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("FFE F8xxx", 17)] - internal class Mapper017 : FFE - { - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - switch (address) - { - case 17668: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 17669: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 17670: - Switch08KPRG(data, PRGArea.AreaC000); - break; - case 17671: - Switch08KPRG(data, PRGArea.AreaE000); - break; - case 17680: - Switch01KCHR(data, CHRArea.Area0000); - break; - case 17681: - Switch01KCHR(data, CHRArea.Area0400); - break; - case 17682: - Switch01KCHR(data, CHRArea.Area0800); - break; - case 17683: - Switch01KCHR(data, CHRArea.Area0C00); - break; - case 17684: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 17685: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 17686: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 17687: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 17672: - case 17673: - case 17674: - case 17675: - case 17676: - case 17677: - case 17678: - case 17679: - break; - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper017.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper017.cs.meta deleted file mode 100644 index 601a986..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper017.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a53431c37c141204e9148d581878b56e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper018.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper018.cs deleted file mode 100644 index b494b9f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper018.cs +++ /dev/null @@ -1,219 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Jaleco SS8806", 18)] - internal class Mapper018 : Board - { - private int[] prg_reg; - - private int[] chr_reg; - - private int irqRelaod; - - private int irqCounter; - - private bool irqEnable; - - private int irqMask; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - prg_reg = new int[3]; - chr_reg = new int[8]; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF003) - { - case 32768: - prg_reg[0] = (prg_reg[0] & 0xF0) | (data & 0xF); - Switch08KPRG(prg_reg[0], PRGArea.Area8000); - break; - case 32769: - prg_reg[0] = (prg_reg[0] & 0xF) | ((data & 0xF) << 4); - Switch08KPRG(prg_reg[0], PRGArea.Area8000); - break; - case 32770: - prg_reg[1] = (prg_reg[1] & 0xF0) | (data & 0xF); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - break; - case 32771: - prg_reg[1] = (prg_reg[1] & 0xF) | ((data & 0xF) << 4); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - break; - case 36864: - prg_reg[2] = (prg_reg[2] & 0xF0) | (data & 0xF); - Switch08KPRG(prg_reg[2], PRGArea.AreaC000); - break; - case 36865: - prg_reg[2] = (prg_reg[2] & 0xF) | ((data & 0xF) << 4); - Switch08KPRG(prg_reg[2], PRGArea.AreaC000); - break; - case 40960: - chr_reg[0] = (chr_reg[0] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_reg[0], CHRArea.Area0000); - break; - case 40961: - chr_reg[0] = (chr_reg[0] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_reg[0], CHRArea.Area0000); - break; - case 40962: - chr_reg[1] = (chr_reg[1] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_reg[1], CHRArea.Area0400); - break; - case 40963: - chr_reg[1] = (chr_reg[1] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_reg[1], CHRArea.Area0400); - break; - case 45056: - chr_reg[2] = (chr_reg[2] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_reg[2], CHRArea.Area0800); - break; - case 45057: - chr_reg[2] = (chr_reg[2] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_reg[2], CHRArea.Area0800); - break; - case 45058: - chr_reg[3] = (chr_reg[3] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_reg[3], CHRArea.Area0C00); - break; - case 45059: - chr_reg[3] = (chr_reg[3] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_reg[3], CHRArea.Area0C00); - break; - case 49152: - chr_reg[4] = (chr_reg[4] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_reg[4], CHRArea.Area1000); - break; - case 49153: - chr_reg[4] = (chr_reg[4] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_reg[4], CHRArea.Area1000); - break; - case 49154: - chr_reg[5] = (chr_reg[5] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_reg[5], CHRArea.Area1400); - break; - case 49155: - chr_reg[5] = (chr_reg[5] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_reg[5], CHRArea.Area1400); - break; - case 53248: - chr_reg[6] = (chr_reg[6] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_reg[6], CHRArea.Area1800); - break; - case 53249: - chr_reg[6] = (chr_reg[6] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_reg[6], CHRArea.Area1800); - break; - case 53250: - chr_reg[7] = (chr_reg[7] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_reg[7], CHRArea.Area1C00); - break; - case 53251: - chr_reg[7] = (chr_reg[7] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_reg[7], CHRArea.Area1C00); - break; - case 57344: - irqRelaod = (irqRelaod & 0xFFF0) | (data & 0xF); - break; - case 57345: - irqRelaod = (irqRelaod & 0xFF0F) | ((data & 0xF) << 4); - break; - case 57346: - irqRelaod = (irqRelaod & 0xF0FF) | ((data & 0xF) << 8); - break; - case 57347: - irqRelaod = (irqRelaod & 0xFFF) | ((data & 0xF) << 12); - break; - case 61440: - irqCounter = irqRelaod; - NesEmu.IRQFlags &= -9; - break; - case 61441: - irqEnable = (data & 1) == 1; - if ((data & 8) == 8) - { - irqMask = 15; - } - else if ((data & 4) == 4) - { - irqMask = 255; - } - else if ((data & 2) == 2) - { - irqMask = 4095; - } - else - { - irqMask = 65535; - } - NesEmu.IRQFlags &= -9; - break; - case 61442: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - } - } - - internal override void OnCPUClock() - { - if (irqEnable && (irqCounter & irqMask) > 0 && (--irqCounter & irqMask) == 0) - { - irqEnable = false; - NesEmu.IRQFlags |= 8; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - for (int i = 0; i < prg_reg.Length; i++) - { - stream.Write(prg_reg[i]); - } - for (int j = 0; j < chr_reg.Length; j++) - { - stream.Write(chr_reg[j]); - } - stream.Write(irqRelaod); - stream.Write(irqCounter); - stream.Write(irqEnable); - stream.Write(irqMask); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - for (int i = 0; i < prg_reg.Length; i++) - { - prg_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < chr_reg.Length; j++) - { - chr_reg[j] = stream.ReadInt32(); - } - irqRelaod = stream.ReadInt32(); - irqCounter = stream.ReadInt32(); - irqEnable = stream.ReadBoolean(); - irqMask = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper018.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper018.cs.meta deleted file mode 100644 index 3fc21f0..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper018.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b9409e3543eded64ba7d391f604d4157 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper019.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper019.cs deleted file mode 100644 index a1945cb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper019.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Namcot 106", 19, 1, 256)] - internal class Mapper019 : Namcot106 - { - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper019.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper019.cs.meta deleted file mode 100644 index 86d96db..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper019.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e12370c4d1f15a246ad180d702f92a1a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper021.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper021.cs deleted file mode 100644 index e40cfff..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper021.cs +++ /dev/null @@ -1,254 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("VRC4", 21)] - internal class Mapper021 : Board - { - private bool prg_mode; - - private byte prg_reg0; - - private int[] chr_Reg; - - private int irq_reload; - - private int irq_counter; - - private int prescaler; - - private bool irq_mode_cycle; - - private bool irq_enable; - - private bool irq_enable_on_ak; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - prescaler = 341; - chr_Reg = new int[8]; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address) - { - case 32768: - case 32770: - case 32772: - case 32774: - case 32832: - case 32896: - case 32960: - prg_reg0 = data; - Switch08KPRG(prg_mode ? (PRG_ROM_08KB_Mask - 1) : (prg_reg0 & 0x1F), PRGArea.Area8000); - Switch08KPRG(prg_mode ? (prg_reg0 & 0x1F) : (PRG_ROM_08KB_Mask - 1), PRGArea.AreaC000); - break; - case 36864: - case 36866: - case 36928: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 36868: - case 36870: - case 36992: - case 37056: - prg_mode = (data & 2) == 2; - Switch08KPRG(prg_mode ? (PRG_ROM_08KB_Mask - 1) : (prg_reg0 & 0x1F), PRGArea.Area8000); - Switch08KPRG(prg_mode ? (prg_reg0 & 0x1F) : (PRG_ROM_08KB_Mask - 1), PRGArea.AreaC000); - break; - case 40960: - case 40962: - case 40964: - case 40966: - case 41024: - case 41088: - case 41152: - Switch08KPRG(data & 0x1F, PRGArea.AreaA000); - break; - case 45056: - chr_Reg[0] = (chr_Reg[0] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[0], CHRArea.Area0000); - break; - case 45058: - case 45120: - chr_Reg[0] = (chr_Reg[0] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[0], CHRArea.Area0000); - break; - case 45060: - case 45184: - chr_Reg[1] = (chr_Reg[1] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[1], CHRArea.Area0400); - break; - case 45062: - case 45248: - chr_Reg[1] = (chr_Reg[1] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[1], CHRArea.Area0400); - break; - case 49152: - chr_Reg[2] = (chr_Reg[2] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[2], CHRArea.Area0800); - break; - case 49154: - case 49216: - chr_Reg[2] = (chr_Reg[2] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[2], CHRArea.Area0800); - break; - case 49156: - case 49280: - chr_Reg[3] = (chr_Reg[3] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[3], CHRArea.Area0C00); - break; - case 49158: - case 49344: - chr_Reg[3] = (chr_Reg[3] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[3], CHRArea.Area0C00); - break; - case 53248: - chr_Reg[4] = (chr_Reg[4] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[4], CHRArea.Area1000); - break; - case 53250: - case 53312: - chr_Reg[4] = (chr_Reg[4] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[4], CHRArea.Area1000); - break; - case 53252: - case 53376: - chr_Reg[5] = (chr_Reg[5] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[5], CHRArea.Area1400); - break; - case 53254: - case 53440: - chr_Reg[5] = (chr_Reg[5] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[5], CHRArea.Area1400); - break; - case 57344: - chr_Reg[6] = (chr_Reg[6] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[6], CHRArea.Area1800); - break; - case 57346: - case 57408: - chr_Reg[6] = (chr_Reg[6] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[6], CHRArea.Area1800); - break; - case 57348: - case 57472: - chr_Reg[7] = (chr_Reg[7] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[7], CHRArea.Area1C00); - break; - case 57350: - case 57536: - chr_Reg[7] = (chr_Reg[7] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[7], CHRArea.Area1C00); - break; - case 61440: - irq_reload = (irq_reload & 0xF0) | (data & 0xF); - break; - case 61442: - case 61504: - irq_reload = (irq_reload & 0xF) | ((data & 0xF) << 4); - break; - case 61444: - case 61568: - irq_mode_cycle = (data & 4) == 4; - irq_enable = (data & 2) == 2; - irq_enable_on_ak = (data & 1) == 1; - if (irq_enable) - { - irq_counter = irq_reload; - prescaler = 341; - } - NesEmu.IRQFlags &= -9; - break; - case 61446: - case 61632: - NesEmu.IRQFlags &= -9; - irq_enable = irq_enable_on_ak; - break; - } - } - - internal override void OnCPUClock() - { - if (!irq_enable) - { - return; - } - if (!irq_mode_cycle) - { - if (prescaler > 0) - { - prescaler -= 3; - return; - } - prescaler = 341; - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - else - { - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(prg_mode); - stream.Write(prg_reg0); - for (int i = 0; i < chr_Reg.Length; i++) - { - stream.Write(chr_Reg[i]); - } - stream.Write(irq_reload); - stream.Write(irq_counter); - stream.Write(prescaler); - stream.Write(irq_mode_cycle); - stream.Write(irq_enable); - stream.Write(irq_enable_on_ak); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - prg_mode = stream.ReadBoolean(); - prg_reg0 = stream.ReadByte(); - for (int i = 0; i < chr_Reg.Length; i++) - { - chr_Reg[i] = stream.ReadInt32(); - } - irq_reload = stream.ReadInt32(); - irq_counter = stream.ReadInt32(); - prescaler = stream.ReadInt32(); - irq_mode_cycle = stream.ReadBoolean(); - irq_enable = stream.ReadBoolean(); - irq_enable_on_ak = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper021.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper021.cs.meta deleted file mode 100644 index 59f7ada..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper021.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0579b5a05fd8d6f4e8351ee140dda132 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper022.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper022.cs deleted file mode 100644 index 6d0876d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper022.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("VRC2", 22)] - internal class Mapper022 : Board - { - private int[] chr_Reg; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - chr_Reg = new int[8]; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address) - { - case 32768: - case 32769: - case 32770: - case 32771: - Switch08KPRG(data & 0xF, PRGArea.Area8000); - break; - case 36864: - case 36865: - case 36866: - case 36867: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 40960: - case 40961: - case 40962: - case 40963: - Switch08KPRG(data & 0xF, PRGArea.AreaA000); - break; - case 45056: - chr_Reg[0] = (chr_Reg[0] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[0] >> 1, CHRArea.Area0000); - break; - case 45058: - chr_Reg[0] = (chr_Reg[0] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[0] >> 1, CHRArea.Area0000); - break; - case 45057: - chr_Reg[1] = (chr_Reg[1] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[1] >> 1, CHRArea.Area0400); - break; - case 45059: - chr_Reg[1] = (chr_Reg[1] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[1] >> 1, CHRArea.Area0400); - break; - case 49152: - chr_Reg[2] = (chr_Reg[2] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[2] >> 1, CHRArea.Area0800); - break; - case 49154: - chr_Reg[2] = (chr_Reg[2] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[2] >> 1, CHRArea.Area0800); - break; - case 49153: - chr_Reg[3] = (chr_Reg[3] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[3] >> 1, CHRArea.Area0C00); - break; - case 49155: - chr_Reg[3] = (chr_Reg[3] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[3] >> 1, CHRArea.Area0C00); - break; - case 53248: - chr_Reg[4] = (chr_Reg[4] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[4] >> 1, CHRArea.Area1000); - break; - case 53250: - chr_Reg[4] = (chr_Reg[4] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[4] >> 1, CHRArea.Area1000); - break; - case 53249: - chr_Reg[5] = (chr_Reg[5] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[5] >> 1, CHRArea.Area1400); - break; - case 53251: - chr_Reg[5] = (chr_Reg[5] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[5] >> 1, CHRArea.Area1400); - break; - case 57344: - chr_Reg[6] = (chr_Reg[6] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[6] >> 1, CHRArea.Area1800); - break; - case 57346: - chr_Reg[6] = (chr_Reg[6] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[6] >> 1, CHRArea.Area1800); - break; - case 57345: - chr_Reg[7] = (chr_Reg[7] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[7] >> 1, CHRArea.Area1C00); - break; - case 57347: - chr_Reg[7] = (chr_Reg[7] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[7] >> 1, CHRArea.Area1C00); - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - for (int i = 0; i < chr_Reg.Length; i++) - { - stream.Write(chr_Reg[i]); - } - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - for (int i = 0; i < chr_Reg.Length; i++) - { - chr_Reg[i] = stream.ReadInt32(); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper022.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper022.cs.meta deleted file mode 100644 index ddd31b1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper022.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 37f7c4432f871c64287860405074e0cb -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper023.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper023.cs deleted file mode 100644 index a4ffe2f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper023.cs +++ /dev/null @@ -1,163 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("VRC2", 23)] - internal class Mapper023 : Board - { - private int[] chr_Reg; - - private byte security; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - chr_Reg = new int[8]; - security = 0; - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - if (address == 24576) - { - security = (byte)(data & 1u); - } - } - - internal override void ReadSRM(ref ushort address, out byte data) - { - if (address == 24576) - { - data = security; - } - else - { - data = 0; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address) - { - case 32768: - case 32769: - case 32770: - case 32771: - Switch08KPRG(data & 0xF, PRGArea.Area8000); - break; - case 36864: - case 36865: - case 36866: - case 36867: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 40960: - case 40961: - case 40962: - case 40963: - Switch08KPRG(data & 0xF, PRGArea.AreaA000); - break; - case 45056: - chr_Reg[0] = (chr_Reg[0] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[0], CHRArea.Area0000); - break; - case 45057: - chr_Reg[0] = (chr_Reg[0] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[0], CHRArea.Area0000); - break; - case 45058: - chr_Reg[1] = (chr_Reg[1] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[1], CHRArea.Area0400); - break; - case 45059: - chr_Reg[1] = (chr_Reg[1] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[1], CHRArea.Area0400); - break; - case 49152: - chr_Reg[2] = (chr_Reg[2] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[2], CHRArea.Area0800); - break; - case 49153: - chr_Reg[2] = (chr_Reg[2] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[2], CHRArea.Area0800); - break; - case 49154: - chr_Reg[3] = (chr_Reg[3] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[3], CHRArea.Area0C00); - break; - case 49155: - chr_Reg[3] = (chr_Reg[3] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[3], CHRArea.Area0C00); - break; - case 53248: - chr_Reg[4] = (chr_Reg[4] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[4], CHRArea.Area1000); - break; - case 53249: - chr_Reg[4] = (chr_Reg[4] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[4], CHRArea.Area1000); - break; - case 53250: - chr_Reg[5] = (chr_Reg[5] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[5], CHRArea.Area1400); - break; - case 53251: - chr_Reg[5] = (chr_Reg[5] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[5], CHRArea.Area1400); - break; - case 57344: - chr_Reg[6] = (chr_Reg[6] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[6], CHRArea.Area1800); - break; - case 57345: - chr_Reg[6] = (chr_Reg[6] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[6], CHRArea.Area1800); - break; - case 57346: - chr_Reg[7] = (chr_Reg[7] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[7], CHRArea.Area1C00); - break; - case 57347: - chr_Reg[7] = (chr_Reg[7] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[7], CHRArea.Area1C00); - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - for (int i = 0; i < chr_Reg.Length; i++) - { - stream.Write(chr_Reg[i]); - } - stream.Write(security); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - for (int i = 0; i < chr_Reg.Length; i++) - { - chr_Reg[i] = stream.ReadInt32(); - } - security = stream.ReadByte(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper023.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper023.cs.meta deleted file mode 100644 index 11e063f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper023.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ad20b02baf8d45749a5f2ffffcba13f5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper024.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper024.cs deleted file mode 100644 index 57f2fac..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper024.cs +++ /dev/null @@ -1,245 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("VRC6", 24)] - [WithExternalSound] - internal class Mapper024 : Board - { - private int irq_reload; - - private int irq_counter; - - private int prescaler; - - private bool irq_mode_cycle; - - private bool irq_enable; - - private bool irq_enable_on_ak; - - private VRC6Pulse snd_1; - - private VRC6Pulse snd_2; - - private VRC6Sawtooth snd_3; - - private double[] audio_pulse_table; - - private double[] audio_tnd_table; - - internal override void Initialize(IRom rom) - { - base.Initialize(rom); - snd_1 = new VRC6Pulse(); - snd_2 = new VRC6Pulse(); - snd_3 = new VRC6Sawtooth(); - audio_pulse_table = new double[32]; - for (int i = 0; i < 32; i++) - { - audio_pulse_table[i] = 95.52 / (8128.0 / (double)i + 100.0); - } - audio_tnd_table = new double[204]; - for (int j = 0; j < 204; j++) - { - audio_tnd_table[j] = 163.67 / (24329.0 / (double)j + 100.0); - } - } - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - APUApplyChannelsSettings(); - snd_1.HardReset(); - snd_2.HardReset(); - snd_3.HardReset(); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address) - { - case 32768: - case 32769: - case 32770: - case 32771: - Switch16KPRG(data, PRGArea.Area8000); - break; - case 36864: - snd_1.Write0(ref data); - break; - case 36865: - snd_1.Write1(ref data); - break; - case 36866: - snd_1.Write2(ref data); - break; - case 40960: - snd_2.Write0(ref data); - break; - case 40961: - snd_2.Write1(ref data); - break; - case 40962: - snd_2.Write2(ref data); - break; - case 45056: - snd_3.Write0(ref data); - break; - case 45057: - snd_3.Write1(ref data); - break; - case 45058: - snd_3.Write2(ref data); - break; - case 45059: - switch ((data & 0xC) >> 2) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 49152: - case 49153: - case 49154: - case 49155: - Switch08KPRG(data, PRGArea.AreaC000); - break; - case 53248: - Switch01KCHR(data, CHRArea.Area0000); - break; - case 53249: - Switch01KCHR(data, CHRArea.Area0400); - break; - case 53250: - Switch01KCHR(data, CHRArea.Area0800); - break; - case 53251: - Switch01KCHR(data, CHRArea.Area0C00); - break; - case 57344: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 57345: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 57346: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 57347: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 61440: - irq_reload = data; - break; - case 61441: - irq_mode_cycle = (data & 4) == 4; - irq_enable = (data & 2) == 2; - irq_enable_on_ak = (data & 1) == 1; - if (irq_enable) - { - irq_counter = irq_reload; - prescaler = 341; - } - NesEmu.IRQFlags &= -9; - break; - case 61442: - NesEmu.IRQFlags &= -9; - irq_enable = irq_enable_on_ak; - break; - } - } - - internal override void OnCPUClock() - { - if (!irq_enable) - { - return; - } - if (!irq_mode_cycle) - { - if (prescaler > 0) - { - prescaler -= 3; - return; - } - prescaler = 341; - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - else - { - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - } - - internal override void OnAPUClockSingle() - { - base.OnAPUClockSingle(); - snd_1.ClockSingle(); - snd_2.ClockSingle(); - snd_3.ClockSingle(); - } - - internal override void APUApplyChannelsSettings() - { - base.APUApplyChannelsSettings(); - snd_1.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_VRC6_SQ1; - snd_2.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_VRC6_SQ2; - snd_3.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_VRC6_SAW; - } - - internal override double APUGetSample() - { - return audio_pulse_table[snd_1.output + snd_2.output] + audio_tnd_table[snd_3.output]; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(irq_reload); - stream.Write(irq_counter); - stream.Write(prescaler); - stream.Write(irq_mode_cycle); - stream.Write(irq_enable); - stream.Write(irq_enable_on_ak); - snd_1.SaveState(ref stream); - snd_2.SaveState(ref stream); - snd_3.SaveState(ref stream); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - irq_reload = stream.ReadInt32(); - irq_counter = stream.ReadInt32(); - prescaler = stream.ReadInt32(); - irq_mode_cycle = stream.ReadBoolean(); - irq_enable = stream.ReadBoolean(); - irq_enable_on_ak = stream.ReadBoolean(); - snd_1.LoadState(ref stream); - snd_2.LoadState(ref stream); - snd_3.LoadState(ref stream); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper024.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper024.cs.meta deleted file mode 100644 index 5dbecfc..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper024.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 555beee22dceafd4598f922cfd1aca63 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper025.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper025.cs deleted file mode 100644 index a857cb8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper025.cs +++ /dev/null @@ -1,254 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("VRC4", 25)] - internal class Mapper025 : Board - { - private bool prg_mode; - - private byte prg_reg0; - - private int[] chr_Reg; - - private int irq_reload; - - private int irq_counter; - - private int prescaler; - - private bool irq_mode_cycle; - - private bool irq_enable; - - private bool irq_enable_on_ak; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - prescaler = 341; - chr_Reg = new int[8]; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address) - { - case 32768: - case 32769: - case 32770: - case 32771: - case 32772: - case 32776: - case 32780: - prg_reg0 = data; - Switch08KPRG(prg_mode ? (PRG_ROM_08KB_Mask - 1) : (prg_reg0 & 0x1F), PRGArea.Area8000); - Switch08KPRG(prg_mode ? (prg_reg0 & 0x1F) : (PRG_ROM_08KB_Mask - 1), PRGArea.AreaC000); - break; - case 36864: - case 36866: - case 36872: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 36865: - case 36867: - case 36868: - case 36876: - prg_mode = (data & 2) == 2; - Switch08KPRG(prg_mode ? (PRG_ROM_08KB_Mask - 1) : (prg_reg0 & 0x1F), PRGArea.Area8000); - Switch08KPRG(prg_mode ? (prg_reg0 & 0x1F) : (PRG_ROM_08KB_Mask - 1), PRGArea.AreaC000); - break; - case 40960: - case 40961: - case 40962: - case 40963: - case 40964: - case 40968: - case 40972: - Switch08KPRG(data & 0x1F, PRGArea.AreaA000); - break; - case 45056: - chr_Reg[0] = (chr_Reg[0] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[0], CHRArea.Area0000); - break; - case 45058: - case 45064: - chr_Reg[0] = (chr_Reg[0] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[0], CHRArea.Area0000); - break; - case 45057: - case 45060: - chr_Reg[1] = (chr_Reg[1] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[1], CHRArea.Area0400); - break; - case 45059: - case 45068: - chr_Reg[1] = (chr_Reg[1] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[1], CHRArea.Area0400); - break; - case 49152: - chr_Reg[2] = (chr_Reg[2] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[2], CHRArea.Area0800); - break; - case 49154: - case 49160: - chr_Reg[2] = (chr_Reg[2] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[2], CHRArea.Area0800); - break; - case 49153: - case 49156: - chr_Reg[3] = (chr_Reg[3] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[3], CHRArea.Area0C00); - break; - case 49155: - case 49164: - chr_Reg[3] = (chr_Reg[3] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[3], CHRArea.Area0C00); - break; - case 53248: - chr_Reg[4] = (chr_Reg[4] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[4], CHRArea.Area1000); - break; - case 53250: - case 53256: - chr_Reg[4] = (chr_Reg[4] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[4], CHRArea.Area1000); - break; - case 53249: - case 53252: - chr_Reg[5] = (chr_Reg[5] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[5], CHRArea.Area1400); - break; - case 53251: - case 53260: - chr_Reg[5] = (chr_Reg[5] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[5], CHRArea.Area1400); - break; - case 57344: - chr_Reg[6] = (chr_Reg[6] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[6], CHRArea.Area1800); - break; - case 57346: - case 57352: - chr_Reg[6] = (chr_Reg[6] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[6], CHRArea.Area1800); - break; - case 57345: - case 57348: - chr_Reg[7] = (chr_Reg[7] & 0xF0) | (data & 0xF); - Switch01KCHR(chr_Reg[7], CHRArea.Area1C00); - break; - case 57347: - case 57356: - chr_Reg[7] = (chr_Reg[7] & 0xF) | ((data & 0xF) << 4); - Switch01KCHR(chr_Reg[7], CHRArea.Area1C00); - break; - case 61440: - irq_reload = (irq_reload & 0xF0) | (data & 0xF); - break; - case 61442: - case 61448: - irq_reload = (irq_reload & 0xF) | ((data & 0xF) << 4); - break; - case 61441: - case 61444: - irq_mode_cycle = (data & 4) == 4; - irq_enable = (data & 2) == 2; - irq_enable_on_ak = (data & 1) == 1; - if (irq_enable) - { - irq_counter = irq_reload; - prescaler = 341; - } - NesEmu.IRQFlags &= -9; - break; - case 61443: - case 61452: - NesEmu.IRQFlags &= -9; - irq_enable = irq_enable_on_ak; - break; - } - } - - internal override void OnCPUClock() - { - if (!irq_enable) - { - return; - } - if (!irq_mode_cycle) - { - if (prescaler > 0) - { - prescaler -= 3; - return; - } - prescaler = 341; - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - else - { - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(prg_mode); - stream.Write(prg_reg0); - for (int i = 0; i < chr_Reg.Length; i++) - { - stream.Write(chr_Reg[i]); - } - stream.Write(irq_reload); - stream.Write(irq_counter); - stream.Write(prescaler); - stream.Write(irq_mode_cycle); - stream.Write(irq_enable); - stream.Write(irq_enable_on_ak); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - prg_mode = stream.ReadBoolean(); - prg_reg0 = stream.ReadByte(); - for (int i = 0; i < chr_Reg.Length; i++) - { - chr_Reg[i] = stream.ReadInt32(); - } - irq_reload = stream.ReadInt32(); - irq_counter = stream.ReadInt32(); - prescaler = stream.ReadInt32(); - irq_mode_cycle = stream.ReadBoolean(); - irq_enable = stream.ReadBoolean(); - irq_enable_on_ak = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper025.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper025.cs.meta deleted file mode 100644 index 35a992b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper025.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c486d1b95f6d6fb4a922255ec293358e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper026.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper026.cs deleted file mode 100644 index d9a6756..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper026.cs +++ /dev/null @@ -1,245 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("VRC6", 26)] - [WithExternalSound] - internal class Mapper026 : Board - { - private int irq_reload; - - private int irq_counter; - - private int prescaler; - - private bool irq_mode_cycle; - - private bool irq_enable; - - private bool irq_enable_on_ak; - - private VRC6Pulse snd_1; - - private VRC6Pulse snd_2; - - private VRC6Sawtooth snd_3; - - private double[] audio_pulse_table; - - private double[] audio_tnd_table; - - internal override void Initialize(IRom rom) - { - base.Initialize(rom); - snd_1 = new VRC6Pulse(); - snd_2 = new VRC6Pulse(); - snd_3 = new VRC6Sawtooth(); - audio_pulse_table = new double[32]; - for (int i = 0; i < 32; i++) - { - audio_pulse_table[i] = 95.52 / (8128.0 / (double)i + 100.0); - } - audio_tnd_table = new double[204]; - for (int j = 0; j < 204; j++) - { - audio_tnd_table[j] = 163.67 / (24329.0 / (double)j + 100.0); - } - } - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - APUApplyChannelsSettings(); - snd_1.HardReset(); - snd_2.HardReset(); - snd_3.HardReset(); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address) - { - case 32768: - case 32769: - case 32770: - case 32771: - Switch16KPRG(data, PRGArea.Area8000); - break; - case 36864: - snd_1.Write0(ref data); - break; - case 36866: - snd_1.Write1(ref data); - break; - case 36865: - snd_1.Write2(ref data); - break; - case 40960: - snd_2.Write0(ref data); - break; - case 40962: - snd_2.Write1(ref data); - break; - case 40961: - snd_2.Write2(ref data); - break; - case 45056: - snd_3.Write0(ref data); - break; - case 45058: - snd_3.Write1(ref data); - break; - case 45057: - snd_3.Write2(ref data); - break; - case 45059: - switch ((data & 0xC) >> 2) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 49152: - case 49153: - case 49154: - case 49155: - Switch08KPRG(data, PRGArea.AreaC000); - break; - case 53248: - Switch01KCHR(data, CHRArea.Area0000); - break; - case 53250: - Switch01KCHR(data, CHRArea.Area0400); - break; - case 53249: - Switch01KCHR(data, CHRArea.Area0800); - break; - case 53251: - Switch01KCHR(data, CHRArea.Area0C00); - break; - case 57344: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 57346: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 57345: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 57347: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 61440: - irq_reload = data; - break; - case 61442: - irq_mode_cycle = (data & 4) == 4; - irq_enable = (data & 2) == 2; - irq_enable_on_ak = (data & 1) == 1; - if (irq_enable) - { - irq_counter = irq_reload; - prescaler = 341; - } - NesEmu.IRQFlags &= -9; - break; - case 61441: - NesEmu.IRQFlags &= -9; - irq_enable = irq_enable_on_ak; - break; - } - } - - internal override void OnCPUClock() - { - if (!irq_enable) - { - return; - } - if (!irq_mode_cycle) - { - if (prescaler > 0) - { - prescaler -= 3; - return; - } - prescaler = 341; - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - else - { - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - } - - internal override void OnAPUClockSingle() - { - base.OnAPUClockSingle(); - snd_1.ClockSingle(); - snd_2.ClockSingle(); - snd_3.ClockSingle(); - } - - internal override void APUApplyChannelsSettings() - { - base.APUApplyChannelsSettings(); - snd_1.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_VRC6_SQ1; - snd_2.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_VRC6_SQ2; - snd_3.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_VRC6_SAW; - } - - internal override double APUGetSample() - { - return audio_pulse_table[snd_1.output + snd_2.output] + audio_tnd_table[snd_3.output]; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(irq_reload); - stream.Write(irq_counter); - stream.Write(prescaler); - stream.Write(irq_mode_cycle); - stream.Write(irq_enable); - stream.Write(irq_enable_on_ak); - snd_1.SaveState(ref stream); - snd_2.SaveState(ref stream); - snd_3.SaveState(ref stream); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - irq_reload = stream.ReadInt32(); - irq_counter = stream.ReadInt32(); - prescaler = stream.ReadInt32(); - irq_mode_cycle = stream.ReadBoolean(); - irq_enable = stream.ReadBoolean(); - irq_enable_on_ak = stream.ReadBoolean(); - snd_1.LoadState(ref stream); - snd_2.LoadState(ref stream); - snd_3.LoadState(ref stream); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper026.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper026.cs.meta deleted file mode 100644 index dcf8632..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper026.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: db4baec7ce5fb7143a58e2698f6a5e31 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper032.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper032.cs deleted file mode 100644 index d2147d1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper032.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Irem G-101", 32)] - internal class Mapper032 : Board - { - private bool prg_mode; - - private byte prg_reg0; - - private bool enable_mirroring_switch; - - internal override void HardReset() - { - base.HardReset(); - enable_mirroring_switch = true; - if (SHA1 == "7E4180432726A433C46BA2206D9E13B32761C11E") - { - enable_mirroring_switch = false; - Switch01KNMTFromMirroring(Mirroring.OneScA); - } - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF007) - { - case 32768: - case 32769: - case 32770: - case 32771: - case 32772: - case 32773: - case 32774: - case 32775: - prg_reg0 = data; - Switch08KPRG((!prg_mode) ? prg_reg0 : 0, PRGArea.Area8000); - Switch08KPRG(prg_mode ? prg_reg0 : (PRG_ROM_08KB_Mask - 1), PRGArea.AreaC000); - break; - case 36864: - case 36865: - case 36866: - case 36867: - case 36868: - case 36869: - case 36870: - case 36871: - prg_mode = (data & 2) == 2; - Switch08KPRG((!prg_mode) ? prg_reg0 : 0, PRGArea.Area8000); - Switch08KPRG(prg_mode ? prg_reg0 : (PRG_ROM_08KB_Mask - 1), PRGArea.AreaC000); - if (enable_mirroring_switch) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40960: - case 40961: - case 40962: - case 40963: - case 40964: - case 40965: - case 40966: - case 40967: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 45056: - Switch01KCHR(data, CHRArea.Area0000); - break; - case 45057: - Switch01KCHR(data, CHRArea.Area0400); - break; - case 45058: - Switch01KCHR(data, CHRArea.Area0800); - break; - case 45059: - Switch01KCHR(data, CHRArea.Area0C00); - break; - case 45060: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 45061: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 45062: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 45063: - Switch01KCHR(data, CHRArea.Area1C00); - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(prg_mode); - stream.Write(prg_reg0); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - prg_mode = stream.ReadBoolean(); - prg_reg0 = stream.ReadByte(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper032.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper032.cs.meta deleted file mode 100644 index 9991fdc..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper032.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e87da889f2fa51f49a00fb850557d445 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper033.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper033.cs deleted file mode 100644 index f29316f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper033.cs +++ /dev/null @@ -1,177 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Taito TC0190/TC0350", 33)] - [HassIssues] - internal class Mapper033 : Board - { - private bool MODE; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override string Issues => MNInterfaceLanguage.IssueMapper33; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - MODE = true; - if (IsGameFoundOnDB) - { - foreach (string chip in base.Chips) - { - if (chip.Contains("TC0190")) - { - MODE = false; - ppuA12TogglesOnRaisingEdge = true; - enabled_ppuA12ToggleTimer = true; - break; - } - } - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - mmc3_alt_behavior = false; - irq_clear = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if (!MODE) - { - switch (address & 0xE003) - { - case 32768: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 32769: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 32770: - Switch02KCHR(data, CHRArea.Area0000); - break; - case 32771: - Switch02KCHR(data, CHRArea.Area0800); - break; - case 40960: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 40961: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 40962: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 40963: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 49152: - irq_reload = (byte)(data ^ 0xFFu); - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 49154: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 49155: - irq_enabled = true; - break; - case 57344: - Switch01KNMTFromMirroring(((data & 0x40) == 64) ? Mirroring.Horz : Mirroring.Vert); - break; - } - } - else - { - switch (address & 0xA003) - { - case 32768: - Switch01KNMTFromMirroring(((data & 0x40) == 64) ? Mirroring.Horz : Mirroring.Vert); - Switch08KPRG(data & 0x3F, PRGArea.Area8000); - break; - case 32769: - Switch08KPRG(data & 0x3F, PRGArea.AreaA000); - break; - case 32770: - Switch02KCHR(data, CHRArea.Area0000); - break; - case 32771: - Switch02KCHR(data, CHRArea.Area0800); - break; - case 40960: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 40961: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 40962: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 40963: - Switch01KCHR(data, CHRArea.Area1C00); - break; - } - } - } - - internal override void OnPPUA12RaisingEdge() - { - if (!MODE) - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper033.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper033.cs.meta deleted file mode 100644 index 2076edf..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper033.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0d361d388950f6c4780d369471cd60d6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper034.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper034.cs deleted file mode 100644 index fbb049f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper034.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("BxROM/NINA-001", 34)] - internal class Mapper034 : Board - { - private bool BxROM; - - private byte writeData; - - internal override void HardReset() - { - base.HardReset(); - BxROM = true; - if (base.BoardType.Contains("NINA")) - { - BxROM = false; - } - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - base.WriteSRM(ref address, ref data); - if (!BxROM) - { - switch (address) - { - case 32765: - Switch32KPRG(data, PRGArea.Area8000); - break; - case 32766: - Switch04KCHR(data, CHRArea.Area0000); - break; - case 32767: - Switch04KCHR(data, CHRArea.Area1000); - break; - } - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if (BxROM) - { - ReadPRG(ref address, out writeData); - writeData &= data; - Switch32KPRG(writeData, PRGArea.Area8000); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper034.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper034.cs.meta deleted file mode 100644 index f25520f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper034.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d2c0d2bbce836014c834aa850db5c74e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper041.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper041.cs deleted file mode 100644 index 0cb7637..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper041.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Caltron 6-in-1", 41)] - internal class Mapper041 : Board - { - private bool enableReg; - - private int vromReg; - - internal override void HardReset() - { - base.HardReset(); - vromReg = 0; - enableReg = true; - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - if (address <= 26623) - { - Switch32KPRG(address & 7, PRGArea.Area8000); - enableReg = (address & 4) == 4; - vromReg = (vromReg & 3) | ((address >> 1) & 0xC); - Switch08KCHR(vromReg); - Switch01KNMTFromMirroring(((address & 0x20) == 32) ? Mirroring.Horz : Mirroring.Vert); - } - else - { - base.WriteSRM(ref address, ref data); - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if (enableReg) - { - vromReg = (vromReg & 0xC) | (data & 3); - Switch08KCHR(vromReg); - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(enableReg); - stream.Write(vromReg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - enableReg = stream.ReadBoolean(); - vromReg = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper041.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper041.cs.meta deleted file mode 100644 index a70d39f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper041.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d7289b55e4c007a4c926f7b572f2469c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper042.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper042.cs deleted file mode 100644 index 17590f6..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper042.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Mario Baby", 42)] - internal class Mapper042 : Board - { - private int SRAM_PRG_Page; - - private bool irqEnable; - - private int irqCounter; - - internal override void HardReset() - { - base.HardReset(); - Switch32KPRG(PRG_ROM_32KB_Mask, PRGArea.Area8000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if (address == 32768) - { - Switch08KCHR(data); - return; - } - if (address == 61440) - { - SRAM_PRG_Page = data << 13; - return; - } - switch (address & 0xE003) - { - case 57344: - Switch08KPRG(data, PRGArea.Area6000); - break; - case 57345: - if ((data & 8) == 8) - { - Switch01KNMTFromMirroring(Mirroring.Horz); - } - else - { - Switch01KNMTFromMirroring(Mirroring.Vert); - } - break; - case 57346: - irqEnable = (data & 2) == 2; - if (!irqEnable) - { - irqCounter = 0; - } - NesEmu.IRQFlags &= -9; - break; - } - } - - internal override void OnCPUClock() - { - if (!irqEnable) - { - return; - } - int num = irqCounter++; - if ((irqCounter & 0x6000) != (num & 0x6000)) - { - if ((irqCounter & 0x6000) == 24576) - { - NesEmu.IRQFlags |= 8; - } - else - { - NesEmu.IRQFlags &= -9; - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(SRAM_PRG_Page); - stream.Write(irqEnable); - stream.Write(irqCounter); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - SRAM_PRG_Page = stream.ReadInt32(); - irqEnable = stream.ReadBoolean(); - irqCounter = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper042.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper042.cs.meta deleted file mode 100644 index d26c363..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper042.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8d14e7ff8c821fd40a2583903904425c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper044.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper044.cs deleted file mode 100644 index bfa9ff3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper044.cs +++ /dev/null @@ -1,235 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("7-in-1 MMC3 Port A001h", 44, true, true)] - [HassIssues] - internal class Mapper044 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int block; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - private int prg_and; - - private int prg_or; - - private int chr_and; - - private int chr_or; - - internal override string Issues => MNInterfaceLanguage.IssueMapper44; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_and = 15; - prg_or = 0; - chr_and = 127; - chr_or = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - block = data & 7; - prg_and = ((block > 5) ? 31 : 15); - prg_or = ((block < 5) ? (block << 4) : 96); - chr_and = ((block > 5) ? 255 : 127); - chr_or = ((block < 5) ? (block << 7) : 768); - SetupPRG(); - SetupCHR(); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area0000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area0800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area1000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area1400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area1800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area1C00); - } - else - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area1000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area1800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area0000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area0400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area0800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG((prg_reg[flag_p ? 2 : 0] & prg_and) | prg_or, PRGArea.Area8000); - Switch08KPRG((prg_reg[1] & prg_and) | prg_or, PRGArea.AreaA000); - Switch08KPRG((prg_reg[(!flag_p) ? 2 : 0] & prg_and) | prg_or, PRGArea.AreaC000); - Switch08KPRG((prg_reg[3] & prg_and) | prg_or, PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - stream.Write(block); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(prg_and); - stream.Write(prg_or); - stream.Write(chr_and); - stream.Write(chr_or); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - block = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - prg_and = stream.ReadInt32(); - prg_or = stream.ReadInt32(); - chr_and = stream.ReadInt32(); - chr_or = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper044.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper044.cs.meta deleted file mode 100644 index a8a9ae7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper044.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5454ce1b5791e5c4bbf39820d9fd4bac -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper045.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper045.cs deleted file mode 100644 index e55b8d2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper045.cs +++ /dev/null @@ -1,294 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("X-in-1 MMC3 Port 6000hx4", 45, true, true)] - internal class Mapper045 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - private bool locked; - - private int regCounter; - - private int prg_and; - - private int prg_or; - - private int chr_and; - - private int chr_or; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_and = 63; - prg_or = 0; - chr_and = 4095; - chr_or = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - locked = false; - regCounter = 0; - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - if (locked) - { - base.WriteSRM(ref address, ref data); - return; - } - switch (regCounter) - { - case 0: - chr_or = (chr_or & 0xFF00) | data; - SetupCHR(); - break; - case 1: - prg_or = data; - SetupPRG(); - break; - case 2: - if ((data & 8) == 8) - { - chr_and = (1 << (data & 7) + 1) - 1; - } - else - { - chr_and = ((data <= 0) ? (-1) : 0); - } - chr_or = (chr_or & 0xFF) | ((data & 0xF0) << 4); - SetupCHR(); - break; - case 3: - locked = (data & 0x40) == 64; - prg_and = (data & 0x3F) ^ 0x3F; - SetupPRG(); - break; - } - regCounter++; - if (regCounter > 3) - { - regCounter = 0; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area0000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area0800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area1000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area1400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area1800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area1C00); - } - else - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area1000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area1800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area0000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area0400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area0800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG((prg_reg[flag_p ? 2 : 0] & prg_and) | prg_or, PRGArea.Area8000); - Switch08KPRG((prg_reg[1] & prg_and) | prg_or, PRGArea.AreaA000); - Switch08KPRG((prg_reg[(!flag_p) ? 2 : 0] & prg_and) | prg_or, PRGArea.AreaC000); - Switch08KPRG((prg_reg[3] & prg_and) | prg_or, PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(prg_and); - stream.Write(prg_or); - stream.Write(chr_and); - stream.Write(chr_or); - stream.Write(locked); - stream.Write(regCounter); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - prg_and = stream.ReadInt32(); - prg_or = stream.ReadInt32(); - chr_and = stream.ReadInt32(); - chr_or = stream.ReadInt32(); - locked = stream.ReadBoolean(); - regCounter = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper045.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper045.cs.meta deleted file mode 100644 index cf9dbfc..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper045.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 06873d727dc7ca6468474a46df099612 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper046.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper046.cs deleted file mode 100644 index a80a4b7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper046.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("15-in-1 Color Dreams", 46)] - internal class Mapper046 : Board - { - private int prg_reg; - - private int chr_reg; - - internal override void WriteSRM(ref ushort address, ref byte data) - { - prg_reg = (prg_reg & 1) | ((data << 1) & 0x1E); - chr_reg = (chr_reg & 7) | ((data >> 1) & 0x78); - Switch08KCHR(chr_reg); - Switch32KPRG(prg_reg, PRGArea.Area8000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - prg_reg = (data & 1) | (prg_reg & 0x1E); - chr_reg = ((data >> 4) & 7) | (chr_reg & 0x78); - Switch08KCHR(chr_reg); - Switch32KPRG(prg_reg, PRGArea.Area8000); - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(prg_reg); - stream.Write(chr_reg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - prg_reg = stream.ReadInt32(); - chr_reg = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper046.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper046.cs.meta deleted file mode 100644 index 4780190..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper046.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ae6badd4ec9ec79468957a52726ef1ca -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper047.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper047.cs deleted file mode 100644 index 5e58739..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper047.cs +++ /dev/null @@ -1,258 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("2-in-1 MMC3 Port 6000h", 47, true, true)] - internal class Mapper047 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - private int block; - - private int prg_and; - - private int prg_or; - - private int chr_and; - - private int chr_or; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_and = 15; - prg_or = 0; - chr_and = 127; - chr_or = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - if (PRG_RAM_ENABLED[PRG_AREA_BLK_INDEX[0]] && PRG_RAM_WRITABLE[PRG_AREA_BLK_INDEX[0]]) - { - block = data & 1; - prg_or = block << 4; - chr_or = block << 7; - SetupCHR(); - SetupPRG(); - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area0000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area0800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area1000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area1400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area1800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area1C00); - } - else - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area1000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area1800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area0000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area0400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area0800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG((prg_reg[flag_p ? 2 : 0] & prg_and) | prg_or, PRGArea.Area8000); - Switch08KPRG((prg_reg[1] & prg_and) | prg_or, PRGArea.AreaA000); - Switch08KPRG((prg_reg[(!flag_p) ? 2 : 0] & prg_and) | prg_or, PRGArea.AreaC000); - Switch08KPRG((prg_reg[3] & prg_and) | prg_or, PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - stream.Write(block); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(prg_and); - stream.Write(prg_or); - stream.Write(chr_and); - stream.Write(chr_or); - stream.Write(irq_enabled); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - block = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - prg_and = stream.ReadInt32(); - prg_or = stream.ReadInt32(); - chr_and = stream.ReadInt32(); - chr_or = stream.ReadInt32(); - irq_enabled = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper047.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper047.cs.meta deleted file mode 100644 index 218f3ce..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper047.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2279e07deeabd9645a738f56d0b1a9d0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper048.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper048.cs deleted file mode 100644 index 6f388cb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper048.cs +++ /dev/null @@ -1,172 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Taito TC0190/TC0350", 48, true, true)] - internal class Mapper048 : Board - { - private bool MODE; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - MODE = false; - if (IsGameFoundOnDB) - { - foreach (string chip in base.Chips) - { - if (chip.Contains("TC0350")) - { - MODE = true; - break; - } - } - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - mmc3_alt_behavior = false; - irq_clear = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if (!MODE) - { - switch (address & 0xE003) - { - case 32768: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 32769: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 32770: - Switch02KCHR(data, CHRArea.Area0000); - break; - case 32771: - Switch02KCHR(data, CHRArea.Area0800); - break; - case 40960: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 40961: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 40962: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 40963: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 49152: - irq_reload = (byte)(data ^ 0xFFu); - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 49154: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 49155: - irq_enabled = true; - break; - case 57344: - Switch01KNMTFromMirroring(((data & 0x40) == 64) ? Mirroring.Horz : Mirroring.Vert); - break; - } - } - else - { - switch (address & 0xA003) - { - case 32768: - Switch01KNMTFromMirroring(((data & 0x40) == 64) ? Mirroring.Horz : Mirroring.Vert); - Switch08KPRG(data & 0x3F, PRGArea.Area8000); - break; - case 32769: - Switch08KPRG(data & 0x3F, PRGArea.AreaA000); - break; - case 32770: - Switch02KCHR(data, CHRArea.Area0000); - break; - case 32771: - Switch02KCHR(data, CHRArea.Area0800); - break; - case 40960: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 40961: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 40962: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 40963: - Switch01KCHR(data, CHRArea.Area1C00); - break; - } - } - } - - internal override void OnPPUA12RaisingEdge() - { - if (!MODE) - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper048.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper048.cs.meta deleted file mode 100644 index caa1e26..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper048.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 208670702cbdc4541894f8509f031ef3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper049.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper049.cs deleted file mode 100644 index 8362faf..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper049.cs +++ /dev/null @@ -1,272 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("4-in-1 MMC3 Port 6xxxh", 49, true, true)] - internal class Mapper049 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - private bool prg_32Mode; - - private int prg_32Page; - - private int prg_and; - - private int prg_or; - - private int chr_and; - - private int chr_or; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - prg_32Mode = false; - prg_32Page = 0; - address_8001 = 0; - prg_and = 15; - prg_or = 0; - chr_and = 127; - chr_or = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - if (PRG_RAM_ENABLED[PRG_AREA_BLK_INDEX[0]] && PRG_RAM_WRITABLE[PRG_AREA_BLK_INDEX[0]]) - { - prg_32Mode = (data & 1) == 1; - prg_or = (data >> 2) & 0x30; - chr_or = (data & 0xC0) << 1; - prg_32Page = (data >> 4) & 3; - SetupCHR(); - SetupPRG(); - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area0000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area0800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area1000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area1400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area1800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area1C00); - } - else - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area1000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area1800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area0000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area0400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area0800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - if (prg_32Mode) - { - Switch08KPRG((prg_reg[flag_p ? 2 : 0] & prg_and) | prg_or, PRGArea.Area8000); - Switch08KPRG((prg_reg[1] & prg_and) | prg_or, PRGArea.AreaA000); - Switch08KPRG((prg_reg[(!flag_p) ? 2 : 0] & prg_and) | prg_or, PRGArea.AreaC000); - Switch08KPRG((prg_reg[3] & prg_and) | prg_or, PRGArea.AreaE000); - } - else - { - Switch32KPRG(prg_32Page, PRGArea.Area8000); - } - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(prg_and); - stream.Write(prg_or); - stream.Write(chr_and); - stream.Write(chr_or); - stream.Write(prg_32Mode); - stream.Write(prg_32Page); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - prg_and = stream.ReadInt32(); - prg_or = stream.ReadInt32(); - chr_and = stream.ReadInt32(); - chr_or = stream.ReadInt32(); - prg_32Mode = stream.ReadBoolean(); - prg_32Page = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper049.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper049.cs.meta deleted file mode 100644 index 54db8d2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper049.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c1e562cabf4561140a8f52fe37210dd3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper050.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper050.cs deleted file mode 100644 index a098600..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper050.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("FDS-Port - Alt. Levels", 50)] - internal class Mapper050 : Board - { - private int prg_page; - - private int irq_counter; - - private bool irq_enabled; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(15, PRGArea.Area6000); - Switch08KPRG(8, PRGArea.Area8000); - Switch08KPRG(9, PRGArea.AreaA000); - Switch08KPRG(11, PRGArea.AreaE000); - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - switch (address & 0x4120) - { - case 16416: - prg_page = (data & 8) | ((data & 1) << 2) | ((data >> 1) & 3); - Switch08KPRG(prg_page, PRGArea.AreaC000); - break; - case 16672: - irq_enabled = (data & 1) == 1; - if (!irq_enabled) - { - irq_counter = 0; - NesEmu.IRQFlags &= -9; - } - break; - } - } - - internal override void OnCPUClock() - { - if (irq_enabled) - { - irq_counter++; - if (irq_counter == 4096) - { - NesEmu.IRQFlags |= 8; - irq_counter = 0; - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(prg_page); - stream.Write(irq_counter); - stream.Write(irq_enabled); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - prg_page = stream.ReadInt32(); - irq_counter = stream.ReadInt32(); - irq_enabled = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper050.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper050.cs.meta deleted file mode 100644 index 9b6523c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper050.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bb91df250655ebb4f873fc1084576301 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper051.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper051.cs deleted file mode 100644 index 1175a42..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper051.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("11-in-1", 51)] - internal class Mapper051 : Board - { - private int bank; - - private int mode = 1; - - private int offset; - - internal override void HardReset() - { - base.HardReset(); - bank = 0; - mode = 1; - offset = 0; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE000) - { - case 32768: - case 57344: - bank = data & 0xF; - UpdateBanks(); - break; - case 49152: - bank = data & 0xF; - mode = ((data >> 3) & 2) | (mode & 1); - UpdateBanks(); - break; - } - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - mode = ((data >> 3) & 2) | ((data >> 1) & 1); - UpdateBanks(); - } - - private void UpdateBanks() - { - offset = 0; - if ((mode & 1) == 1) - { - Switch32KPRG(bank, PRGArea.Area8000); - offset = 35; - } - else - { - Switch08KPRG((bank << 1) | (mode >> 1), PRGArea.Area8000); - Switch08KPRG((bank << 1) | 7, PRGArea.Area8000); - offset = 47; - } - Switch08KPRG(offset | (bank << 2), PRGArea.Area6000); - Switch01KNMTFromMirroring((mode == 3) ? Mirroring.Horz : Mirroring.Vert); - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(bank); - stream.Write(mode); - stream.Write(offset); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - bank = stream.ReadInt32(); - mode = stream.ReadInt32(); - offset = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper051.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper051.cs.meta deleted file mode 100644 index 2e474c0..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper051.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e399d70fe48a5db4ba1c813a6e7b46fa -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper052.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper052.cs deleted file mode 100644 index dc6a7d6..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper052.cs +++ /dev/null @@ -1,273 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("7-in-1 MMC3 Port 6800h with SRAM", 52, true, true)] - internal class Mapper052 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - private int prg_and; - - private int prg_or; - - private int chr_and; - - private int chr_or; - - private bool locked; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - locked = false; - address_8001 = 0; - prg_and = 31; - prg_or = 0; - chr_and = 255; - chr_or = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void SoftReset() - { - HardReset(); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - if (!locked) - { - if (PRG_RAM_ENABLED[PRG_AREA_BLK_INDEX[0]] && PRG_RAM_WRITABLE[PRG_AREA_BLK_INDEX[0]]) - { - locked = true; - prg_and = ((data << 1) & 0x10) ^ 0x1F; - prg_or = ((data & 6) | ((data >> 3) & data & 1)) << 4; - chr_and = ((data & 0x40) << 1) ^ 0xFF; - chr_or = (((data >> 3) & 4) | ((data >> 1) & 2) | ((data >> 6) & (data >> 4) & 1)) << 7; - SetupCHR(); - SetupPRG(); - } - } - else - { - base.WriteSRM(ref address, ref data); - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area0000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area0800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area1000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area1400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area1800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area1C00); - } - else - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area1000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area1800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area0000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area0400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area0800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG((prg_reg[flag_p ? 2 : 0] & prg_and) | prg_or, PRGArea.Area8000); - Switch08KPRG((prg_reg[1] & prg_and) | prg_or, PRGArea.AreaA000); - Switch08KPRG((prg_reg[(!flag_p) ? 2 : 0] & prg_and) | prg_or, PRGArea.AreaC000); - Switch08KPRG((prg_reg[3] & prg_and) | prg_or, PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(prg_and); - stream.Write(prg_or); - stream.Write(chr_and); - stream.Write(chr_or); - stream.Write(locked); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - prg_and = stream.ReadInt32(); - prg_or = stream.ReadInt32(); - chr_and = stream.ReadInt32(); - chr_or = stream.ReadInt32(); - locked = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper052.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper052.cs.meta deleted file mode 100644 index 7dca79d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper052.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fe5026b8a1bdd5942876adb7451904ff -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper053.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper053.cs deleted file mode 100644 index 397be8d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper053.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 53)] - [HassIssues] - internal class Mapper053 : Board - { - private byte[] regs = new byte[2]; - - private bool epromFirst; - - internal override string Issues => MNInterfaceLanguage.IssueMapper53; - - internal override void HardReset() - { - base.HardReset(); - regs = new byte[2]; - epromFirst = true; - Switch08KPRG(0, PRGArea.Area6000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - regs[1] = data; - UpdatePrg(); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - regs[0] = data; - UpdatePrg(); - Switch01KNMTFromMirroring(((data & 0x20) == 32) ? Mirroring.Horz : Mirroring.Vert); - } - - private void UpdatePrg() - { - int num = (regs[0] << 3) & 0x78; - Switch08KPRG(((num << 1) | 0xF) + (epromFirst ? 4 : 0), PRGArea.Area6000); - Switch16KPRG(((regs[0] & 0x10) == 16) ? ((num | (regs[1] & 7)) + (epromFirst ? 2 : 0)) : ((!epromFirst) ? 128 : 0), PRGArea.Area8000); - Switch16KPRG(((regs[0] & 0x10) == 16) ? ((num | 7) + (epromFirst ? 2 : 0)) : (epromFirst ? 1 : 129), PRGArea.AreaC000); - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(regs); - stream.Write(epromFirst); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - stream.Read(regs, 0, 2); - epromFirst = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper053.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper053.cs.meta deleted file mode 100644 index 9a603b9..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper053.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fa0f9f5e47b4fd64997db593a5a91357 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper056.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper056.cs deleted file mode 100644 index 4de9059..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper056.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Pirate SMB3", 56)] - internal class Mapper056 : Board - { - private int irqCounter; - - private int irqLatch; - - private bool irqEnabled; - - private int irqControl; - - private int switchControl; - - internal override string Issues => MNInterfaceLanguage.IssueMapper56; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - irqLatch = 0; - irqCounter = 0; - irqControl = 0; - irqEnabled = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if (address < 61440) - { - switch (address & 0xE000) - { - case 32768: - irqLatch = (irqLatch & 0xFFF0) | (data & 0xF); - break; - case 36864: - irqLatch = (irqLatch & 0xFF0F) | ((data & 0xF) << 4); - break; - case 40960: - irqLatch = (irqLatch & 0xF0FF) | ((data & 0xF) << 8); - break; - case 45056: - irqLatch = (irqLatch & 0xFFF) | ((data & 0xF) << 12); - break; - case 49152: - irqControl = data & 5; - irqEnabled = (data & 2) == 2; - if (irqEnabled) - { - irqCounter = irqLatch; - } - NesEmu.IRQFlags &= -9; - break; - case 53248: - irqEnabled = (irqControl & 1) == 1; - NesEmu.IRQFlags &= -9; - break; - case 57344: - switchControl = data; - break; - } - return; - } - int num = (switchControl & 0xF) - 1; - if (num < 3) - { - Switch08KPRG((data & 0xF) | (PRG_AREA_BLK_INDEX[(num >> 13) + 1] & 0x10), (PRGArea)num); - } - switch (address & 0xC00) - { - case 0: - address &= 3; - if (address < 3) - { - Switch08KPRG((data & 0xF) | (PRG_AREA_BLK_INDEX[(num >> 13) + 1] & 0x10), (PRGArea)address); - } - break; - case 2048: - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Vert : Mirroring.Horz); - break; - case 3072: - Switch01KCHR(data, (CHRArea)(address & 7u)); - break; - } - } - - internal override void OnCPUClock() - { - if (irqEnabled && irqCounter++ == 65535) - { - irqCounter = irqLatch; - NesEmu.IRQFlags |= 8; - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper056.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper056.cs.meta deleted file mode 100644 index 717ff54..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper056.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 83d2f8d6bd1261249ae318f6c67df658 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper057.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper057.cs deleted file mode 100644 index 71e6c7d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper057.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("6-in-1 (SuperGK)", 57)] - internal class Mapper057 : Board - { - private int chr_aaa; - - private int chr_bbb; - - private int chr_hhh; - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0x8800) - { - case 32768: - chr_aaa = data & 7; - chr_hhh = (data & 0x40) >> 3; - break; - case 34816: - chr_bbb = data & 7; - if ((data & 0x10) == 16) - { - Switch32KPRG((data & 0xE0) >> 6, PRGArea.Area8000); - } - else - { - Switch16KPRG((data & 0xE0) >> 5, PRGArea.Area8000); - Switch16KPRG((data & 0xE0) >> 5, PRGArea.AreaC000); - } - Switch01KNMTFromMirroring(((data & 8) == 8) ? Mirroring.Horz : Mirroring.Vert); - break; - } - Switch08KCHR(chr_hhh | (chr_aaa | chr_bbb)); - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(chr_aaa); - stream.Write(chr_bbb); - stream.Write(chr_hhh); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - chr_aaa = stream.ReadInt32(); - chr_bbb = stream.ReadInt32(); - chr_hhh = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper057.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper057.cs.meta deleted file mode 100644 index 6d6fe5e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper057.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bf918deb9af239143bd0e1fbcad64911 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper058.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper058.cs deleted file mode 100644 index 8291d6c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper058.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("68-in-1 (Game Star)", 58)] - [HassIssues] - internal class Mapper058 : Board - { - internal override string Issues => MNInterfaceLanguage.IssueMapper58; - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR((address >> 3) & 7); - if ((address & 0x40) == 0) - { - Switch32KPRG((address & 7) >> 1, PRGArea.Area8000); - } - else - { - Switch16KPRG(address & 7, PRGArea.Area8000); - Switch16KPRG(address & 7, PRGArea.AreaC000); - } - Switch01KNMTFromMirroring(((address & 0x80) == 128) ? Mirroring.Horz : Mirroring.Vert); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper058.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper058.cs.meta deleted file mode 100644 index 3fff511..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper058.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d5f3c51f1ab08764aa3af28f3048bfa5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper060.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper060.cs deleted file mode 100644 index b3712b3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper060.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 60)] - [HassIssues] - internal class Mapper060 : Board - { - private int latch; - - private byte menu; - - internal override string Issues => MNInterfaceLanguage.IssueMapper60; - - internal override void HardReset() - { - base.HardReset(); - latch = 0; - menu = 0; - } - - internal override void SoftReset() - { - base.SoftReset(); - latch = 0; - menu = (byte)((uint)(menu + 1) & 3u); - Switch08KCHR(menu); - Switch16KPRG(menu, PRGArea.Area8000); - Switch16KPRG(menu, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - latch = address & 0x100; - Switch01KNMTFromMirroring(((address & 8) == 8) ? Mirroring.Horz : Mirroring.Vert); - Switch16KPRG((address >> 4) & ~((~address >> 7) & 1), PRGArea.Area8000); - Switch16KPRG((address >> 4) | ((~address >> 7) & 1), PRGArea.AreaC000); - Switch08KCHR(address); - } - - internal override void ReadPRG(ref ushort address, out byte data) - { - if (latch == 0) - { - base.ReadPRG(ref address, out data); - } - else - { - data = menu; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(latch); - stream.Write(menu); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - latch = stream.ReadInt32(); - menu = stream.ReadByte(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper060.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper060.cs.meta deleted file mode 100644 index 14648f0..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper060.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6f5e014a4df93af4db13624605f4e7f5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper061.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper061.cs deleted file mode 100644 index ff43e33..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper061.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("20-in-1", 61)] - internal class Mapper061 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - if ((address & 0x10) == 0) - { - Switch32KPRG(address & 0xF, PRGArea.Area8000); - } - else - { - Switch16KPRG(((address & 0xF) << 1) | ((address & 0x20) >> 5), PRGArea.Area8000); - Switch16KPRG(((address & 0xF) << 1) | ((address & 0x20) >> 5), PRGArea.AreaC000); - } - Switch01KNMTFromMirroring(((address & 0x80) == 128) ? Mirroring.Horz : Mirroring.Vert); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper061.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper061.cs.meta deleted file mode 100644 index 990dcd5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper061.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d371dd307b7ac2044893482d5eb2c28e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper062.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper062.cs deleted file mode 100644 index 45fb744..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper062.cs +++ /dev/null @@ -1,24 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Super 700-in-1", 62)] - internal class Mapper062 : Board - { - private int prg_page; - - internal override void WritePRG(ref ushort address, ref byte data) - { - prg_page = ((address & 0x3F00) >> 8) | (address & 0x40); - Switch08KCHR(((address & 0x1F) << 2) | (data & 3)); - if ((address & 0x20) == 32) - { - Switch16KPRG(prg_page, PRGArea.Area8000); - Switch16KPRG(prg_page, PRGArea.AreaC000); - } - else - { - Switch32KPRG(prg_page >> 1, PRGArea.Area8000); - } - Switch01KNMTFromMirroring(((address & 0x80) == 128) ? Mirroring.Horz : Mirroring.Vert); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper062.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper062.cs.meta deleted file mode 100644 index b32919e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper062.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ea3055fddea86eb47b1bbbc8c0c9c873 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper064.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper064.cs deleted file mode 100644 index b2009b5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper064.cs +++ /dev/null @@ -1,258 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Tengen RAMBO-1", 64, true, true)] - internal class Mapper064 : Board - { - private bool flag_c; - - private bool flag_p; - - private bool flag_k; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private byte irq_reload; - - private bool irq_mode; - - private bool irq_clear; - - private int irq_prescaler; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = (flag_k = false)); - address_8001 = 0; - prg_reg = new int[3]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = 2; - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - SetupPRG(); - chr_reg = new int[8]; - for (int i = 0; i < 8; i++) - { - chr_reg[i] = i; - } - SetupCHR(); - irq_enabled = false; - irq_counter = 0; - irq_prescaler = 0; - irq_mode = false; - irq_reload = byte.MaxValue; - irq_clear = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 0xF; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - flag_k = (data & 0x20) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data; - SetupPRG(); - break; - case 8: - chr_reg[6] = data; - SetupCHR(); - break; - case 9: - chr_reg[7] = data; - SetupCHR(); - break; - case 15: - prg_reg[2] = data; - SetupPRG(); - break; - case 10: - case 11: - case 12: - case 13: - case 14: - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 49152: - irq_reload = data; - break; - case 49153: - irq_mode = (data & 1) == 1; - irq_clear = true; - irq_prescaler = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - if (!flag_k) - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - } - else - { - Switch01KCHR(chr_reg[0], CHRArea.Area0000); - Switch01KCHR(chr_reg[6], CHRArea.Area0400); - Switch01KCHR(chr_reg[1], CHRArea.Area0800); - Switch01KCHR(chr_reg[7], CHRArea.Area0C00); - } - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - if (!flag_k) - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - } - else - { - Switch01KCHR(chr_reg[0], CHRArea.Area1000); - Switch01KCHR(chr_reg[6], CHRArea.Area1400); - Switch01KCHR(chr_reg[1], CHRArea.Area1800); - Switch01KCHR(chr_reg[7], CHRArea.Area1C00); - } - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[(!flag_p) ? 1u : 0u], PRGArea.AreaA000); - Switch08KPRG(prg_reg[flag_p ? 1 : 2], PRGArea.AreaC000); - } - - internal override void OnPPUA12RaisingEdge() - { - ClockIRQ(); - } - - internal override void OnCPUClock() - { - if (irq_mode) - { - irq_prescaler++; - if (irq_prescaler == 4) - { - irq_prescaler = 0; - ClockIRQ(); - } - } - } - - private void ClockIRQ() - { - if (irq_clear) - { - irq_counter = (byte)(irq_reload + 1); - irq_clear = false; - } - else if (irq_counter == 0) - { - irq_counter = irq_reload; - } - else if (--irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(irq_prescaler); - stream.Write(irq_mode); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - irq_prescaler = stream.ReadInt32(); - irq_mode = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper064.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper064.cs.meta deleted file mode 100644 index a5b7a76..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper064.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a696f836221fe3646b3200f3e6bcb87c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper065.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper065.cs deleted file mode 100644 index 2bf8579..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper065.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Irem H-3001", 65)] - internal class Mapper065 : Board - { - private bool irq_enable; - - private int irq_reload; - - private int irq_counter; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(0, PRGArea.Area8000); - Switch08KPRG(1, PRGArea.AreaA000); - Switch08KPRG(254, PRGArea.AreaC000); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address) - { - case 32768: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 36865: - Switch01KNMTFromMirroring(((data & 0x80) == 128) ? Mirroring.Horz : Mirroring.Vert); - break; - case 36867: - irq_enable = (data & 0x80) == 128; - NesEmu.IRQFlags &= -9; - break; - case 36868: - irq_counter = irq_reload; - NesEmu.IRQFlags &= -9; - break; - case 36869: - irq_reload = (irq_reload & 0xFF) | (data << 8); - break; - case 36870: - irq_reload = (irq_reload & 0xFF00) | data; - break; - case 40960: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 49152: - Switch08KPRG(data, PRGArea.AreaC000); - break; - case 45056: - Switch01KCHR(data, CHRArea.Area0000); - break; - case 45057: - Switch01KCHR(data, CHRArea.Area0400); - break; - case 45058: - Switch01KCHR(data, CHRArea.Area0800); - break; - case 45059: - Switch01KCHR(data, CHRArea.Area0C00); - break; - case 45060: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 45061: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 45062: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 45063: - Switch01KCHR(data, CHRArea.Area1C00); - break; - } - } - - internal override void OnCPUClock() - { - if (irq_enable) - { - if (irq_counter > 0) - { - irq_counter--; - } - else if (irq_counter == 0) - { - irq_counter = -1; - NesEmu.IRQFlags |= 8; - } - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper065.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper065.cs.meta deleted file mode 100644 index 767b280..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper065.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 314d0c6b3f522d84fb090126194b88f9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper066.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper066.cs deleted file mode 100644 index 19fc02e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper066.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("GxROM", 66)] - internal class Mapper066 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch32KPRG((data >> 4) & 3, PRGArea.Area8000); - Switch08KCHR(data & 3); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper066.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper066.cs.meta deleted file mode 100644 index 8698e8d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper066.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1fc42abf998812f40b3ab620cb1cae65 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper067.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper067.cs deleted file mode 100644 index 79f2618..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper067.cs +++ /dev/null @@ -1,108 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Sunsoft 3", 67)] - internal class Mapper067 : Board - { - private bool irq_enabled; - - private int irq_counter; - - private bool odd; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - irq_enabled = false; - irq_counter = 65535; - odd = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF800) - { - case 34816: - Switch02KCHR(data, CHRArea.Area0000); - break; - case 38912: - Switch02KCHR(data, CHRArea.Area0800); - break; - case 43008: - Switch02KCHR(data, CHRArea.Area1000); - break; - case 47104: - Switch02KCHR(data, CHRArea.Area1800); - break; - case 51200: - if (!odd) - { - irq_counter = (irq_counter & 0xFF) | (data << 8); - } - else - { - irq_counter = (irq_counter & 0xFF00) | data; - } - odd = !odd; - break; - case 55296: - irq_enabled = (data & 0x10) == 16; - odd = false; - NesEmu.IRQFlags &= -9; - break; - case 59392: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 63488: - Switch16KPRG(data, PRGArea.Area8000); - break; - } - } - - internal override void OnCPUClock() - { - if (irq_enabled) - { - irq_counter--; - if (irq_counter == 0) - { - irq_counter = 65535; - NesEmu.IRQFlags |= 8; - irq_enabled = false; - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(odd); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadInt32(); - odd = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper067.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper067.cs.meta deleted file mode 100644 index 68a00d4..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper067.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6ce6078bf7001f448b966f6e9d3a9ff8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper068.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper068.cs deleted file mode 100644 index 5994a85..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper068.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Sunsoft 4", 68)] - internal class Mapper068 : Board - { - private bool flag_r; - - private bool flag_m; - - private int nt_reg0; - - private int nt_reg1; - - private int temp; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF000) - { - case 32768: - Switch02KCHR(data, CHRArea.Area0000); - break; - case 36864: - Switch02KCHR(data, CHRArea.Area0800); - break; - case 40960: - Switch02KCHR(data, CHRArea.Area1000); - break; - case 45056: - Switch02KCHR(data, CHRArea.Area1800); - break; - case 49152: - nt_reg0 = (data & 0x7F) | 0x80; - break; - case 53248: - nt_reg1 = (data & 0x7F) | 0x80; - break; - case 57344: - flag_r = (data & 0x10) == 16; - flag_m = (data & 1) == 1; - Switch01KNMTFromMirroring(flag_m ? Mirroring.Horz : Mirroring.Vert); - break; - case 61440: - Switch16KPRG(data, PRGArea.Area8000); - break; - } - } - - internal override void ReadNMT(ref ushort address, out byte data) - { - if (!flag_r) - { - data = NMT_RAM[NMT_AREA_BLK_INDEX[(address >> 10) & 3]][address & 0x3FF]; - return; - } - switch ((address >> 10) & 3) - { - case 0: - data = CHR_ROM[nt_reg0][address & 0x3FF]; - break; - case 1: - data = CHR_ROM[flag_m ? nt_reg0 : nt_reg1][address & 0x3FF]; - break; - case 2: - data = CHR_ROM[flag_m ? nt_reg1 : nt_reg0][address & 0x3FF]; - break; - case 3: - data = CHR_ROM[nt_reg1][address & 0x3FF]; - break; - default: - data = 0; - break; - } - } - - internal override void WriteNMT(ref ushort address, ref byte data) - { - if (!flag_r) - { - base.WriteNMT(ref address, ref data); - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_r); - stream.Write(flag_m); - stream.Write(nt_reg0); - stream.Write(nt_reg1); - stream.Write(temp); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_r = stream.ReadBoolean(); - flag_m = stream.ReadBoolean(); - nt_reg0 = stream.ReadInt32(); - nt_reg1 = stream.ReadInt32(); - temp = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper068.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper068.cs.meta deleted file mode 100644 index d0ac7f7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper068.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 22f5878561b23c24badfb5a921bd895e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper069.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper069.cs deleted file mode 100644 index caa5957..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper069.cs +++ /dev/null @@ -1,259 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("FME-7/Sunsoft 5B", 69)] - [WithExternalSound] - internal class Mapper069 : Board - { - private int address_A000; - - private int address_E000; - - private int irq_counter; - - private bool irq_count_enabled; - - private bool irq_trigger_enabled; - - private Sunsoft5BChnl snd_1; - - private Sunsoft5BChnl snd_2; - - private Sunsoft5BChnl snd_3; - - private double[] audio_pulse_table; - - private double[] audio_tnd_table; - - internal override void Initialize(IRom rom) - { - base.Initialize(rom); - snd_1 = new Sunsoft5BChnl(); - snd_2 = new Sunsoft5BChnl(); - snd_3 = new Sunsoft5BChnl(); - audio_pulse_table = new double[32]; - for (int i = 0; i < 32; i++) - { - audio_pulse_table[i] = 95.52 / (8128.0 / (double)i + 100.0); - } - audio_tnd_table = new double[204]; - for (int j = 0; j < 204; j++) - { - audio_tnd_table[j] = 163.67 / (24329.0 / (double)j + 100.0); - } - } - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - address_A000 = 0; - irq_counter = 65535; - irq_count_enabled = false; - irq_trigger_enabled = false; - APUApplyChannelsSettings(); - snd_1.HardReset(); - snd_2.HardReset(); - snd_3.HardReset(); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE000) - { - case 32768: - address_A000 = data & 0xF; - break; - case 40960: - switch (address_A000) - { - case 0: - Switch01KCHR(data, CHRArea.Area0000); - break; - case 1: - Switch01KCHR(data, CHRArea.Area0400); - break; - case 2: - Switch01KCHR(data, CHRArea.Area0800); - break; - case 3: - Switch01KCHR(data, CHRArea.Area0C00); - break; - case 4: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 5: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 6: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 7: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 8: - TogglePRGRAMEnable((data & 0x80) == 128); - if ((data & 0x40u) != 0) - { - Toggle08KPRG_RAM(ram: true, PRGArea.Area6000); - Switch08KPRG(data & 0x3F & PRG_RAM_08KB_Mask, PRGArea.Area6000); - } - else - { - Toggle08KPRG_RAM(ram: false, PRGArea.Area6000); - Switch08KPRG(data & 0x3F, PRGArea.Area6000); - } - break; - case 9: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 10: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 11: - Switch08KPRG(data, PRGArea.AreaC000); - break; - case 12: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 13: - irq_count_enabled = (data & 0x80) == 128; - irq_trigger_enabled = (data & 1) == 1; - if (!irq_trigger_enabled) - { - NesEmu.IRQFlags &= -9; - } - break; - case 14: - irq_counter = (irq_counter & 0xFF00) | data; - break; - case 15: - irq_counter = (irq_counter & 0xFF) | (data << 8); - break; - } - break; - case 49152: - address_E000 = data & 0xF; - break; - case 57344: - switch (address_E000) - { - case 0: - snd_1.Write0(ref data); - break; - case 1: - snd_1.Write1(ref data); - break; - case 2: - snd_2.Write0(ref data); - break; - case 3: - snd_2.Write1(ref data); - break; - case 4: - snd_3.Write0(ref data); - break; - case 5: - snd_3.Write1(ref data); - break; - case 7: - snd_1.Enabled = (data & 1) == 0; - snd_2.Enabled = (data & 2) == 0; - snd_3.Enabled = (data & 4) == 0; - break; - case 8: - snd_1.Volume = (byte)(data & 0xFu); - break; - case 9: - snd_2.Volume = (byte)(data & 0xFu); - break; - case 10: - snd_3.Volume = (byte)(data & 0xFu); - break; - case 6: - break; - } - break; - } - } - - internal override void OnCPUClock() - { - if (!irq_count_enabled) - { - return; - } - irq_counter--; - if (irq_counter <= 0) - { - irq_counter = 65535; - if (irq_trigger_enabled) - { - NesEmu.IRQFlags |= 8; - } - } - } - - internal override double APUGetSample() - { - return audio_pulse_table[snd_1.output + snd_2.output] + audio_tnd_table[snd_3.output]; - } - - internal override void OnAPUClockSingle() - { - base.OnAPUClockSingle(); - snd_1.ClockSingle(); - snd_2.ClockSingle(); - snd_3.ClockSingle(); - } - - internal override void APUApplyChannelsSettings() - { - base.APUApplyChannelsSettings(); - snd_1.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_SUN1; - snd_2.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_SUN2; - snd_3.Outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_SUN3; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(address_A000); - stream.Write(address_E000); - stream.Write(irq_counter); - stream.Write(irq_count_enabled); - stream.Write(irq_trigger_enabled); - snd_1.SaveState(ref stream); - snd_2.SaveState(ref stream); - snd_3.SaveState(ref stream); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - address_A000 = stream.ReadInt32(); - address_E000 = stream.ReadInt32(); - irq_counter = stream.ReadInt32(); - irq_count_enabled = stream.ReadBoolean(); - irq_trigger_enabled = stream.ReadBoolean(); - snd_1.LoadState(ref stream); - snd_2.LoadState(ref stream); - snd_3.LoadState(ref stream); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper069.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper069.cs.meta deleted file mode 100644 index 5ea6723..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper069.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3aa95ff6ff61dbe4da50f18baa928fe4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper070.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper070.cs deleted file mode 100644 index da6311a..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper070.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Bandai", 70)] - internal class Mapper070 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch16KPRG((data >> 4) & 0xF, PRGArea.Area8000); - Switch08KCHR(data & 0xF); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper070.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper070.cs.meta deleted file mode 100644 index a734c67..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper070.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0e3aaa8620d44434b941fe8fc0580ca1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper071.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper071.cs deleted file mode 100644 index 3948adf..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper071.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Camerica", 71)] - internal class Mapper071 : Board - { - private bool fireHawk; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - fireHawk = SHA1.ToUpper() == "334781C830F135CF30A33E392D8AAA4AFDC223F9"; - } - - internal override void WritePRG(ref ushort addr, ref byte val) - { - if (addr < 40960) - { - if (fireHawk) - { - Switch01KNMTFromMirroring(((val & 0x10) == 16) ? Mirroring.OneScB : Mirroring.OneScA); - } - } - else if (addr >= 49152) - { - Switch16KPRG(val, PRGArea.Area8000); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper071.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper071.cs.meta deleted file mode 100644 index 09beb83..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper071.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5c123475e1ad66a4f839b1768a5a0d07 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper072.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper072.cs deleted file mode 100644 index 9c9200f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper072.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Jaleco Early Mapper 0", 72)] - internal class Mapper072 : Board - { - private byte writeData; - - private int chr_reg; - - private int prg_reg; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - writeData = 0; - chr_reg = (prg_reg = 0); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch ((data >> 6) & 3) - { - case 0: - Switch08KCHR(chr_reg); - Switch16KPRG(prg_reg, PRGArea.Area8000); - break; - case 1: - chr_reg = data & 0xF; - break; - case 2: - prg_reg = data & 0xF; - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(chr_reg); - stream.Write(prg_reg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - chr_reg = stream.ReadInt32(); - prg_reg = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper072.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper072.cs.meta deleted file mode 100644 index ab97a4e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper072.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2523f31241f5556429834dbf0281aa69 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper073.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper073.cs deleted file mode 100644 index 7d5663d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper073.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("VRC3", 73)] - internal class Mapper073 : Board - { - private bool irq_mode_8; - - private bool irq_enable; - - private bool irq_enable_on_ak; - - private int irq_reload; - - private int irq_counter; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - irq_mode_8 = false; - irq_enable = false; - irq_enable_on_ak = false; - irq_reload = 0; - irq_counter = 0; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF000) - { - case 32768: - irq_reload = (irq_reload & 0xFFF0) | (data & 0xF); - break; - case 36864: - irq_reload = (irq_reload & 0xFF0F) | ((data & 0xF) << 4); - break; - case 40960: - irq_reload = (irq_reload & 0xF0FF) | ((data & 0xF) << 8); - break; - case 45056: - irq_reload = (irq_reload & 0xFFF) | ((data & 0xF) << 12); - break; - case 49152: - irq_mode_8 = (data & 4) == 4; - irq_enable = (data & 2) == 2; - irq_enable_on_ak = (data & 1) == 1; - if (irq_enable) - { - irq_counter = irq_reload; - } - NesEmu.IRQFlags &= -9; - break; - case 53248: - irq_enable = irq_enable_on_ak; - NesEmu.IRQFlags &= -9; - break; - case 61440: - Switch16KPRG(data & 0xF, PRGArea.Area8000); - break; - } - } - - internal override void OnCPUClock() - { - if (!irq_enable) - { - return; - } - if (irq_mode_8) - { - irq_counter = (irq_counter & 0xFF00) | (byte)((irq_counter & 0xFF) + 1); - if ((byte)(irq_counter & 0xFF) == byte.MaxValue) - { - NesEmu.IRQFlags |= 8; - irq_counter = (irq_counter & 0xFF00) | (irq_reload & 0xFF); - } - } - else - { - irq_counter++; - if (irq_counter == 65535) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(irq_mode_8); - stream.Write(irq_enable); - stream.Write(irq_enable_on_ak); - stream.Write(irq_reload); - stream.Write(irq_counter); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - irq_mode_8 = stream.ReadBoolean(); - irq_enable = stream.ReadBoolean(); - irq_enable_on_ak = stream.ReadBoolean(); - irq_reload = stream.ReadInt32(); - irq_counter = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper073.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper073.cs.meta deleted file mode 100644 index 6a0a43c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper073.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 07ac7400d8c8fc74991b21d6733ba3f4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper074.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper074.cs deleted file mode 100644 index 17e5166..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper074.cs +++ /dev/null @@ -1,234 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Pirate MMC3 variant", 74, true, true)] - internal class Mapper074 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Toggle02KCHR_RAM(chr_reg[0] != 8 && chr_reg[0] != 9, CHRArea.Area0000); - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Toggle02KCHR_RAM(chr_reg[1] != 8 && chr_reg[1] != 9, CHRArea.Area0800); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Toggle02KCHR_RAM(chr_reg[2] != 8 && chr_reg[2] != 9, CHRArea.Area1000); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Toggle02KCHR_RAM(chr_reg[3] != 8 && chr_reg[3] != 9, CHRArea.Area1400); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Toggle02KCHR_RAM(chr_reg[4] != 8 && chr_reg[4] != 9, CHRArea.Area1800); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Toggle02KCHR_RAM(chr_reg[5] != 8 && chr_reg[5] != 9, CHRArea.Area1C00); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Toggle02KCHR_RAM(chr_reg[0] != 8 && chr_reg[0] != 9, CHRArea.Area1000); - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Toggle02KCHR_RAM(chr_reg[1] != 8 && chr_reg[1] != 9, CHRArea.Area1800); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Toggle02KCHR_RAM(chr_reg[2] != 8 && chr_reg[2] != 9, CHRArea.Area0000); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Toggle02KCHR_RAM(chr_reg[3] != 8 && chr_reg[3] != 9, CHRArea.Area0400); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Toggle02KCHR_RAM(chr_reg[4] != 8 && chr_reg[4] != 9, CHRArea.Area0800); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Toggle02KCHR_RAM(chr_reg[5] != 8 && chr_reg[5] != 9, CHRArea.Area0C00); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper074.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper074.cs.meta deleted file mode 100644 index 1ee12b9..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper074.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: de1bb7ed83cdb22499c854992fae8e27 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper075.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper075.cs deleted file mode 100644 index c9fb54e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper075.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("VRC1", 75)] - internal class Mapper075 : Board - { - private int chr0_reg; - - private int chr1_reg; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF000) - { - case 32768: - Switch08KPRG(data & 0xF, PRGArea.Area8000); - break; - case 40960: - Switch08KPRG(data & 0xF, PRGArea.AreaA000); - break; - case 49152: - Switch08KPRG(data & 0xF, PRGArea.AreaC000); - break; - case 36864: - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - chr0_reg = (chr0_reg & 0xF) | ((data & 2) << 3); - Switch04KCHR(chr0_reg, CHRArea.Area0000); - chr1_reg = (chr1_reg & 0xF) | ((data & 4) << 2); - Switch04KCHR(chr1_reg, CHRArea.Area1000); - break; - case 57344: - chr0_reg = (chr0_reg & 0x10) | (data & 0xF); - Switch04KCHR(chr0_reg, CHRArea.Area0000); - break; - case 61440: - chr1_reg = (chr1_reg & 0x10) | (data & 0xF); - Switch04KCHR(chr1_reg, CHRArea.Area1000); - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(chr0_reg); - stream.Write(chr1_reg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - chr0_reg = stream.ReadInt32(); - chr1_reg = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper075.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper075.cs.meta deleted file mode 100644 index 128672e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper075.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 96976ae7823c77e4d99355570ab4ff15 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper076.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper076.cs deleted file mode 100644 index 296ecee..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper076.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Namco 109", 76)] - internal class Mapper076 : Board - { - private int address_8001; - - private bool prg_a; - - private byte prg_reg; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask - 1, PRGArea.AreaC000); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - address_8001 = 0; - prg_a = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - prg_a = (data & 0x40) == 64; - Switch08KPRG(prg_reg, prg_a ? PRGArea.AreaC000 : PRGArea.Area8000); - break; - case 32769: - switch (address_8001) - { - case 2: - Switch02KCHR(data, CHRArea.Area0000); - break; - case 3: - Switch02KCHR(data, CHRArea.Area0800); - break; - case 4: - Switch02KCHR(data, CHRArea.Area1000); - break; - case 5: - Switch02KCHR(data, CHRArea.Area1800); - break; - case 6: - Switch08KPRG(prg_reg = data, prg_a ? PRGArea.AreaC000 : PRGArea.Area8000); - break; - case 7: - Switch08KPRG(data, PRGArea.AreaA000); - break; - } - break; - case 40960: - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(address_8001); - stream.Write(prg_a); - stream.Write(prg_reg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - address_8001 = stream.ReadInt32(); - prg_a = stream.ReadBoolean(); - prg_reg = stream.ReadByte(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper076.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper076.cs.meta deleted file mode 100644 index 7484165..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper076.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: eaed30d1f6adc7f4dbb3092f65b7b614 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper077.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper077.cs deleted file mode 100644 index f4c462b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper077.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Irem", 77)] - internal class Mapper077 : Board - { - internal override void HardReset() - { - base.HardReset(); - Toggle02KCHR_RAM(ram: true, CHRArea.Area0800); - Switch02KCHR(0, CHRArea.Area0800); - Toggle02KCHR_RAM(ram: true, CHRArea.Area1000); - Switch02KCHR(1, CHRArea.Area1000); - Toggle02KCHR_RAM(ram: true, CHRArea.Area1800); - Switch02KCHR(2, CHRArea.Area1800); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch02KCHR((data >> 4) & 0xF, CHRArea.Area0000); - Switch32KPRG(data & 0xF, PRGArea.Area8000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper077.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper077.cs.meta deleted file mode 100644 index 7cecfd2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper077.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e75ccafc4c3062a48bf1344deff1c242 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper078.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper078.cs deleted file mode 100644 index a40db2b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper078.cs +++ /dev/null @@ -1,33 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Irem 74HC161/32", 78)] - internal class Mapper078 : Board - { - private bool mirroring_mode_single; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - mirroring_mode_single = false; - if (base.BoardType == "JALECO-JF-16") - { - mirroring_mode_single = true; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR((data >> 4) & 0xF); - Switch16KPRG(data & 7, PRGArea.Area8000); - if (mirroring_mode_single) - { - Switch01KNMTFromMirroring(((data & 8) == 8) ? Mirroring.OneScB : Mirroring.OneScA); - } - else - { - Switch01KNMTFromMirroring(((data & 8) == 8) ? Mirroring.Vert : Mirroring.Horz); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper078.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper078.cs.meta deleted file mode 100644 index f49e71b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper078.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 194bdddd89a72a641840f7ef60b36f75 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper079.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper079.cs deleted file mode 100644 index f38a3fb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper079.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("AVE Nina-3", 79)] - internal class Mapper079 : Board - { - internal override void WriteEX(ref ushort address, ref byte data) - { - if ((address ^ 0x4100) == 0) - { - Switch32KPRG((data >> 3) & 7, PRGArea.Area8000); - Switch08KCHR((data & 7) | ((data >> 3) & 8)); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper079.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper079.cs.meta deleted file mode 100644 index 16e89a3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper079.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 239bf400a91a2ad42b07c18327d7ab73 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper080.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper080.cs deleted file mode 100644 index c7c1ff6..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper080.cs +++ /dev/null @@ -1,56 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Taito X-005", 80)] - internal class Mapper080 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - switch (address) - { - case 32496: - Switch02KCHR(data >> 1, CHRArea.Area0000); - break; - case 32497: - Switch02KCHR(data >> 1, CHRArea.Area0800); - break; - case 32498: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 32499: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 32500: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 32501: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 32502: - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Vert : Mirroring.Horz); - break; - case 32506: - case 32507: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 32508: - case 32509: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 32510: - case 32511: - Switch08KPRG(data, PRGArea.AreaC000); - break; - case 32503: - case 32504: - case 32505: - break; - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper080.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper080.cs.meta deleted file mode 100644 index e9ca94b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper080.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 80c33ae23427747408bafc4c5a86721a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper082.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper082.cs deleted file mode 100644 index dfb1565..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper082.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Taito X1-17 ", 82)] - internal class Mapper082 : Board - { - private bool chr_mode; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - switch (address) - { - case 32496: - Switch02KCHR(data >> 1, chr_mode ? CHRArea.Area1000 : CHRArea.Area0000); - break; - case 32497: - Switch02KCHR(data >> 1, chr_mode ? CHRArea.Area1800 : CHRArea.Area0800); - break; - case 32498: - Switch01KCHR(data, (!chr_mode) ? CHRArea.Area1000 : CHRArea.Area0000); - break; - case 32499: - Switch01KCHR(data, chr_mode ? CHRArea.Area0400 : CHRArea.Area1400); - break; - case 32500: - Switch01KCHR(data, chr_mode ? CHRArea.Area0800 : CHRArea.Area1800); - break; - case 32501: - Switch01KCHR(data, chr_mode ? CHRArea.Area0C00 : CHRArea.Area1C00); - break; - case 32502: - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Vert : Mirroring.Horz); - chr_mode = (data & 2) == 2; - break; - case 32506: - Switch08KPRG(data >> 2, PRGArea.Area8000); - break; - case 32507: - Switch08KPRG(data >> 2, PRGArea.AreaA000); - break; - case 32508: - Switch08KPRG(data >> 2, PRGArea.AreaC000); - break; - case 32503: - case 32504: - case 32505: - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(chr_mode); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - chr_mode = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper082.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper082.cs.meta deleted file mode 100644 index f5c8b1a..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper082.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 62b681ec1c812a64e8ebb96cc8c47d01 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper085.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper085.cs deleted file mode 100644 index 9710354..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper085.cs +++ /dev/null @@ -1,171 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("VRC7", 85)] - [HassIssues] - internal class Mapper085 : Board - { - private int irq_reload; - - private int irq_counter; - - private int prescaler; - - private bool irq_mode_cycle; - - private bool irq_enable; - - private bool irq_enable_on_ak; - - internal override string Issues => MNInterfaceLanguage.IssueMapper85; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - irq_reload = 0; - prescaler = 341; - irq_counter = 0; - irq_mode_cycle = false; - irq_enable = false; - irq_enable_on_ak = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address) - { - case 32768: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 32776: - case 32784: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 36864: - Switch08KPRG(data, PRGArea.AreaC000); - break; - case 40960: - Switch01KCHR(data, CHRArea.Area0000); - break; - case 40968: - case 40976: - Switch01KCHR(data, CHRArea.Area0400); - break; - case 45056: - Switch01KCHR(data, CHRArea.Area0800); - break; - case 45064: - case 45072: - Switch01KCHR(data, CHRArea.Area0C00); - break; - case 49152: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 49160: - case 49168: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 53248: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 53256: - case 53264: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 57344: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 57352: - case 57360: - irq_reload = data; - break; - case 61440: - irq_mode_cycle = (data & 4) == 4; - irq_enable = (data & 2) == 2; - irq_enable_on_ak = (data & 1) == 1; - if (irq_enable) - { - irq_counter = irq_reload; - prescaler = 341; - } - NesEmu.IRQFlags &= -9; - break; - case 61448: - case 61456: - NesEmu.IRQFlags &= -9; - irq_enable = irq_enable_on_ak; - break; - } - } - - internal override void OnCPUClock() - { - if (!irq_enable) - { - return; - } - if (!irq_mode_cycle) - { - if (prescaler > 0) - { - prescaler -= 3; - return; - } - prescaler = 341; - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - else - { - irq_counter++; - if (irq_counter == 255) - { - NesEmu.IRQFlags |= 8; - irq_counter = irq_reload; - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(prescaler); - stream.Write(irq_counter); - stream.Write(irq_mode_cycle); - stream.Write(irq_reload); - stream.Write(irq_enable); - stream.Write(irq_enable_on_ak); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - prescaler = stream.ReadInt32(); - irq_counter = stream.ReadInt32(); - irq_mode_cycle = stream.ReadBoolean(); - irq_reload = stream.ReadInt32(); - irq_enable = stream.ReadBoolean(); - irq_enable_on_ak = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper085.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper085.cs.meta deleted file mode 100644 index 032fd66..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper085.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6afe7d8088d58b1418070fa2e6f42cff -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper086.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper086.cs deleted file mode 100644 index 428d741..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper086.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Jaleco Early Mapper 2", 86)] - internal class Mapper086 : Board - { - internal override void WriteSRM(ref ushort address, ref byte data) - { - if (address < 28672) - { - Switch32KPRG((data >> 4) & 3, PRGArea.Area8000); - Switch08KCHR((data & 7) | ((data >> 4) & 4)); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper086.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper086.cs.meta deleted file mode 100644 index 34a3cb1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper086.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 57129c0244d9b7246a087748b41fdc5b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper087.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper087.cs deleted file mode 100644 index 373af2e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper087.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Jaleco/Konami", 87)] - internal class Mapper087 : Board - { - internal override void WriteSRM(ref ushort address, ref byte data) - { - Switch08KCHR(((data & 2) >> 1) | ((data & 1) << 1)); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper087.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper087.cs.meta deleted file mode 100644 index 7b9cd58..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper087.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6340ee74cbb8f2d46a4bc6954246758a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper088.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper088.cs deleted file mode 100644 index ec887ab..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper088.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Namco 118", 88)] - internal class Mapper088 : Board - { - private int address_8001; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0x8001) - { - case 32768: - address_8001 = data & 7; - break; - case 32769: - switch (address_8001) - { - case 0: - Switch02KCHR((data & 0x3F) >> 1, CHRArea.Area0000); - break; - case 1: - Switch02KCHR((data & 0x3F) >> 1, CHRArea.Area0800); - break; - case 2: - Switch01KCHR(data | 0x40, CHRArea.Area1000); - break; - case 3: - Switch01KCHR(data | 0x40, CHRArea.Area1400); - break; - case 4: - Switch01KCHR(data | 0x40, CHRArea.Area1800); - break; - case 5: - Switch01KCHR(data | 0x40, CHRArea.Area1C00); - break; - case 6: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 7: - Switch08KPRG(data, PRGArea.AreaA000); - break; - } - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(address_8001); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - address_8001 = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper088.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper088.cs.meta deleted file mode 100644 index d9e387c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper088.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 12caa8670cf3a6d468dd168c39fef9b6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper089.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper089.cs deleted file mode 100644 index 03609cb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper089.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Sunsoft Early", 89)] - internal class Mapper089 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR((data & 7) | ((data >> 4) & 8)); - Switch16KPRG((data >> 4) & 7, PRGArea.Area8000); - Switch01KNMTFromMirroring(((data & 8) == 8) ? Mirroring.OneScB : Mirroring.OneScA); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper089.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper089.cs.meta deleted file mode 100644 index daf4860..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper089.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 84e15b9d69ed162448c7748a15d700ba -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper090.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper090.cs deleted file mode 100644 index ee11031..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper090.cs +++ /dev/null @@ -1,634 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Pirate MMC5-style", 90)] - [HassIssues] - internal class Mapper090 : Board - { - protected bool MAPPER90MODE; - - private int[] prg_reg; - - private int[] chr_reg; - - private int[] nt_reg; - - private int prg_mode; - - private int chr_mode; - - private bool chr_block_mode; - - private int chr_block; - - private bool chr_m; - - private bool flag_s; - - private int irqCounter; - - private bool IrqEnable; - - private bool irqCountDownMode; - - private bool irqCountUpMode; - - private bool irqFunkyMode; - - private bool irqPrescalerSize; - - private int irqSource; - - private int irqPrescaler; - - private int irqPrescalerXOR; - - private byte irqFunkyModeReg; - - private byte Dipswitch; - - private byte multiplication_a; - - private byte multiplication_b; - - private ushort multiplication; - - private byte RAM5803; - - private bool nt_advanced_enable; - - private bool nt_rom_only; - - private int nt_ram_select; - - internal override string Issues => MNInterfaceLanguage.IssueMapper90; - - internal override void HardReset() - { - base.HardReset(); - MAPPER90MODE = true; - prg_reg = new int[4]; - chr_reg = new int[8]; - nt_reg = new int[4]; - prg_mode = (chr_mode = 0); - for (int i = 0; i < 4; i++) - { - prg_reg[i] = i; - nt_reg[i] = i; - } - for (int j = 0; j < 8; j++) - { - chr_reg[j] = j; - } - SetupPRG(); - SetupCHR(); - Dipswitch = 0; - irqCounter = 0; - IrqEnable = false; - irqCountDownMode = false; - irqCountUpMode = false; - irqFunkyMode = false; - irqPrescalerSize = false; - irqSource = 0; - irqPrescaler = 0; - irqPrescalerXOR = 0; - irqFunkyModeReg = 0; - RAM5803 = 0; - flag_s = false; - multiplication_a = 0; - multiplication_b = 0; - multiplication = 0; - } - - internal override void SoftReset() - { - base.SoftReset(); - if (Dipswitch == 0) - { - Dipswitch = byte.MaxValue; - } - else - { - Dipswitch = 0; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF007) - { - case 32768: - case 32769: - case 32770: - case 32771: - case 32772: - case 32773: - case 32774: - case 32775: - prg_reg[address & 3] = data & 0x7F; - SetupPRG(); - break; - case 36864: - case 36865: - case 36866: - case 36867: - case 36868: - case 36869: - case 36870: - case 36871: - chr_reg[address & 7] = (chr_reg[address & 7] & 0xFF00) | data; - SetupCHR(); - break; - case 40960: - case 40961: - case 40962: - case 40963: - case 40964: - case 40965: - case 40966: - case 40967: - chr_reg[address & 7] = (chr_reg[address & 7] & 0xFF) | (data << 8); - SetupCHR(); - break; - case 45056: - case 45057: - case 45058: - case 45059: - nt_reg[address & 3] = (nt_reg[address & 3] & 0xFF00) | data; - break; - case 45060: - case 45061: - case 45062: - case 45063: - nt_reg[address & 3] = (nt_reg[address & 3] & 0xFF) | (data << 8); - break; - case 49152: - IrqEnable = (data & 1) == 1; - if (!IrqEnable) - { - NesEmu.IRQFlags &= -9; - } - break; - case 49153: - irqCountDownMode = (data & 0x80) == 128; - irqCountUpMode = (data & 0x40) == 64; - irqFunkyMode = (data & 8) == 8; - irqPrescalerSize = (data & 4) == 4; - irqSource = data & 3; - break; - case 49154: - IrqEnable = false; - NesEmu.IRQFlags &= -9; - break; - case 49155: - IrqEnable = true; - break; - case 49156: - irqPrescaler = data ^ irqPrescalerXOR; - break; - case 49157: - irqCounter = data ^ irqPrescalerXOR; - break; - case 49158: - irqPrescalerXOR = data; - break; - case 49159: - irqFunkyModeReg = data; - break; - case 53248: - flag_s = (data & 0x80) == 128; - prg_mode = data & 7; - chr_mode = (data >> 3) & 3; - nt_advanced_enable = (data & 0x20) == 32; - nt_rom_only = (data & 0x40) == 64; - SetupPRG(); - SetupCHR(); - break; - case 53249: - switch (data & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 53250: - nt_ram_select = data & 0x80; - break; - case 53251: - chr_m = (data & 0x80) == 128; - chr_block_mode = (data & 0x20) == 32; - chr_block = (data & 0x1F) << 8; - SetupCHR(); - break; - } - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - } - - internal override void ReadSRM(ref ushort address, out byte data) - { - if (flag_s) - { - base.ReadSRM(ref address, out data); - } - else - { - data = 0; - } - } - - internal override void ReadEX(ref ushort address, out byte data) - { - switch (address) - { - case 20480: - data = Dipswitch; - break; - case 22528: - data = (byte)(multiplication & 0xFFu); - break; - case 22529: - data = (byte)((multiplication & 0xFF00) >> 8); - break; - case 22531: - data = RAM5803; - break; - default: - data = 0; - break; - } - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - switch (address) - { - case 22528: - multiplication_a = data; - multiplication = (ushort)(multiplication_a * multiplication_b); - break; - case 22529: - multiplication_b = data; - multiplication = (ushort)(multiplication_a * multiplication_b); - break; - case 22531: - RAM5803 = data; - break; - case 22530: - break; - } - } - - internal override void ReadNMT(ref ushort address, out byte data) - { - if (MAPPER90MODE) - { - data = NMT_RAM[NMT_AREA_BLK_INDEX[(address >> 10) & 3]][address & 0x3FF]; - } - if (!nt_advanced_enable) - { - data = NMT_RAM[NMT_AREA_BLK_INDEX[(address >> 10) & 3]][address & 0x3FF]; - } - else if (nt_rom_only) - { - data = CHR_ROM[nt_reg[(address >> 10) & 3]][address & 0x3FF]; - } - else if ((nt_reg[(address >> 10) & 3] & 0x80) != nt_ram_select) - { - data = CHR_ROM[nt_reg[(address >> 10) & 3]][address & 0x3FF]; - } - else - { - data = NMT_RAM[nt_reg[(address >> 10) & 3] & 1][address & 0x3FF]; - } - } - - internal override void WriteNMT(ref ushort address, ref byte data) - { - if (MAPPER90MODE) - { - NMT_RAM[NMT_AREA_BLK_INDEX[(address >> 10) & 3]][address & 0x3FF] = data; - } - else if (!nt_advanced_enable) - { - NMT_RAM[NMT_AREA_BLK_INDEX[(address >> 10) & 3]][address & 0x3FF] = data; - } - else if (!nt_rom_only && (nt_reg[(address >> 10) & 3] & 0x80) == nt_ram_select) - { - NMT_RAM[nt_reg[(address >> 10) & 3] & 1][address & 0x3FF] = data; - } - } - - private void SetupPRG() - { - switch (prg_mode) - { - case 0: - Switch08KPRG(prg_reg[3] * 4 + 3, PRGArea.Area6000); - Switch32KPRG(PRG_ROM_32KB_Mask, PRGArea.Area8000); - break; - case 1: - Switch08KPRG(prg_reg[3] * 2 + 1, PRGArea.Area6000); - Switch16KPRG(prg_reg[1], PRGArea.Area8000); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - break; - case 2: - Switch08KPRG(prg_reg[3], PRGArea.Area6000); - Switch08KPRG(prg_reg[0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[2], PRGArea.AreaC000); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - break; - case 3: - Switch08KPRG(ReverseByte(prg_reg[3]), PRGArea.Area6000); - Switch08KPRG(ReverseByte(prg_reg[0]), PRGArea.Area8000); - Switch08KPRG(ReverseByte(prg_reg[1]), PRGArea.AreaA000); - Switch08KPRG(ReverseByte(prg_reg[2]), PRGArea.AreaC000); - Switch08KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaE000); - break; - case 4: - Switch08KPRG(prg_reg[3] * 4 + 3, PRGArea.Area6000); - Switch32KPRG(prg_reg[3], PRGArea.Area8000); - break; - case 5: - Switch08KPRG(prg_reg[3] * 2 + 1, PRGArea.Area6000); - Switch16KPRG(prg_reg[1], PRGArea.Area8000); - Switch16KPRG(prg_reg[3], PRGArea.AreaC000); - break; - case 6: - Switch08KPRG(prg_reg[3], PRGArea.Area6000); - Switch08KPRG(prg_reg[0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[2], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - break; - case 7: - Switch08KPRG(ReverseByte(prg_reg[3]), PRGArea.Area6000); - Switch08KPRG(ReverseByte(prg_reg[0]), PRGArea.Area8000); - Switch08KPRG(ReverseByte(prg_reg[1]), PRGArea.AreaA000); - Switch08KPRG(ReverseByte(prg_reg[2]), PRGArea.AreaC000); - Switch08KPRG(ReverseByte(prg_reg[3]), PRGArea.AreaE000); - break; - } - } - - private void SetupCHR() - { - switch (chr_mode) - { - case 0: - if (chr_block_mode) - { - Switch08KCHR(chr_reg[0]); - } - else - { - Switch08KCHR((chr_reg[0] & 0xFF) | chr_block); - } - break; - case 1: - if (chr_block_mode) - { - Switch04KCHR(chr_reg[0], CHRArea.Area0000); - Switch04KCHR(chr_reg[4], CHRArea.Area1000); - } - else - { - Switch04KCHR((chr_reg[0] & 0xFF) | chr_block, CHRArea.Area0000); - Switch04KCHR((chr_reg[4] & 0xFF) | chr_block, CHRArea.Area1000); - } - break; - case 2: - if (chr_block_mode) - { - Switch02KCHR(chr_reg[0], CHRArea.Area0000); - Switch02KCHR(chr_m ? chr_reg[0] : chr_reg[2], CHRArea.Area0800); - Switch02KCHR(chr_reg[4], CHRArea.Area1000); - Switch02KCHR(chr_reg[6], CHRArea.Area1800); - } - else - { - Switch02KCHR((chr_reg[0] & 0xFF) | chr_block, CHRArea.Area0000); - Switch02KCHR(((chr_m ? chr_reg[0] : chr_reg[2]) & 0xFF) | chr_block, CHRArea.Area0800); - Switch02KCHR((chr_reg[4] & 0xFF) | chr_block, CHRArea.Area1000); - Switch02KCHR((chr_reg[6] & 0xFF) | chr_block, CHRArea.Area1800); - } - break; - case 3: - if (chr_block_mode) - { - Switch01KCHR(chr_reg[0], CHRArea.Area0000); - Switch01KCHR(chr_reg[1], CHRArea.Area0400); - Switch01KCHR(chr_m ? chr_reg[0] : chr_reg[2], CHRArea.Area0800); - Switch01KCHR(chr_m ? chr_reg[1] : chr_reg[3], CHRArea.Area0C00); - Switch01KCHR(chr_reg[4], CHRArea.Area1000); - Switch01KCHR(chr_reg[5], CHRArea.Area1400); - Switch01KCHR(chr_reg[6], CHRArea.Area1800); - Switch01KCHR(chr_reg[7], CHRArea.Area1C00); - } - else - { - Switch01KCHR((chr_reg[0] & 0xFF) | chr_block, CHRArea.Area0000); - Switch01KCHR((chr_reg[1] & 0xFF) | chr_block, CHRArea.Area0400); - Switch01KCHR(((chr_m ? chr_reg[0] : chr_reg[2]) & 0xFF) | chr_block, CHRArea.Area0800); - Switch01KCHR(((chr_m ? chr_reg[1] : chr_reg[3]) & 0xFF) | chr_block, CHRArea.Area0C00); - Switch01KCHR((chr_reg[4] & 0xFF) | chr_block, CHRArea.Area1000); - Switch01KCHR((chr_reg[5] & 0xFF) | chr_block, CHRArea.Area1400); - Switch01KCHR((chr_reg[6] & 0xFF) | chr_block, CHRArea.Area1800); - Switch01KCHR((chr_reg[7] & 0xFF) | chr_block, CHRArea.Area1C00); - } - break; - } - } - - private byte ReverseByte(int value) - { - return (byte)((uint)(((value & 0x40) >> 6) | ((value & 0x20) >> 4) | ((value & 0x10) >> 2)) | ((uint)value & 8u) | (uint)((value & 4) << 2) | (uint)((value & 2) << 4) | (uint)((value & 1) << 6)); - } - - internal override void OnCPUClock() - { - if (irqSource != 0) - { - return; - } - if (irqPrescalerSize) - { - irqPrescaler = (irqPrescaler & 0xF8) | (((irqPrescaler & 7) + 1) & 7); - if ((irqPrescaler & 7) == 7) - { - ClockIRQCounter(); - } - } - else - { - irqPrescaler++; - if (irqPrescaler == 255) - { - ClockIRQCounter(); - } - } - } - - internal override void OnPPUAddressUpdate(ref ushort address) - { - if (irqSource != 1) - { - return; - } - old_vram_address = new_vram_address; - new_vram_address = address & 0x1000; - if (old_vram_address >= new_vram_address) - { - return; - } - if (irqPrescalerSize) - { - irqPrescaler = (irqPrescaler & 0xF8) | (((irqPrescaler & 7) + 1) & 7); - if ((irqPrescaler & 7) == 7) - { - ClockIRQCounter(); - } - } - else - { - irqPrescaler++; - if (irqPrescaler == 255) - { - ClockIRQCounter(); - } - } - } - - private void ClockIRQCounter() - { - if (irqCountDownMode && irqCountUpMode) - { - return; - } - if (irqCountDownMode) - { - irqCounter--; - if (irqCounter == 0) - { - irqCounter = 255; - if (IrqEnable) - { - NesEmu.IRQFlags |= 8; - } - } - } - else - { - if (!irqCountUpMode) - { - return; - } - irqCounter++; - if (irqCounter == 255) - { - irqCounter = 0; - if (IrqEnable) - { - NesEmu.IRQFlags |= 8; - } - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - for (int i = 0; i < prg_reg.Length; i++) - { - stream.Write(prg_reg[i]); - } - for (int j = 0; j < chr_reg.Length; j++) - { - stream.Write(chr_reg[j]); - } - for (int k = 0; k < nt_reg.Length; k++) - { - stream.Write(nt_reg[k]); - } - stream.Write(prg_mode); - stream.Write(chr_mode); - stream.Write(chr_block_mode); - stream.Write(chr_block); - stream.Write(chr_m); - stream.Write(flag_s); - stream.Write(irqCounter); - stream.Write(IrqEnable); - stream.Write(irqCountDownMode); - stream.Write(irqCountUpMode); - stream.Write(irqFunkyMode); - stream.Write(irqPrescalerSize); - stream.Write(irqSource); - stream.Write(irqPrescaler); - stream.Write(irqPrescalerXOR); - stream.Write(irqFunkyModeReg); - stream.Write(Dipswitch); - stream.Write(multiplication_a); - stream.Write(multiplication_b); - stream.Write(multiplication); - stream.Write(RAM5803); - stream.Write(nt_advanced_enable); - stream.Write(nt_rom_only); - stream.Write(nt_ram_select); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - for (int i = 0; i < prg_reg.Length; i++) - { - prg_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < chr_reg.Length; j++) - { - chr_reg[j] = stream.ReadInt32(); - } - for (int k = 0; k < nt_reg.Length; k++) - { - nt_reg[k] = stream.ReadInt32(); - } - prg_mode = stream.ReadInt32(); - chr_mode = stream.ReadInt32(); - chr_block_mode = stream.ReadBoolean(); - chr_block = stream.ReadInt32(); - chr_m = stream.ReadBoolean(); - flag_s = stream.ReadBoolean(); - irqCounter = stream.ReadInt32(); - IrqEnable = stream.ReadBoolean(); - irqCountDownMode = stream.ReadBoolean(); - irqCountUpMode = stream.ReadBoolean(); - irqFunkyMode = stream.ReadBoolean(); - irqPrescalerSize = stream.ReadBoolean(); - irqSource = stream.ReadInt32(); - irqPrescaler = stream.ReadInt32(); - irqPrescalerXOR = stream.ReadInt32(); - irqFunkyModeReg = stream.ReadByte(); - Dipswitch = stream.ReadByte(); - multiplication_a = stream.ReadByte(); - multiplication_b = stream.ReadByte(); - multiplication = stream.ReadUInt16(); - RAM5803 = stream.ReadByte(); - nt_advanced_enable = stream.ReadBoolean(); - nt_rom_only = stream.ReadBoolean(); - nt_ram_select = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper090.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper090.cs.meta deleted file mode 100644 index a1534dd..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper090.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4562c28692c896049be0384ad0e20aba -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper091.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper091.cs deleted file mode 100644 index 312367c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper091.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("HK-SF3", 91, true, true)] - internal class Mapper091 : Board - { - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - switch (address & 0x7003) - { - case 24576: - Switch02KCHR(data, CHRArea.Area0000); - break; - case 24577: - Switch02KCHR(data, CHRArea.Area0800); - break; - case 24578: - Switch02KCHR(data, CHRArea.Area1000); - break; - case 24579: - Switch02KCHR(data, CHRArea.Area1800); - break; - case 28672: - Switch08KPRG(data & 0xF, PRGArea.Area8000); - break; - case 28673: - Switch08KPRG(data & 0xF, PRGArea.AreaA000); - break; - case 28674: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 28675: - irq_enabled = true; - irq_reload = 7; - irq_counter = 0; - break; - } - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper091.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper091.cs.meta deleted file mode 100644 index d9ca0ce..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper091.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 81a22386348f4944eb3d2efeb823456c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper092.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper092.cs deleted file mode 100644 index 56c7ba0..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper092.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Jaleco Early Mapper 1", 92)] - internal class Mapper092 : Board - { - private int chr_reg; - - private int prg_reg; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(0, PRGArea.Area8000); - chr_reg = (prg_reg = 0); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch ((data >> 6) & 3) - { - case 0: - Switch08KCHR(chr_reg); - Switch16KPRG(prg_reg, PRGArea.AreaC000); - break; - case 1: - chr_reg = data & 0xF; - break; - case 2: - prg_reg = data & 0xF; - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(chr_reg); - stream.Write(prg_reg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - chr_reg = stream.ReadInt32(); - prg_reg = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper092.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper092.cs.meta deleted file mode 100644 index 765b4a8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper092.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 571f1d5188986574cb8a8b7e10b1268a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper093.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper093.cs deleted file mode 100644 index a55e53b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper093.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("74161/32", 93)] - internal class Mapper093 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch16KPRG((data >> 4) & 0xF, PRGArea.Area8000); - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper093.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper093.cs.meta deleted file mode 100644 index 98d1fa3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper093.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e51bf4286fd1f7d4c85e8595173e5d94 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper094.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper094.cs deleted file mode 100644 index 933562a..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper094.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("74161/32", 94)] - internal class Mapper094 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch16KPRG((data >> 2) & 7, PRGArea.Area8000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper094.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper094.cs.meta deleted file mode 100644 index dc7e6e4..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper094.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8957c987f3b199c4ba6259065bd5601e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper095.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper095.cs deleted file mode 100644 index 64d8888..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper095.cs +++ /dev/null @@ -1,265 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Namcot MMC3-Style", 95, true, true)] - internal class Mapper095 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void ReadNMT(ref ushort address, out byte value) - { - if (flag_c) - { - value = NMT_RAM[(chr_reg[((address >> 10) & 3) + 2] & 0x20) >> 5][address & 0x3FF]; - return; - } - switch ((address >> 10) & 3) - { - case 0: - case 1: - value = NMT_RAM[(chr_reg[0] & 0x20) >> 5][address & 0x3FF]; - break; - case 2: - case 3: - value = NMT_RAM[(chr_reg[1] & 0x20) >> 5][address & 0x3FF]; - break; - default: - value = 0; - break; - } - } - - internal override void WriteNMT(ref ushort address, ref byte data) - { - if (flag_c) - { - NMT_RAM[(chr_reg[((address >> 10) & 3) + 2] & 0x20) >> 5][address & 0x3FF] = data; - return; - } - switch ((address >> 10) & 3) - { - case 0: - case 1: - NMT_RAM[(chr_reg[0] & 0x20) >> 5][address & 0x3FF] = data; - break; - case 2: - case 3: - NMT_RAM[(chr_reg[1] & 0x20) >> 5][address & 0x3FF] = data; - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper095.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper095.cs.meta deleted file mode 100644 index c4f3a1b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper095.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b71e88068e12bd34fb195cee2cb0dc65 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper096.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper096.cs deleted file mode 100644 index fc6ce4c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper096.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("74161/32", 96, 1, 32)] - internal class Mapper096 : Board - { - private int flag_c; - - internal override string Issues => MNInterfaceLanguage.IssueMapper96; - - internal override void HardReset() - { - base.HardReset(); - flag_c = 0; - Switch04KCHR(3, CHRArea.Area1000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch32KPRG(data & 3, PRGArea.Area8000); - flag_c = (((data & 4) == 4) ? 1 : 0); - Switch04KCHR(3, CHRArea.Area1000); - } - - internal override void OnPPUAddressUpdate(ref ushort address) - { - if ((address & 0x3FF) < 960 && (address & 0x1000) == 0) - { - Switch04KCHR(((address & 0x300) >> 8) | flag_c, CHRArea.Area0000); - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper096.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper096.cs.meta deleted file mode 100644 index 43592ef..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper096.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f860cb5fe74fd8242bc105c669f9d9db -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper097.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper097.cs deleted file mode 100644 index e4da407..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper097.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Irem - PRG HI", 97)] - internal class Mapper097 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.Area8000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch16KPRG(data & 0xF, PRGArea.AreaC000); - switch ((address >> 6) & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper097.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper097.cs.meta deleted file mode 100644 index 664e0ca..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper097.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b05cc673e685f8444a65d76550f91aa0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper105.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper105.cs deleted file mode 100644 index e663921..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper105.cs +++ /dev/null @@ -1,200 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("NES-EVENT", 105)] - [HassIssues] - internal class Mapper105 : Board - { - private int DipSwitchNumber; - - private byte[] reg = new byte[4]; - - private byte shift; - - private byte buffer; - - private bool flag_p; - - private bool flag_s; - - private bool flag_o; - - private int reg_a; - - private int reg_b; - - private bool irq_control; - - private bool initialized; - - private int irq_counter; - - private int dipswitches; - - internal override string Issues => MNInterfaceLanguage.IssueMapper105; - - internal override void HardReset() - { - base.HardReset(); - TogglePRGRAMEnable(enable: true); - reg = new byte[4]; - reg[0] = 12; - flag_s = (flag_p = true); - reg[1] = (reg[2] = (reg[3] = 0)); - buffer = 0; - shift = 0; - initialized = false; - DipSwitchNumber = 0; - dipswitches = 0x20000000 | (DipSwitchNumber << 22); - } - - internal override void SoftReset() - { - DipSwitchNumber = (DipSwitchNumber + 1) & 0xF; - dipswitches = 0x20000000 | (DipSwitchNumber << 22); - } - - internal override void WritePRG(ref ushort address, ref byte value) - { - if ((value & 0x80) == 128) - { - reg[0] |= 12; - flag_s = (flag_p = true); - shift = (buffer = 0); - return; - } - if ((value & 1) == 1) - { - buffer |= (byte)(1 << (int)shift); - } - if (++shift < 5) - { - return; - } - address = (ushort)((address & 0x7FFF) >> 13); - reg[address] = buffer; - shift = (buffer = 0); - switch (address) - { - case 0: - flag_p = (reg[0] & 8) != 0; - flag_s = (reg[0] & 4) != 0; - UpdatePRG(); - switch (reg[0] & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.OneScA); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - } - break; - case 1: - irq_control = (reg[1] & 0x10) == 16; - if (irq_control) - { - initialized = true; - irq_counter = 0; - NesEmu.IRQFlags &= -9; - } - else - { - Switch32KPRG(0, PRGArea.Area8000); - } - flag_o = (reg[1] & 8) == 8; - reg_a = (reg[1] >> 1) & 3; - UpdatePRG(); - break; - case 3: - TogglePRGRAMEnable((reg[3] & 0x10) == 0); - reg_b = reg[3] & 0xF; - UpdatePRG(); - break; - case 2: - break; - } - } - - private void UpdatePRG() - { - if (initialized) - { - if (!flag_o) - { - Switch32KPRG(reg_a, PRGArea.Area8000); - } - else if (!flag_p) - { - Switch32KPRG((reg_b >> 1) + 4, PRGArea.Area8000); - } - else if (!flag_s) - { - Switch16KPRG(8, PRGArea.Area8000); - Switch16KPRG(reg_b + 8, PRGArea.AreaC000); - } - else - { - Switch16KPRG(reg_b + 8, PRGArea.Area8000); - Switch16KPRG(15, PRGArea.AreaC000); - } - } - } - - internal override void OnCPUClock() - { - if (!irq_control) - { - irq_counter++; - if (irq_counter == dipswitches) - { - irq_counter = 0; - NesEmu.IRQFlags |= 8; - } - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(DipSwitchNumber); - stream.Write(reg); - stream.Write(shift); - stream.Write(buffer); - stream.Write(flag_p); - stream.Write(flag_s); - stream.Write(flag_o); - stream.Write(reg_a); - stream.Write(reg_b); - stream.Write(irq_control); - stream.Write(initialized); - stream.Write(irq_counter); - stream.Write(dipswitches); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - DipSwitchNumber = stream.ReadInt32(); - stream.Read(reg, 0, reg.Length); - shift = stream.ReadByte(); - buffer = stream.ReadByte(); - flag_p = stream.ReadBoolean(); - flag_s = stream.ReadBoolean(); - flag_o = stream.ReadBoolean(); - reg_a = stream.ReadInt32(); - reg_b = stream.ReadInt32(); - irq_control = stream.ReadBoolean(); - initialized = stream.ReadBoolean(); - irq_counter = stream.ReadInt32(); - dipswitches = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper105.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper105.cs.meta deleted file mode 100644 index 9c366cb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper105.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cfb3de8d2c5d1464c87dc027df07e70c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper107.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper107.cs deleted file mode 100644 index 23182d9..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper107.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MyNes.Core -{ - internal class Mapper107 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch32KPRG(data >> 1, PRGArea.Area8000); - Switch08KCHR(data); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper107.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper107.cs.meta deleted file mode 100644 index 7a3c039..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper107.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: fb362e4e113e6464bb7ea3f78943eeb1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper112.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper112.cs deleted file mode 100644 index b4a1ded..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper112.cs +++ /dev/null @@ -1,70 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Asder", 112)] - internal class Mapper112 : Board - { - private int address_A000; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_A000 = data & 7; - break; - case 40960: - switch (address_A000) - { - case 0: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 1: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 2: - Switch02KCHR(data >> 1, CHRArea.Area0000); - break; - case 3: - Switch02KCHR(data >> 1, CHRArea.Area0800); - break; - case 4: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 5: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 6: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 7: - Switch01KCHR(data, CHRArea.Area1C00); - break; - } - break; - case 57344: - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(address_A000); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - address_A000 = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper112.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper112.cs.meta deleted file mode 100644 index 682ebb9..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper112.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 95343c95a55d7de4785d4fa775ffde3b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper113.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper113.cs deleted file mode 100644 index 8e4901a..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper113.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Sachen/Hacker/Nina", 113)] - internal class Mapper113 : Board - { - internal override void WriteEX(ref ushort address, ref byte data) - { - if ((address & 0x4100) == 16640) - { - Switch08KCHR((data & 7) | ((data & 0x40) >> 3)); - Switch32KPRG((data >> 3) & 7, PRGArea.Area8000); - Switch01KNMTFromMirroring(((data & 0x80) == 128) ? Mirroring.Vert : Mirroring.Horz); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper113.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper113.cs.meta deleted file mode 100644 index 417f79d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper113.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4bb984682499b7b4883f1ca9a4f9bd71 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper115.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper115.cs deleted file mode 100644 index e2e6bd3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper115.cs +++ /dev/null @@ -1,259 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("MMC3 Cart Saint", 115, true, true)] - internal class Mapper115 : Board - { - private bool flag_c; - - private bool flag_p; - - private bool flag_o; - - private int chr_block; - - private int prg_secreg; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - flag_o = (flag_c = (flag_p = false)); - address_8001 = 0; - chr_block = 0; - prg_secreg = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - switch (address & 0x6001) - { - case 24576: - flag_o = (data & 0x80) == 128; - prg_secreg = data & 0xF; - SetupPRG(); - break; - case 24577: - chr_block = (data & 1) << 8; - SetupCHR(); - break; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR((chr_reg[0] >> 1) | chr_block, CHRArea.Area0000); - Switch02KCHR((chr_reg[1] >> 1) | chr_block, CHRArea.Area0800); - Switch01KCHR(chr_reg[2] | chr_block, CHRArea.Area1000); - Switch01KCHR(chr_reg[3] | chr_block, CHRArea.Area1400); - Switch01KCHR(chr_reg[4] | chr_block, CHRArea.Area1800); - Switch01KCHR(chr_reg[5] | chr_block, CHRArea.Area1C00); - } - else - { - Switch02KCHR((chr_reg[0] >> 1) | chr_block, CHRArea.Area1000); - Switch02KCHR((chr_reg[1] >> 1) | chr_block, CHRArea.Area1800); - Switch01KCHR(chr_reg[2] | chr_block, CHRArea.Area0000); - Switch01KCHR(chr_reg[3] | chr_block, CHRArea.Area0400); - Switch01KCHR(chr_reg[4] | chr_block, CHRArea.Area0800); - Switch01KCHR(chr_reg[5] | chr_block, CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - if (!flag_o) - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - } - else - { - Switch16KPRG(prg_secreg, PRGArea.Area8000); - } - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(flag_o); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(chr_block); - stream.Write(prg_secreg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - flag_o = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - chr_block = stream.ReadInt32(); - prg_secreg = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper115.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper115.cs.meta deleted file mode 100644 index 2e6e78f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper115.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cd032d0a8b03c6345b983161007e83c5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper118.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper118.cs deleted file mode 100644 index 58e858f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper118.cs +++ /dev/null @@ -1,263 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("MMC3 TLSROM", 118, true, true)] - internal class Mapper118 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - internal override void ReadNMT(ref ushort address, out byte value) - { - switch ((address >> 10) & 3) - { - case 0: - value = NMT_RAM[(chr_reg[flag_c ? 2 : 0] >> 7) & 1][address & 0x3FF]; - break; - case 1: - value = NMT_RAM[(chr_reg[flag_c ? 3 : 0] >> 7) & 1][address & 0x3FF]; - break; - case 2: - value = NMT_RAM[(chr_reg[(!flag_c) ? 1 : 4] >> 7) & 1][address & 0x3FF]; - break; - case 3: - value = NMT_RAM[(chr_reg[(!flag_c) ? 1 : 5] >> 7) & 1][address & 0x3FF]; - break; - default: - value = 0; - break; - } - } - - internal override void WriteNMT(ref ushort address, ref byte data) - { - switch ((address >> 10) & 3) - { - case 0: - NMT_RAM[(chr_reg[flag_c ? 2 : 0] >> 7) & 1][address & 0x3FF] = data; - break; - case 1: - NMT_RAM[(chr_reg[flag_c ? 3 : 0] >> 7) & 1][address & 0x3FF] = data; - break; - case 2: - NMT_RAM[(chr_reg[(!flag_c) ? 1 : 4] >> 7) & 1][address & 0x3FF] = data; - break; - case 3: - NMT_RAM[(chr_reg[(!flag_c) ? 1 : 5] >> 7) & 1][address & 0x3FF] = data; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper118.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper118.cs.meta deleted file mode 100644 index aca92d8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper118.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6aa2fe8842a72ee4782e1df1077cfb77 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper119.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper119.cs deleted file mode 100644 index 2634af5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper119.cs +++ /dev/null @@ -1,236 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("TQROM", 119, 1, 8, true, true)] - internal class Mapper119 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override string Issues => MNInterfaceLanguage.IssueMapper119; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Toggle02KCHR_RAM((chr_reg[0] & 0x40) != 0, CHRArea.Area0000); - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Toggle02KCHR_RAM((chr_reg[1] & 0x40) != 0, CHRArea.Area0800); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Toggle02KCHR_RAM((chr_reg[2] & 0x40) != 0, CHRArea.Area1000); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Toggle02KCHR_RAM((chr_reg[3] & 0x40) != 0, CHRArea.Area1400); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Toggle02KCHR_RAM((chr_reg[4] & 0x40) != 0, CHRArea.Area1800); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Toggle02KCHR_RAM((chr_reg[5] & 0x40) != 0, CHRArea.Area1C00); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Toggle02KCHR_RAM((chr_reg[0] & 0x40) != 0, CHRArea.Area1000); - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Toggle02KCHR_RAM((chr_reg[1] & 0x40) != 0, CHRArea.Area1800); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Toggle02KCHR_RAM((chr_reg[2] & 0x40) != 0, CHRArea.Area0000); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Toggle02KCHR_RAM((chr_reg[3] & 0x40) != 0, CHRArea.Area0400); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Toggle02KCHR_RAM((chr_reg[4] & 0x40) != 0, CHRArea.Area0800); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Toggle02KCHR_RAM((chr_reg[5] & 0x40) != 0, CHRArea.Area0C00); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper119.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper119.cs.meta deleted file mode 100644 index 1c2f177..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper119.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 7286dc403cf3750449c7c3ec5b6e8067 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper133.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper133.cs deleted file mode 100644 index c907bc5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper133.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Sachen", 133)] - internal class Mapper133 : Board - { - internal override void WriteEX(ref ushort address, ref byte data) - { - Switch08KCHR(data & 3); - Switch32KPRG(data >> 2, PRGArea.Area8000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper133.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper133.cs.meta deleted file mode 100644 index d70a1c4..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper133.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9b03fd27304f16b4dafa17d7d1750ee1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper140.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper140.cs deleted file mode 100644 index a6ba602..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper140.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 140)] - internal class Mapper140 : Board - { - internal override void WriteSRM(ref ushort address, ref byte data) - { - Switch08KCHR(data & 0xF); - Switch32KPRG((data >> 4) & 3, PRGArea.Area8000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper140.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper140.cs.meta deleted file mode 100644 index d562dd2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper140.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3cba32549a9133c49bbc34b948b557d9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper152.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper152.cs deleted file mode 100644 index d30281d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper152.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 152)] - internal class Mapper152 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR(data & 0xF); - Switch16KPRG((data >> 4) & 7, PRGArea.Area8000); - Switch01KNMTFromMirroring(((data & 0x80) == 128) ? Mirroring.OneScB : Mirroring.OneScA); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper152.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper152.cs.meta deleted file mode 100644 index 75e1a5a..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper152.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 67722d43f058e6f4a9dac4938c2f1173 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper154.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper154.cs deleted file mode 100644 index 3218916..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper154.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("NAMCOT-3453", 154)] - [HassIssues] - internal class Mapper154 : Board - { - private int address_8001; - - internal override string Issues => MNInterfaceLanguage.IssueMapper154; - - internal override void HardReset() - { - base.HardReset(); - address_8001 = 0; - Switch16KPRG(PRG_ROM_16KB_Mask, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0x8001) - { - case 32768: - address_8001 = data & 7; - Switch01KNMTFromMirroring(((data & 0x40) == 64) ? Mirroring.OneScB : Mirroring.OneScA); - break; - case 32769: - switch (address_8001) - { - case 0: - Switch02KCHR((data & 0x3F) >> 1, CHRArea.Area0000); - break; - case 1: - Switch02KCHR((data & 0x3F) >> 1, CHRArea.Area0800); - break; - case 2: - Switch01KCHR(data | 0x40, CHRArea.Area1000); - break; - case 3: - Switch01KCHR(data | 0x40, CHRArea.Area1400); - break; - case 4: - Switch01KCHR(data | 0x40, CHRArea.Area1800); - break; - case 5: - Switch01KCHR(data | 0x40, CHRArea.Area1C00); - break; - case 6: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 7: - Switch08KPRG(data, PRGArea.AreaA000); - break; - } - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(address_8001); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - address_8001 = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper154.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper154.cs.meta deleted file mode 100644 index 82403ba..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper154.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 42da22d35d44cf4418466ac94e6877e1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper163.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper163.cs deleted file mode 100644 index 8441834..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper163.cs +++ /dev/null @@ -1,109 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 163)] - internal class Mapper163 : Board - { - internal byte prg_reg; - - internal byte security_reg; - - internal bool security_trigger; - - internal byte security_reg101; - - internal bool do_chr_ram; - - internal override void HardReset() - { - base.HardReset(); - security_reg101 = 1; - security_trigger = false; - do_chr_ram = true; - Switch32KPRG(15, PRGArea.Area8000); - Toggle08KCHR_RAM(ram: true); - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - if (address == 20737) - { - if (security_reg101 != 0 && data == 0) - { - security_trigger = true; - } - security_reg101 = data; - } - else - { - if (address < 20480) - { - return; - } - switch (address & 0x7300) - { - case 20480: - prg_reg = (byte)((prg_reg & 0xF0u) | (data & 0xFu)); - Switch32KPRG(prg_reg, PRGArea.Area8000); - do_chr_ram = (data & 0x80) != 0; - if (!do_chr_ram && NesEmu.ppu_clock_v < 128) - { - Switch08KCHR(0); - } - break; - case 20736: - if (data == 6) - { - Switch32KPRG(3, PRGArea.Area8000); - } - break; - case 20992: - prg_reg = (byte)((prg_reg & 0xFu) | (uint)((data & 0xF) << 4)); - Switch32KPRG(prg_reg, PRGArea.Area8000); - break; - case 21248: - security_reg = data; - break; - } - } - } - - internal override void ReadEX(ref ushort addr, out byte val) - { - val = 0; - if (addr < 20480) - { - return; - } - switch (addr & 0x1E14) - { - case 20736: - val = security_reg; - break; - case 21760: - if (security_trigger) - { - val = security_reg; - } - break; - } - } - - internal override void OnPPUScanlineTick() - { - base.OnPPUScanlineTick(); - if (do_chr_ram && NesEmu.IsRenderingOn()) - { - if (NesEmu.ppu_clock_v == 127) - { - Switch04KCHR(1, CHRArea.Area0000); - Switch04KCHR(1, CHRArea.Area1000); - } - if (NesEmu.ppu_clock_v == 237) - { - Switch04KCHR(0, CHRArea.Area0000); - Switch04KCHR(0, CHRArea.Area1000); - } - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper163.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper163.cs.meta deleted file mode 100644 index c16f6b7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper163.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 12f496f2eca79314b9d5bf0da4d6c9dc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper164.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper164.cs deleted file mode 100644 index 3fbff7f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper164.cs +++ /dev/null @@ -1,28 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 164)] - internal class Mapper164 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch32KPRG(255, PRGArea.Area8000); - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - if (address >= 20480 && (address & 0xF000) == 20480) - { - Switch32KPRG(data, PRGArea.Area8000); - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if ((address & 0xF000) == 53248) - { - Switch32KPRG(data, PRGArea.Area8000); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper164.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper164.cs.meta deleted file mode 100644 index ccbd059..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper164.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: da6f9ced886f85647927cc4e20e053ce -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper165.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper165.cs deleted file mode 100644 index 45c79fb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper165.cs +++ /dev/null @@ -1,253 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 165, true, true)] - internal class Mapper165 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private byte latch_a = 254; - - private byte latch_b = 254; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - internal override void ReadCHR(ref ushort address, out byte data) - { - if ((address & 0x1FF0) == 4048 && latch_a != 253) - { - latch_a = 253; - Switch04KCHR(chr_reg[0] >> 2, CHRArea.Area0000); - } - else if ((address & 0x1FF0) == 4064 && latch_a != 254) - { - latch_a = 254; - Switch04KCHR(chr_reg[1] >> 2, CHRArea.Area0000); - } - else if ((address & 0x1FF0) == 8144 && latch_b != 253) - { - latch_b = 253; - Switch04KCHR(chr_reg[2] >> 2, CHRArea.Area1000); - } - else if ((address & 0x1FF0) == 8160 && latch_b != 254) - { - latch_b = 254; - Switch04KCHR(chr_reg[4] >> 2, CHRArea.Area1000); - } - base.ReadCHR(ref address, out data); - } - - private void SetupCHR() - { - if (latch_a == 253) - { - Switch04KCHR(chr_reg[0] >> 2, CHRArea.Area0000); - } - if (latch_a == 254) - { - Switch04KCHR(chr_reg[1] >> 2, CHRArea.Area0000); - } - if (latch_b == 253) - { - Switch04KCHR(chr_reg[2] >> 2, CHRArea.Area1000); - } - if (latch_b == 254) - { - Switch04KCHR(chr_reg[4] >> 2, CHRArea.Area1000); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(latch_a); - stream.Write(latch_b); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - latch_a = stream.ReadByte(); - latch_b = stream.ReadByte(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper165.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper165.cs.meta deleted file mode 100644 index ea827a5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper165.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 01df600d7fe9ad7419fea7c8fd3e3eb1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper180.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper180.cs deleted file mode 100644 index 4427a7e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper180.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Nihon Bussan", 180)] - [HassIssues] - internal class Mapper180 : Board - { - internal override string Issues => MNInterfaceLanguage.IssueMapper180; - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch16KPRG(data & 7, PRGArea.AreaC000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper180.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper180.cs.meta deleted file mode 100644 index 9f1fc09..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper180.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1ffae0c30d3a5dd48af658c47bc53a38 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper182.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper182.cs deleted file mode 100644 index f3554c8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper182.cs +++ /dev/null @@ -1,227 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 182, true, true)] - internal class Mapper182 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - mmc3_alt_behavior = false; - irq_clear = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - int num = address & 0xE001; - if (num <= 40961) - { - if (num <= 32769) - { - if (num != 32768 && num == 32769 && NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - } - else if (num != 40960) - { - _ = 40961; - } - else - { - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - } - return; - } - switch (num) - { - case 49152: - switch (address_8001) - { - case 0: - chr_reg[0] = data; - SetupCHR(); - break; - case 1: - chr_reg[3] = data; - SetupCHR(); - break; - case 2: - chr_reg[1] = data; - SetupCHR(); - break; - case 3: - chr_reg[5] = data; - SetupCHR(); - break; - case 4: - prg_reg[0] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - case 5: - prg_reg[1] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - case 6: - chr_reg[2] = data; - SetupCHR(); - break; - case 7: - chr_reg[4] = data; - SetupCHR(); - break; - } - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - irq_reload = data; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper182.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper182.cs.meta deleted file mode 100644 index 55001c4..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper182.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: db03437852d4eb942a0ea6a97e2169bf -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper184.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper184.cs deleted file mode 100644 index ec438b3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper184.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Sunsoft", 184)] - internal class Mapper184 : Board - { - internal override void WriteSRM(ref ushort address, ref byte data) - { - Switch04KCHR(data & 7, CHRArea.Area0000); - Switch04KCHR((data >> 4) & 7, CHRArea.Area1000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper184.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper184.cs.meta deleted file mode 100644 index f10c047..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper184.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3ea85ab17c144364994c80fc92ddafe5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper185.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper185.cs deleted file mode 100644 index 04eb0d2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper185.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 185)] - internal class Mapper185 : Board - { - private bool lockchr; - - internal override void HardReset() - { - base.HardReset(); - lockchr = false; - } - - internal override void ReadCHR(ref ushort address, out byte data) - { - if (!lockchr) - { - base.ReadCHR(ref address, out data); - } - else - { - data = byte.MaxValue; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - lockchr = (data & 0xF) == 0 || data == 19; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(lockchr); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - lockchr = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper185.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper185.cs.meta deleted file mode 100644 index cd6b448..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper185.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8c3aabf4c02e11a4988508a35f600696 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper189.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper189.cs deleted file mode 100644 index 99c8915..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper189.cs +++ /dev/null @@ -1,184 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("MMC3 Variant", 189, true, true)] - internal class Mapper189 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = 0; - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - Switch32KPRG(((data & 0xF0) >> 4) | (data & 0xF), PRGArea.Area8000); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - Switch32KPRG(((data & 0xF0) >> 4) | (data & 0xF), PRGArea.Area8000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - break; - case 32769: - { - int num = address_8001; - if ((uint)num <= 5u) - { - chr_reg[address_8001] = data; - SetupCHR(); - } - break; - } - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - stream.Write(prg_reg); - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - prg_reg = stream.ReadInt32(); - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper189.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper189.cs.meta deleted file mode 100644 index 9b37abb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper189.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 16049f0fed2d5614188f842c620127a9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper191.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper191.cs deleted file mode 100644 index 3ad1f6c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper191.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Pirate MMC3 variant", 191, true, true)] - [HassIssues] - internal class Mapper191 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - internal override string Issues => MNInterfaceLanguage.IssueMapper191; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Toggle02KCHR_RAM((chr_reg[0] & 0x80) == 0, CHRArea.Area0000); - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Toggle02KCHR_RAM((chr_reg[1] & 0x80) == 0, CHRArea.Area0800); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Toggle02KCHR_RAM((chr_reg[2] & 0x80) == 0, CHRArea.Area1000); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Toggle02KCHR_RAM((chr_reg[3] & 0x80) == 0, CHRArea.Area1400); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Toggle02KCHR_RAM((chr_reg[4] & 0x80) == 0, CHRArea.Area1800); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Toggle02KCHR_RAM((chr_reg[5] & 0x80) == 0, CHRArea.Area1C00); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Toggle02KCHR_RAM((chr_reg[0] & 0x80) == 0, CHRArea.Area1000); - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Toggle02KCHR_RAM((chr_reg[1] & 0x80) == 0, CHRArea.Area1800); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Toggle02KCHR_RAM((chr_reg[2] & 0x80) == 0, CHRArea.Area0000); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Toggle02KCHR_RAM((chr_reg[3] & 0x80) == 0, CHRArea.Area0400); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Toggle02KCHR_RAM((chr_reg[4] & 0x80) == 0, CHRArea.Area0800); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Toggle02KCHR_RAM((chr_reg[5] & 0x80) == 0, CHRArea.Area0C00); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper191.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper191.cs.meta deleted file mode 100644 index 55a5c03..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper191.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0938567bea9d60e46b861a10275b4484 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper192.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper192.cs deleted file mode 100644 index 89084a5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper192.cs +++ /dev/null @@ -1,225 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Pirate MMC3 variant", 192, true, true)] - internal class Mapper192 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool isRam; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - isRam = chr_reg[0] >= 8 && chr_reg[0] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area0000); - Switch02KCHR(isRam ? (chr_reg[0] - 8 >> 1) : (chr_reg[0] >> 1), CHRArea.Area0000); - isRam = chr_reg[1] >= 8 && chr_reg[1] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area0000); - Switch02KCHR(isRam ? (chr_reg[1] - 8 >> 1) : (chr_reg[1] >> 1), CHRArea.Area0800); - isRam = chr_reg[2] >= 8 && chr_reg[2] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area1000); - Switch01KCHR(isRam ? (chr_reg[2] - 8) : chr_reg[2], CHRArea.Area1000); - isRam = chr_reg[3] >= 8 && chr_reg[3] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area1400); - Switch01KCHR(isRam ? (chr_reg[3] - 8) : chr_reg[3], CHRArea.Area1400); - isRam = chr_reg[4] >= 8 && chr_reg[4] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area1800); - Switch01KCHR(isRam ? (chr_reg[4] - 8) : chr_reg[4], CHRArea.Area1800); - isRam = chr_reg[5] >= 8 && chr_reg[5] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area1C00); - Switch01KCHR(isRam ? (chr_reg[5] - 8) : chr_reg[5], CHRArea.Area1C00); - } - else - { - isRam = chr_reg[0] >= 8 && chr_reg[0] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area1000); - Switch02KCHR(isRam ? (chr_reg[0] - 8 >> 1) : (chr_reg[0] >> 1), CHRArea.Area1000); - isRam = chr_reg[1] >= 8 && chr_reg[1] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area1800); - Switch02KCHR(isRam ? (chr_reg[1] - 8 >> 1) : (chr_reg[1] >> 1), CHRArea.Area1800); - isRam = chr_reg[2] >= 8 && chr_reg[2] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area0000); - Switch01KCHR(isRam ? (chr_reg[2] - 8) : chr_reg[2], CHRArea.Area0000); - isRam = chr_reg[3] >= 8 && chr_reg[3] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area0400); - Switch01KCHR(isRam ? (chr_reg[3] - 8) : chr_reg[3], CHRArea.Area0400); - isRam = chr_reg[4] >= 8 && chr_reg[4] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area0800); - Switch01KCHR(isRam ? (chr_reg[4] - 8) : chr_reg[4], CHRArea.Area0800); - isRam = chr_reg[5] >= 8 && chr_reg[5] <= 11; - Toggle02KCHR_RAM(isRam, CHRArea.Area0C00); - Switch01KCHR(isRam ? (chr_reg[5] - 8) : chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(isRam); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - isRam = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper192.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper192.cs.meta deleted file mode 100644 index 354492c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper192.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4fa6279cecd943f42baf6d4e8a966cb4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper193.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper193.cs deleted file mode 100644 index dc6e992..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper193.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 193, 1, 32)] - [HassIssues] - internal class Mapper193 : Board - { - internal override string Issues => MNInterfaceLanguage.IssueMapper193; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask - 2, PRGArea.AreaA000); - Switch08KPRG(PRG_ROM_08KB_Mask - 1, PRGArea.AreaC000); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - switch (address & 0x6003) - { - case 24576: - Switch04KCHR(data >> 2, CHRArea.Area0000); - break; - case 24577: - Switch02KCHR(data >> 1, CHRArea.Area1000); - break; - case 24578: - Switch02KCHR(data >> 1, CHRArea.Area1800); - break; - case 24579: - Switch08KPRG(data, PRGArea.Area8000); - break; - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper193.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper193.cs.meta deleted file mode 100644 index 512e4aa..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper193.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f76460c502274ab4a8cac566ce0f0126 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper194.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper194.cs deleted file mode 100644 index 78fe5e4..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper194.cs +++ /dev/null @@ -1,209 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Pirate MMC3 variant", 194, true, true)] - internal class Mapper194 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Toggle02KCHR_RAM(chr_reg[0] > 1, CHRArea.Area0000); - Switch02KCHR((chr_reg[0] > 1) ? (chr_reg[0] - 1 >> 1) : (chr_reg[0] >> 1), CHRArea.Area0000); - Toggle02KCHR_RAM(chr_reg[1] > 1, CHRArea.Area0800); - Switch02KCHR((chr_reg[1] > 1) ? (chr_reg[1] - 1 >> 1) : (chr_reg[1] >> 1), CHRArea.Area0800); - Toggle02KCHR_RAM(chr_reg[2] > 1, CHRArea.Area1000); - Switch01KCHR((chr_reg[2] > 1) ? (chr_reg[2] - 1) : chr_reg[2], CHRArea.Area1000); - Toggle02KCHR_RAM(chr_reg[3] > 1, CHRArea.Area1400); - Switch01KCHR((chr_reg[3] > 1) ? (chr_reg[3] - 1) : chr_reg[3], CHRArea.Area1400); - Toggle02KCHR_RAM(chr_reg[4] > 1, CHRArea.Area1800); - Switch01KCHR((chr_reg[4] > 1) ? (chr_reg[4] - 1) : chr_reg[4], CHRArea.Area1800); - Toggle02KCHR_RAM(chr_reg[5] > 1, CHRArea.Area1C00); - Switch01KCHR((chr_reg[5] > 1) ? (chr_reg[5] - 1) : chr_reg[5], CHRArea.Area1C00); - } - else - { - Toggle02KCHR_RAM(chr_reg[0] > 1, CHRArea.Area1000); - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Toggle02KCHR_RAM(chr_reg[1] > 1, CHRArea.Area1800); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Toggle02KCHR_RAM(chr_reg[2] > 1, CHRArea.Area0000); - Switch01KCHR((chr_reg[2] > 1) ? (chr_reg[2] - 1) : chr_reg[2], CHRArea.Area0000); - Toggle02KCHR_RAM(chr_reg[3] > 1, CHRArea.Area0400); - Switch01KCHR((chr_reg[3] > 1) ? (chr_reg[3] - 1) : chr_reg[3], CHRArea.Area0400); - Toggle02KCHR_RAM(chr_reg[4] > 1, CHRArea.Area0800); - Switch01KCHR((chr_reg[4] > 1) ? (chr_reg[4] - 1) : chr_reg[4], CHRArea.Area0800); - Toggle02KCHR_RAM(chr_reg[5] > 1, CHRArea.Area0C00); - Switch01KCHR((chr_reg[5] > 1) ? (chr_reg[5] - 1) : chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper194.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper194.cs.meta deleted file mode 100644 index 3dc6752..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper194.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 81ac03f4648c10c47b5903542095eef4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper200.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper200.cs deleted file mode 100644 index af4effe..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper200.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 200)] - internal class Mapper200 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR(address & 7); - Switch16KPRG(address & 7, PRGArea.Area8000); - Switch16KPRG(address & 7, PRGArea.AreaC000); - Switch01KNMTFromMirroring(((address & 8) == 8) ? Mirroring.Horz : Mirroring.Vert); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper200.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper200.cs.meta deleted file mode 100644 index 82706b1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper200.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: cf60a6b944a2cd646b955ef1890527fe -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper201.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper201.cs deleted file mode 100644 index e6ccad2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper201.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 201)] - internal class Mapper201 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR(address & 0xFF); - Switch32KPRG(address & 0xFF, PRGArea.Area8000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper201.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper201.cs.meta deleted file mode 100644 index 8978d1c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper201.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0fa34e45527799b4090d44ffa7f88235 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper202.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper202.cs deleted file mode 100644 index 2e6d0d1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper202.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("150-in-1", 202)] - [HassIssues] - internal class Mapper202 : Board - { - internal override string Issues => MNInterfaceLanguage.IssueMapper202; - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch01KNMTFromMirroring(((address & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - Switch08KCHR((address >> 1) & 7); - if ((address & 0xC) == 12) - { - Switch32KPRG(3, PRGArea.Area8000); - return; - } - Switch16KPRG((address >> 1) & 7, PRGArea.Area8000); - Switch16KPRG((address >> 1) & 7, PRGArea.AreaC000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper202.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper202.cs.meta deleted file mode 100644 index 054b5a0..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper202.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 70c735d1069ff314dbf88ff45dbdb8b2 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper203.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper203.cs deleted file mode 100644 index 79ebe1d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper203.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 203)] - [HassIssues] - internal class Mapper203 : Board - { - internal override string Issues => MNInterfaceLanguage.IssueMapper203; - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR(data & 3); - Switch16KPRG(data & 0x3F, PRGArea.Area8000); - Switch16KPRG(data & 0x3F, PRGArea.AreaC000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper203.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper203.cs.meta deleted file mode 100644 index 79c7332..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper203.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 16cfb93389e5f6a4084c106625e4879f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper204.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper204.cs deleted file mode 100644 index bfb4426..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper204.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("64-in-1", 204)] - internal class Mapper204 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch01KNMTFromMirroring(((address & 0x10) == 16) ? Mirroring.Horz : Mirroring.Vert); - Switch08KCHR(address & 7); - if ((address & 6) == 6) - { - Switch32KPRG(3, PRGArea.Area8000); - return; - } - Switch16KPRG(address & 7, PRGArea.Area8000); - Switch16KPRG(address & 7, PRGArea.AreaC000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper204.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper204.cs.meta deleted file mode 100644 index 6c03482..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper204.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5d5dcc6e4a9329745868b6b2ef452dc5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper205.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper205.cs deleted file mode 100644 index 86fceef..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper205.cs +++ /dev/null @@ -1,275 +0,0 @@ -using System; -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 205, true, true)] - internal class Mapper205 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private int chr_or; - - private int chr_and; - - private int prg_or; - - private int prg_and; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_and = 31; - prg_or = 0; - chr_and = 255; - chr_or = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - if (IsGameFoundOnDB) - { - switch (GameCartInfo.chip_type[0].ToLower()) - { - case "mmc3a": - mmc3_alt_behavior = true; - Console.WriteLine("Chip= MMC3 A, MMC3 IQR mode switched to RevA"); - break; - case "mmc3b": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 B, MMC3 IQR mode switched to RevB"); - break; - case "mmc3c": - mmc3_alt_behavior = false; - Console.WriteLine("Chip= MMC3 C, MMC3 IQR mode switched to RevB"); - break; - } - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - switch (data & 3) - { - case 0: - prg_and = 31; - prg_or = 0; - chr_and = 255; - chr_or = 0; - break; - case 1: - prg_and = 31; - prg_or = 16; - chr_and = 255; - chr_or = 128; - break; - case 2: - prg_and = 15; - prg_or = 32; - chr_and = 127; - chr_or = 256; - break; - case 3: - prg_and = 15; - prg_or = 48; - chr_and = 127; - chr_or = 384; - break; - } - SetupCHR(); - SetupPRG(); - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area0000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area0800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area1000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area1400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area1800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area1C00); - } - else - { - Switch02KCHR(((chr_reg[0] & chr_and) | chr_or) >> 1, CHRArea.Area1000); - Switch02KCHR(((chr_reg[1] & chr_and) | chr_or) >> 1, CHRArea.Area1800); - Switch01KCHR((chr_reg[2] & chr_and) | chr_or, CHRArea.Area0000); - Switch01KCHR((chr_reg[3] & chr_and) | chr_or, CHRArea.Area0400); - Switch01KCHR((chr_reg[4] & chr_and) | chr_or, CHRArea.Area0800); - Switch01KCHR((chr_reg[5] & chr_and) | chr_or, CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG((prg_reg[flag_p ? 2 : 0] & prg_and) | prg_or, PRGArea.Area8000); - Switch08KPRG((prg_reg[1] & prg_and) | prg_or, PRGArea.AreaA000); - Switch08KPRG((prg_reg[(!flag_p) ? 2 : 0] & prg_and) | prg_or, PRGArea.AreaC000); - Switch08KPRG((prg_reg[3] & prg_and) | prg_or, PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(chr_or); - stream.Write(chr_and); - stream.Write(prg_or); - stream.Write(prg_and); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - chr_or = stream.ReadInt32(); - chr_and = stream.ReadInt32(); - prg_or = stream.ReadInt32(); - prg_and = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper205.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper205.cs.meta deleted file mode 100644 index 2108df8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper205.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 10f689fe32f13114fbc616cb3a04dd0f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper206.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper206.cs deleted file mode 100644 index a1ddd5b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper206.cs +++ /dev/null @@ -1,131 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 206)] - internal class Mapper206 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - SetupPRG(); - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - case 7: - prg_reg[address_8001 - 6] = data & PRG_ROM_08KB_Mask; - SetupPRG(); - break; - } - break; - } - } - - private void SetupCHR() - { - if (!flag_c) - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - - private void SetupPRG() - { - Switch08KPRG(prg_reg[flag_p ? 2 : 0], PRGArea.Area8000); - Switch08KPRG(prg_reg[1], PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0], PRGArea.AreaC000); - Switch08KPRG(prg_reg[3], PRGArea.AreaE000); - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper206.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper206.cs.meta deleted file mode 100644 index ae26717..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper206.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dd0ebc01d4ccb5144be2ae2380e63a4b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper207.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper207.cs deleted file mode 100644 index 54de6c3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper207.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 207)] - [HassIssues] - internal class Mapper207 : Board - { - private int mirroring0; - - private int mirroring1; - - internal override string Issues => MNInterfaceLanguage.IssueMapper207; - - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - switch (address) - { - case 32496: - Switch02KCHR(data & 0x3F, CHRArea.Area0000); - mirroring0 = (data >> 7) & 1; - break; - case 32497: - Switch02KCHR(data & 0x3F, CHRArea.Area0800); - mirroring1 = (data >> 7) & 1; - break; - case 32498: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 32499: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 32500: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 32501: - Switch01KCHR(data, CHRArea.Area1C00); - break; - case 32506: - case 32507: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 32508: - case 32509: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 32510: - case 32511: - Switch08KPRG(data, PRGArea.AreaC000); - break; - case 32502: - case 32503: - case 32504: - case 32505: - break; - } - } - - internal override void ReadNMT(ref ushort address, out byte data) - { - switch ((address >> 10) & 3) - { - case 0: - case 1: - data = NMT_RAM[mirroring0][address & 0x3FF]; - break; - case 2: - case 3: - data = NMT_RAM[mirroring1][address & 0x3FF]; - break; - default: - data = 0; - break; - } - } - - internal override void WriteNMT(ref ushort address, ref byte data) - { - switch ((address >> 10) & 3) - { - case 0: - case 1: - NMT_RAM[mirroring0][address & 0x3FF] = data; - break; - case 2: - case 3: - NMT_RAM[mirroring1][address & 0x3FF] = data; - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(mirroring0); - stream.Write(mirroring1); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - mirroring0 = stream.ReadInt32(); - mirroring1 = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper207.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper207.cs.meta deleted file mode 100644 index 8905a37..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper207.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8120e93e983c6a240aa549981107c6f9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper209.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper209.cs deleted file mode 100644 index fae5b6e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper209.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Pirate MMC5-style", 209)] - internal class Mapper209 : Mapper090 - { - internal override void HardReset() - { - MAPPER90MODE = false; - base.HardReset(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper209.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper209.cs.meta deleted file mode 100644 index a769ed7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper209.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6e1cfeabf90d9d241a85d23d367fd146 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper212.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper212.cs deleted file mode 100644 index 4300ebf..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper212.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Super HIK 300-in-1 (1994)", 212)] - internal class Mapper212 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR(address & 7); - Switch01KNMTFromMirroring(((address & 8) == 8) ? Mirroring.Horz : Mirroring.Vert); - if ((address & 0x4000) == 16384) - { - Switch32KPRG((address >> 1) & 3, PRGArea.Area8000); - return; - } - Switch16KPRG(address & 7, PRGArea.Area8000); - Switch16KPRG(address & 7, PRGArea.AreaC000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper212.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper212.cs.meta deleted file mode 100644 index f4712ea..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper212.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 9b0a6452db095d64d9b655ea1a70de61 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper213.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper213.cs deleted file mode 100644 index 624b079..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper213.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("9999999-in-1", 213)] - internal class Mapper213 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR((address >> 3) & 7); - Switch32KPRG((address >> 1) & 3, PRGArea.Area8000); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper213.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper213.cs.meta deleted file mode 100644 index 0b17a90..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper213.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 5f55d2933322aa24986e3c886539b729 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper214.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper214.cs deleted file mode 100644 index 0014c9b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper214.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("X-in-1", 214)] - internal class Mapper214 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch16KPRG(address >> 2, PRGArea.Area8000); - Switch16KPRG(address >> 2, PRGArea.AreaC000); - Switch08KCHR(address); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper214.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper214.cs.meta deleted file mode 100644 index ab69bd1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper214.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c7b5c32585db1e640b6b297c40f0df87 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper216.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper216.cs deleted file mode 100644 index 6b75a91..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper216.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 216)] - internal class Mapper216 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch32KPRG(address, PRGArea.Area8000); - Switch08KCHR(address >> 1); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper216.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper216.cs.meta deleted file mode 100644 index bccb44d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper216.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e384cf0eb5fa0b04eb8453de825d16f1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper222.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper222.cs deleted file mode 100644 index 4ce322d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper222.cs +++ /dev/null @@ -1,48 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 222)] - internal class Mapper222 : Board - { - internal override string Issues => MNInterfaceLanguage.IssueMapper222; - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF003) - { - case 32768: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 36864: - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - break; - case 40960: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 45056: - Switch01KCHR(data, CHRArea.Area0000); - break; - case 45058: - Switch01KCHR(data, CHRArea.Area0400); - break; - case 49152: - Switch01KCHR(data, CHRArea.Area0800); - break; - case 49154: - Switch01KCHR(data, CHRArea.Area0C00); - break; - case 53248: - Switch01KCHR(data, CHRArea.Area1000); - break; - case 53250: - Switch01KCHR(data, CHRArea.Area1400); - break; - case 57344: - Switch01KCHR(data, CHRArea.Area1800); - break; - case 57346: - Switch01KCHR(data, CHRArea.Area1C00); - break; - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper222.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper222.cs.meta deleted file mode 100644 index fe1dc07..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper222.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 84f2bbbe7be8a35479c83cded3cdd0f4 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper225.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper225.cs deleted file mode 100644 index d1e09b1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper225.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 225)] - internal class Mapper225 : Board - { - private byte[] RAM; - - internal override void HardReset() - { - base.HardReset(); - RAM = new byte[4]; - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - if (address >= 22528) - { - RAM[address & 3] = (byte)(data & 0xFu); - } - } - - internal override void ReadEX(ref ushort address, out byte value) - { - if (address >= 22528) - { - value = RAM[address & 3]; - } - else - { - value = 0; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR(address & 0x3F); - if ((address & 0x1000) == 4096) - { - Switch16KPRG((address >> 6) & 0x3F, PRGArea.Area8000); - Switch16KPRG((address >> 6) & 0x3F, PRGArea.AreaC000); - } - else - { - Switch32KPRG(((address >> 6) & 0x3F) >> 1, PRGArea.Area8000); - } - Switch01KNMTFromMirroring(((address & 0x2000) == 8192) ? Mirroring.Horz : Mirroring.Vert); - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(RAM); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - stream.Read(RAM, 0, RAM.Length); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper225.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper225.cs.meta deleted file mode 100644 index c9bc3f1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper225.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 805833a504a7b7e44b9bc02878580e21 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper226.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper226.cs deleted file mode 100644 index bee16ad..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper226.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 226)] - internal class Mapper226 : Board - { - private int prg_reg; - - private bool prg_mode; - - internal override void HardReset() - { - base.HardReset(); - prg_reg = 0; - prg_mode = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0x8001) - { - case 32768: - prg_reg = (data & 0x1F) | ((data & 0x80) >> 2) | (prg_reg & 0xC0); - prg_mode = (data & 0x20) == 32; - Switch01KNMTFromMirroring(((data & 0x40) == 64) ? Mirroring.Vert : Mirroring.Horz); - if (prg_mode) - { - Switch16KPRG(prg_reg, PRGArea.Area8000); - Switch16KPRG(prg_reg, PRGArea.AreaC000); - } - else - { - Switch32KPRG(prg_reg >> 1, PRGArea.Area8000); - } - break; - case 32769: - prg_reg = ((data & 1) << 6) | (prg_reg & 0x3F); - if (prg_mode) - { - Switch16KPRG(prg_reg, PRGArea.Area8000); - Switch16KPRG(prg_reg, PRGArea.AreaC000); - } - else - { - Switch32KPRG(prg_reg >> 1, PRGArea.Area8000); - } - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(prg_reg); - stream.Write(prg_mode); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - prg_reg = stream.ReadInt32(); - prg_mode = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper226.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper226.cs.meta deleted file mode 100644 index 194189b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper226.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d2d0d6a9786e1eb488a45d8b784279b9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper227.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper227.cs deleted file mode 100644 index fdc5e76..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper227.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 227)] - internal class Mapper227 : Board - { - private bool flag_o; - - private bool flag_s; - - private bool flag_l; - - private int prg_reg; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(0, PRGArea.AreaC000); - flag_o = false; - flag_s = false; - flag_l = false; - prg_reg = 0; - ToggleCHRRAMWritableEnable(enable: true); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - flag_s = (address & 1) == 1; - flag_o = (address & 0x80) == 128; - flag_l = (address & 0x200) == 512; - prg_reg = ((address >> 2) & 0x1F) | ((address >> 3) & 0x20); - Switch01KNMTFromMirroring(((address & 2) == 2) ? Mirroring.Horz : Mirroring.Vert); - ToggleCHRRAMWritableEnable(!flag_o); - if (flag_o) - { - if (!flag_s) - { - Switch16KPRG(prg_reg, PRGArea.Area8000); - Switch16KPRG(prg_reg, PRGArea.AreaC000); - } - else - { - Switch32KPRG(prg_reg >> 1, PRGArea.Area8000); - } - } - else if (!flag_l) - { - if (!flag_s) - { - Switch16KPRG(prg_reg, PRGArea.Area8000); - Switch16KPRG(prg_reg & 0x38, PRGArea.AreaC000); - } - else - { - Switch16KPRG(prg_reg & 0x3E, PRGArea.Area8000); - Switch16KPRG(prg_reg & 0x38, PRGArea.AreaC000); - } - } - else if (!flag_s) - { - Switch16KPRG(prg_reg, PRGArea.Area8000); - Switch16KPRG(prg_reg | 7, PRGArea.AreaC000); - } - else - { - Switch16KPRG(prg_reg & 0x3E, PRGArea.Area8000); - Switch16KPRG(prg_reg | 7, PRGArea.AreaC000); - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_o); - stream.Write(flag_s); - stream.Write(flag_l); - stream.Write(prg_reg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_o = stream.ReadBoolean(); - flag_s = stream.ReadBoolean(); - flag_l = stream.ReadBoolean(); - prg_reg = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper227.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper227.cs.meta deleted file mode 100644 index 4ac38b8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper227.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 675c53fc4556f454094683ba8b663cca -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper228.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper228.cs deleted file mode 100644 index ccbcdc3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper228.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 228)] - [HassIssues] - internal class Mapper228 : Board - { - private byte[] RAM; - - private int bank; - - internal override string Issues => MNInterfaceLanguage.IssueMapper228; - - internal override void HardReset() - { - base.HardReset(); - RAM = new byte[4]; - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - RAM[address & 3] = (byte)(data & 0xFu); - } - - internal override void ReadEX(ref ushort address, out byte data) - { - data = RAM[address & 3]; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR(((address & 0xF) << 2) | (data & 3)); - Switch01KNMTFromMirroring(((address & 0x2000) == 8192) ? Mirroring.Horz : Mirroring.Vert); - bank = ((address >> 7) & 0x1F) + ((address >> 7) & (address >> 8) & 0x10); - if ((address & 0x20) == 32) - { - Switch16KPRG((bank << 2) | ((address >> 5) & 2), PRGArea.Area8000); - Switch16KPRG((bank << 2) | ((address >> 5) & 2), PRGArea.AreaC000); - } - else - { - Switch32KPRG(bank, PRGArea.Area8000); - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(RAM); - stream.Write(bank); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - stream.Read(RAM, 0, RAM.Length); - bank = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper228.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper228.cs.meta deleted file mode 100644 index 2578d37..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper228.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d66a7ccd1090c894ba6919d9fa505c79 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper229.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper229.cs deleted file mode 100644 index 17f8ce9..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper229.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 229)] - [HassIssues] - internal class Mapper229 : Board - { - internal override string Issues => MNInterfaceLanguage.IssueMapper229; - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch01KNMTFromMirroring(((address & 0x20) == 32) ? Mirroring.Horz : Mirroring.Vert); - Switch16KPRG(((address & 0x1E) == 30) ? (address & 0x1F) : 0, PRGArea.Area8000); - Switch16KPRG(((address & 0x1E) != 30) ? 1 : (address & 0x1F), PRGArea.AreaC000); - Switch08KCHR(address); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper229.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper229.cs.meta deleted file mode 100644 index abbb34f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper229.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8123f098f1b3113469e3407bbd436d4f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper230.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper230.cs deleted file mode 100644 index 0f73e75..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper230.cs +++ /dev/null @@ -1,58 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 230)] - [HassIssues] - internal class Mapper230 : Board - { - private bool contraMode; - - internal override string Issues => MNInterfaceLanguage.IssueMapper230; - - internal override void HardReset() - { - base.HardReset(); - contraMode = true; - Switch16KPRG(0, PRGArea.Area8000); - Switch16KPRG(7, PRGArea.AreaC000); - } - - internal override void SoftReset() - { - base.SoftReset(); - contraMode = !contraMode; - if (contraMode) - { - Switch16KPRG(0, PRGArea.Area8000); - Switch16KPRG(7, PRGArea.AreaC000); - Switch01KNMTFromMirroring(Mirroring.Vert); - } - else - { - Switch08KCHR(0); - Switch16KPRG(8, PRGArea.Area8000); - Switch16KPRG(39, PRGArea.AreaC000); - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if (contraMode) - { - Switch16KPRG(data & 7, PRGArea.Area8000); - Switch16KPRG(7, PRGArea.AreaC000); - Switch01KNMTFromMirroring(Mirroring.Vert); - return; - } - Switch01KNMTFromMirroring(((data & 0x40) == 64) ? Mirroring.Vert : Mirroring.Horz); - if ((data & 0x20) == 32) - { - Switch16KPRG((data & 0x1F) + 8, PRGArea.Area8000); - Switch16KPRG((data & 0x1F) + 8, PRGArea.AreaC000); - } - else - { - Switch32KPRG(((data & 0x1F) >> 1) + 4, PRGArea.Area8000); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper230.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper230.cs.meta deleted file mode 100644 index cc4df39..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper230.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f6425637e54797c45abebe7b1c8e30dc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper231.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper231.cs deleted file mode 100644 index 35cf150..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper231.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 231)] - internal class Mapper231 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch16KPRG(address & 0x1E, PRGArea.Area8000); - Switch16KPRG((address & 0x1E) | ((address >> 5) & 1), PRGArea.AreaC000); - Switch01KNMTFromMirroring(((address & 0x80) == 128) ? Mirroring.Horz : Mirroring.Vert); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper231.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper231.cs.meta deleted file mode 100644 index e4f3084..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper231.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: be52d26a4ead22042b0265a6db3b2a6a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper232.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper232.cs deleted file mode 100644 index 94ae499..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper232.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 232)] - internal class Mapper232 : Board - { - private int prg_reg; - - internal override void HardReset() - { - base.HardReset(); - Switch16KPRG(3, PRGArea.AreaC000); - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - if (address < 49152) - { - prg_reg = ((data & 0x18) >> 1) | (prg_reg & 3); - } - else - { - prg_reg = (prg_reg & 0xC) | (data & 3); - } - Switch16KPRG(prg_reg, PRGArea.Area8000); - Switch16KPRG(3 | (prg_reg & 0xC), PRGArea.AreaC000); - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(prg_reg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - prg_reg = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper232.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper232.cs.meta deleted file mode 100644 index a6090df..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper232.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dafbc365bc8eb164a9fcac860585e366 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper233.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper233.cs deleted file mode 100644 index 6cefdfc..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper233.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 233)] - internal class Mapper233 : Board - { - private int title; - - private int bank; - - internal override void HardReset() - { - base.HardReset(); - bank = (title = 0); - } - - internal override void SoftReset() - { - base.SoftReset(); - bank = 0; - title ^= 32; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - bank = data & 0x1F; - if ((data & 0x20) == 32) - { - Switch16KPRG(title | bank, PRGArea.Area8000); - Switch16KPRG(title | bank, PRGArea.AreaC000); - } - else - { - Switch32KPRG((title >> 1) | (bank >> 1), PRGArea.Area8000); - } - switch ((data >> 6) & 3) - { - case 0: - Switch01KNMT(128); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 2: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(title); - stream.Write(bank); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - title = stream.ReadInt32(); - bank = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper233.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper233.cs.meta deleted file mode 100644 index 400a17e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper233.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e907b2b34ef04f145be24c3f2eada20f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper240.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper240.cs deleted file mode 100644 index 6dc9804..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper240.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 240)] - internal class Mapper240 : Board - { - internal override void WriteEX(ref ushort address, ref byte data) - { - Switch32KPRG((data >> 4) & 0xF, PRGArea.Area8000); - Switch08KCHR(data & 0xF); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper240.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper240.cs.meta deleted file mode 100644 index 52cd3f7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper240.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: eb9d4ffbec8733541a56bc8469e2b86f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper242.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper242.cs deleted file mode 100644 index 3ce5a23..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper242.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 242)] - internal class Mapper242 : Board - { - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch32KPRG((address >> 3) & 0xF, PRGArea.Area8000); - Switch01KNMTFromMirroring(((address & 2) == 2) ? Mirroring.Horz : Mirroring.Vert); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper242.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper242.cs.meta deleted file mode 100644 index 1334878..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper242.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d62ffe85351435340a8e3c42f84dee3b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper243.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper243.cs deleted file mode 100644 index 2fd28e6..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper243.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Sachen Poker", 243)] - [HassIssues] - internal class Mapper243 : Board - { - private int addr; - - private int chr_reg; - - internal override string Issues => MNInterfaceLanguage.IssueMapper243; - - internal override void HardReset() - { - base.HardReset(); - addr = (chr_reg = 0); - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - if (address >= 20480 || address < 16416) - { - return; - } - switch (address & 0x4101) - { - case 16640: - addr = data & 7; - break; - case 16641: - switch (addr) - { - case 2: - chr_reg = ((data << 3) & 8) | (chr_reg & 7); - Switch08KCHR(chr_reg); - break; - case 4: - chr_reg = (data & 1) | (chr_reg & 0xE); - Switch08KCHR(chr_reg); - break; - case 5: - Switch32KPRG(data & 7, PRGArea.Area8000); - break; - case 6: - chr_reg = ((data & 3) << 1) | (chr_reg & 9); - Switch08KCHR(chr_reg); - break; - case 7: - switch ((data >> 1) & 3) - { - case 0: - Switch01KNMTFromMirroring(Mirroring.Horz); - break; - case 1: - Switch01KNMTFromMirroring(Mirroring.Vert); - break; - case 2: - Switch01KNMT(14); - break; - case 3: - Switch01KNMTFromMirroring(Mirroring.OneScB); - break; - } - break; - case 3: - break; - } - break; - } - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(addr); - stream.Write(chr_reg); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - addr = stream.ReadInt32(); - chr_reg = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper243.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper243.cs.meta deleted file mode 100644 index 0e971e1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper243.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d1322eaba98d208409847802768cbbc6 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper245.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper245.cs deleted file mode 100644 index 4bdbd03..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper245.cs +++ /dev/null @@ -1,229 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("C&E", 245, true, true)] - [HassIssues] - internal class Mapper245 : Board - { - private bool flag_c; - - private bool flag_p; - - private int address_8001; - - private int[] chr_reg; - - private int[] prg_reg; - - private int prg_or; - - private bool irq_enabled; - - private byte irq_counter; - - private int old_irq_counter; - - private byte irq_reload; - - private bool irq_clear; - - private bool mmc3_alt_behavior; - - internal override string Issues => MNInterfaceLanguage.IssueMapper245; - - internal override void HardReset() - { - base.HardReset(); - flag_c = (flag_p = false); - address_8001 = 0; - prg_reg = new int[4]; - prg_or = 0; - prg_reg[0] = 0; - prg_reg[1] = 1; - prg_reg[2] = PRG_ROM_08KB_Mask - 1; - prg_reg[3] = PRG_ROM_08KB_Mask; - chr_reg = new int[6]; - for (int i = 0; i < 6; i++) - { - chr_reg[i] = 0; - } - SetupPRG(); - SetupCHR(); - irq_enabled = false; - irq_counter = 0; - irq_reload = byte.MaxValue; - old_irq_counter = 0; - irq_clear = false; - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xE001) - { - case 32768: - address_8001 = data & 7; - flag_c = (data & 0x80) != 0; - flag_p = (data & 0x40) != 0; - SetupCHR(); - SetupPRG(); - break; - case 32769: - switch (address_8001) - { - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - chr_reg[address_8001] = data; - SetupCHR(); - break; - case 6: - prg_reg[0] = data & 0x3F; - SetupPRG(); - break; - case 7: - prg_reg[1] = data & 0x3F; - SetupPRG(); - break; - } - break; - case 40960: - if (NMT_DEFAULT_MIRROR != Mirroring.Full) - { - Switch01KNMTFromMirroring(((data & 1) == 1) ? Mirroring.Horz : Mirroring.Vert); - } - break; - case 40961: - TogglePRGRAMEnable((data & 0x80) != 0); - TogglePRGRAMWritableEnable((data & 0x40) == 0); - break; - case 49152: - irq_reload = data; - break; - case 49153: - if (mmc3_alt_behavior) - { - irq_clear = true; - } - irq_counter = 0; - break; - case 57344: - irq_enabled = false; - NesEmu.IRQFlags &= -9; - break; - case 57345: - irq_enabled = true; - break; - } - } - - private void SetupCHR() - { - if (CHR_ROM_01KB_Count > 0) - { - if (!flag_c) - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area0000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area0800); - Switch01KCHR(chr_reg[2], CHRArea.Area1000); - Switch01KCHR(chr_reg[3], CHRArea.Area1400); - Switch01KCHR(chr_reg[4], CHRArea.Area1800); - Switch01KCHR(chr_reg[5], CHRArea.Area1C00); - } - else - { - Switch02KCHR(chr_reg[0] >> 1, CHRArea.Area1000); - Switch02KCHR(chr_reg[1] >> 1, CHRArea.Area1800); - Switch01KCHR(chr_reg[2], CHRArea.Area0000); - Switch01KCHR(chr_reg[3], CHRArea.Area0400); - Switch01KCHR(chr_reg[4], CHRArea.Area0800); - Switch01KCHR(chr_reg[5], CHRArea.Area0C00); - } - } - else if (!flag_c) - { - Switch04KCHR(0, CHRArea.Area0000); - Switch04KCHR(1, CHRArea.Area1000); - } - else - { - Switch04KCHR(1, CHRArea.Area0000); - Switch04KCHR(0, CHRArea.Area1000); - } - } - - private void SetupPRG() - { - prg_or = (chr_reg[0] & 2) << 5; - Switch08KPRG(prg_reg[flag_p ? 2 : 0] | prg_or, PRGArea.Area8000); - Switch08KPRG(prg_reg[1] | prg_or, PRGArea.AreaA000); - Switch08KPRG(prg_reg[(!flag_p) ? 2 : 0] | prg_or, PRGArea.AreaC000); - Switch08KPRG(prg_reg[3] | prg_or, PRGArea.AreaE000); - } - - internal override void OnPPUA12RaisingEdge() - { - old_irq_counter = irq_counter; - if (irq_counter == 0 || irq_clear) - { - irq_counter = irq_reload; - } - else - { - irq_counter--; - } - if ((!mmc3_alt_behavior || old_irq_counter != 0 || irq_clear) && irq_counter == 0 && irq_enabled) - { - NesEmu.IRQFlags |= 8; - } - irq_clear = false; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(flag_c); - stream.Write(flag_p); - stream.Write(address_8001); - for (int i = 0; i < chr_reg.Length; i++) - { - stream.Write(chr_reg[i]); - } - for (int j = 0; j < prg_reg.Length; j++) - { - stream.Write(prg_reg[j]); - } - stream.Write(irq_enabled); - stream.Write(irq_counter); - stream.Write(old_irq_counter); - stream.Write(irq_reload); - stream.Write(irq_clear); - stream.Write(prg_or); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - flag_c = stream.ReadBoolean(); - flag_p = stream.ReadBoolean(); - address_8001 = stream.ReadInt32(); - for (int i = 0; i < chr_reg.Length; i++) - { - chr_reg[i] = stream.ReadInt32(); - } - for (int j = 0; j < prg_reg.Length; j++) - { - prg_reg[j] = stream.ReadInt32(); - } - irq_enabled = stream.ReadBoolean(); - irq_counter = stream.ReadByte(); - old_irq_counter = stream.ReadInt32(); - irq_reload = stream.ReadByte(); - irq_clear = stream.ReadBoolean(); - prg_or = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper245.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper245.cs.meta deleted file mode 100644 index 040ac42..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper245.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6ab59a7c8ec0352498d385808f3136a5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper246.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper246.cs deleted file mode 100644 index c352f41..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper246.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace MyNes.Core -{ - [BoardInfo("Unknown", 246)] - internal class Mapper246 : Board - { - internal override void HardReset() - { - base.HardReset(); - Switch08KPRG(255, PRGArea.AreaE000); - } - - internal override void WriteSRM(ref ushort address, ref byte data) - { - if (address < 26624) - { - switch (address) - { - case 24576: - Switch08KPRG(data, PRGArea.Area8000); - break; - case 24577: - Switch08KPRG(data, PRGArea.AreaA000); - break; - case 24578: - Switch08KPRG(data, PRGArea.AreaC000); - break; - case 24579: - Switch08KPRG(data, PRGArea.AreaE000); - break; - case 24580: - Switch02KCHR(data, CHRArea.Area0000); - break; - case 24581: - Switch02KCHR(data, CHRArea.Area0800); - break; - case 24582: - Switch02KCHR(data, CHRArea.Area1000); - break; - case 24583: - Switch02KCHR(data, CHRArea.Area1800); - break; - } - } - else - { - base.WriteSRM(ref address, ref data); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper246.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper246.cs.meta deleted file mode 100644 index 46221ca..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper246.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b64643bcf29c76246b9f648dea863909 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper255.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper255.cs deleted file mode 100644 index 043df54..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper255.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - [BoardInfo("Unknown", 255)] - [HassIssues] - internal class Mapper255 : Board - { - private byte[] RAM; - - internal override string Issues => MNInterfaceLanguage.IssueMapper255; - - internal override void HardReset() - { - base.HardReset(); - RAM = new byte[4]; - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - if (address >= 22528) - { - RAM[address & 3] = (byte)(data & 0xFu); - } - } - - internal override void ReadEX(ref ushort address, out byte data) - { - if (address >= 22528) - { - data = RAM[address & 3]; - } - else - { - data = 0; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - Switch08KCHR(address & 0x3F); - if ((address & 0x1000) == 4096) - { - Switch16KPRG((address >> 6) & 0x3F, PRGArea.Area8000); - Switch16KPRG((address >> 6) & 0x3F, PRGArea.AreaC000); - } - else - { - Switch32KPRG(((address >> 6) & 0x3F) >> 1, PRGArea.Area8000); - } - Switch01KNMTFromMirroring(((address & 0x2000) == 8192) ? Mirroring.Horz : Mirroring.Vert); - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(RAM); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - stream.Read(RAM, 0, RAM.Length); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper255.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper255.cs.meta deleted file mode 100644 index 2014a57..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mapper255.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 076b4701a252e1a4aab4efd4c5aede0b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MemReadAccess.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/MemReadAccess.cs deleted file mode 100644 index 35e5474..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MemReadAccess.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace MyNes.Core -{ - internal delegate void MemReadAccess(ref ushort addr, out byte value); -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MemReadAccess.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/MemReadAccess.cs.meta deleted file mode 100644 index 93f9e4f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MemReadAccess.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 71b28062ea32d1f41bc7a9b990155078 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MemWriteAccess.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/MemWriteAccess.cs deleted file mode 100644 index 2263c65..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MemWriteAccess.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace MyNes.Core -{ - internal delegate void MemWriteAccess(ref ushort addr, ref byte value); -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MemWriteAccess.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/MemWriteAccess.cs.meta deleted file mode 100644 index 1b3d5aa..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MemWriteAccess.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d731f056b42a0974bbee54ffc9333053 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mirroring.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mirroring.cs deleted file mode 100644 index 88547c9..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mirroring.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace MyNes.Core -{ - public enum Mirroring : byte - { - Horz = 80, - Vert = 68, - OneScA = 0, - OneScB = 85, - Full = 228 - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mirroring.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Mirroring.cs.meta deleted file mode 100644 index c033bb3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Mirroring.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f22679fb7ecffc440a9aaea88226619d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNesMain.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNesMain.cs deleted file mode 100644 index eeb781b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNesMain.cs +++ /dev/null @@ -1,219 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class MyNesMain - { - public static EmuSettings EmuSettings { get; private set; } - public static RendererSettings RendererSettings { get; private set; } - public static IExternalSupporter Supporter { get; private set; } - public static string WorkingFolder { get; private set; } - - internal static List Boards { get; private set; } - - public static IVideoProvider VideoProvider { get; private set; } - - public static IAudioProvider AudioProvider { get; private set; } - - public static WaveRecorder WaveRecorder { get; private set; } - - public static void Initialize(IExternalSupporter fileManager, IVideoProvider videoProvider, IAudioProvider audioProvider) - { - Tracer.WriteLine("Initializing My Nes Core ...."); - Supporter = fileManager; - WorkingFolder = fileManager.GetWorkingFolderPath(); - Tracer.WriteLine("Loading emu settings ..."); - EmuSettings = new EmuSettings(Path.Combine(WorkingFolder, "emusettings.ini")); - EmuSettings.LoadSettings(); - Tracer.WriteLine("Emu settings loaded successfully."); - Tracer.WriteLine("Loading renderer settings ..."); - RendererSettings = new RendererSettings(Path.Combine(WorkingFolder, "renderersettings.ini")); - RendererSettings.LoadSettings(); - Tracer.WriteLine("Renderer settings loaded successfully."); - Tracer.WriteLine("Locating boards and providers ..."); - WaveRecorder = new WaveRecorder(); - Boards = new List(); - - var allTypes = AppDomain.CurrentDomain - .GetAssemblies() - .SelectMany(ass => ass.GetTypes()); - - VideoProvider = videoProvider; - AudioProvider = audioProvider; - foreach (var type in allTypes) - { - if (type.IsSubclassOf(typeof(Board)) && !type.IsAbstract) - { - Board board = Activator.CreateInstance(type) as Board; - Boards.Add(board); - Tracer.WriteLine("Board added: " + board.Name + " [ Mapper " + board.MapperNumber + "]"); - } - } - - Tracer.WriteInformation("Done."); - Tracer.WriteInformation("Total of " + Boards.Count + " board found."); - SetVideoProvider(); - SetAudioProvider(); - SetRenderingMethods(); - - NesEmu.Initialize(); - } - - public static void Shutdown() - { - if (NesEmu.ON) - { - NesEmu.ShutDown(); - } - if (VideoProvider != null) - { - VideoProvider.ShutDown(); - } - if (AudioProvider != null) - { - AudioProvider.ShutDown(); - } - Tracer.WriteLine("Saving settings ..."); - EmuSettings.SaveSettings(); - RendererSettings.SaveSettings(); - Tracer.WriteLine("Settings saved successfully."); - Tracer.WriteLine("Exiting My Nes."); - } - - internal static bool IsBoardExist(int mapper) - { - foreach (Board board in Boards) - { - if (board.MapperNumber == mapper) - { - return true; - } - } - return false; - } - - internal static Board GetBoard(int mapper) - { - foreach (Board board in Boards) - { - if (board.MapperNumber == mapper) - { - return board; - } - } - return null; - } - - public static void MakeWorkingFolder() - { - WorkingFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "MyNes"); - Directory.CreateDirectory(WorkingFolder); - } - - public static BoardInfoObject[] GetBoardsList(bool includeUnsupportedMappers) - { - List list = new List(); - if (includeUnsupportedMappers) - { - for (int i = 0; i < 256; i++) - { - bool flag = false; - foreach (Board board in Boards) - { - if (board.MapperNumber == i) - { - BoardInfoObject boardInfoObject = new BoardInfoObject(); - boardInfoObject.Name = board.Name; - boardInfoObject.MapperNumber = board.MapperNumber; - boardInfoObject.IsSupported = true; - boardInfoObject.HasIssues = board.HasIssues; - boardInfoObject.Issues = board.Issues; - list.Add(boardInfoObject); - flag = true; - break; - } - } - if (!flag) - { - BoardInfoObject boardInfoObject2 = new BoardInfoObject(); - boardInfoObject2.Name = "N/A"; - boardInfoObject2.MapperNumber = i; - boardInfoObject2.IsSupported = false; - boardInfoObject2.HasIssues = false; - boardInfoObject2.Issues = ""; - list.Add(boardInfoObject2); - } - } - } - else - { - foreach (Board board2 in Boards) - { - if (board2.MapperNumber >= 0) - { - BoardInfoObject boardInfoObject3 = new BoardInfoObject(); - boardInfoObject3.Name = board2.Name; - boardInfoObject3.MapperNumber = board2.MapperNumber; - boardInfoObject3.IsSupported = true; - boardInfoObject3.HasIssues = board2.HasIssues; - boardInfoObject3.Issues = board2.Issues; - list.Add(boardInfoObject3); - } - } - } - return list.ToArray(); - } - - static void SetVideoProvider() - { - if (VideoProvider != null) VideoProvider.Initialize(); - else Tracer.WriteError("VideoProvider is null"); - } - - static void SetAudioProvider() - { - Tracer.WriteLine("Looking for the audio provider that set in the settings..."); - if (AudioProvider != null) AudioProvider.Initialize(); - else Tracer.WriteError("AudioProvider is null"); - } - - static void SetRenderingMethods() - { - if (VideoProvider != null && AudioProvider != null) - { - NesEmu.SetupRenderingMethods(VideoProvider.SubmitFrame, AudioProvider.SubmitSamples, AudioProvider.TogglePause, AudioProvider.GetIsPlaying); - } - else - { - Tracer.WriteError("ERROR: unable to setup rendering methods, one (or both) of the providers is not set (video and/or audio provider)"); - } - } - - public static void RecordWave() - { - if (NesEmu.ON && NesEmu.SoundEnabled) - { - string text = Path.Combine(EmuSettings.WavesFolder, Path.GetFileNameWithoutExtension(NesEmu.CurrentFilePath) + ".wav"); - int num = 0; - while (File.Exists(text)) - { - text = Path.Combine(EmuSettings.WavesFolder, Path.GetFileNameWithoutExtension(NesEmu.CurrentFilePath) + "_" + num + ".wav"); - num++; - } - WaveRecorder.Record(text, 1, 16, RendererSettings.Audio_Frequency); - } - else if (VideoProvider != null) - { - VideoProvider.WriteErrorNotification("Cannot record sound when the emu is off/sound is not enabled.", instant: false); - } - } - } - -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNesMain.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNesMain.cs.meta deleted file mode 100644 index 7be0a54..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNesMain.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2ef58a78e1bd9734bb820da2c5e1e471 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NTArea.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/NTArea.cs deleted file mode 100644 index d829d58..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NTArea.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyNes.Core -{ - internal enum NTArea : byte - { - Area2000NT0, - Area2400NT1, - Area2800NT2, - Area2C00NT3 - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NTArea.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/NTArea.cs.meta deleted file mode 100644 index 13480cb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NTArea.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c3f55745b33b3de4992cb06a69a1bbce -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NTSCPaletteGenerator.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/NTSCPaletteGenerator.cs deleted file mode 100644 index 356d7c2..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NTSCPaletteGenerator.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; - -namespace MyNes.Core -{ - public class NTSCPaletteGenerator - { - public const float default_saturation = 1.496f; - - public const float default_hue_tweak = 0f; - - public const float default_contrast = 1.016f; - - public const float default_brightness = 1.075f; - - public const float default_gamma = 1.975f; - - private const float black = 0.518f; - - private const float white = 1.962f; - - private const float attenuation = 0.746f; - - public static float saturation = 2f; - - public static float hue_tweak = 0f; - - public static float contrast = 1.4f; - - public static float brightness = 1.07f; - - public static float gamma = 2f; - - private static float[] levels = new float[8] { 0.35f, 0.518f, 0.962f, 1.55f, 1.094f, 1.506f, 1.962f, 1.962f }; - - private static int wave(int p, int color) - { - if ((color + p + 8) % 12 >= 6) - { - return 0; - } - return 1; - } - - private static float gammafix(float f, float gamma) - { - return (float)((f < 0f) ? 0.0 : Math.Pow(f, 2.2f / gamma)); - } - - private static int clamp(float v) - { - return (int)((v < 0f) ? 0f : ((v > 255f) ? 255f : v)); - } - - public static int MakeRGBcolor(int pixel) - { - int num = pixel & 0xF; - int num2 = ((num >= 14) ? 1 : ((pixel >> 4) & 3)); - float[] array = new float[2] - { - levels[num2 + ((num == 0) ? 4 : 0)], - levels[num2 + ((num <= 12) ? 4 : 0)] - }; - float num3 = 0f; - float num4 = 0f; - float num5 = 0f; - for (int i = 0; i < 12; i++) - { - float num6 = array[wave(i, num)]; - if ((((uint)pixel & 0x40u) != 0 && wave(i, 12) == 1) || (((uint)pixel & 0x80u) != 0 && wave(i, 4) == 1) || (((uint)pixel & 0x100u) != 0 && wave(i, 8) == 1)) - { - num6 *= 0.746f; - } - float num7 = (num6 - 0.518f) / 1.444f; - num7 = (num7 - 0.5f) * contrast + 0.5f; - num7 *= brightness / 12f; - num3 += num7; - num4 += (float)((double)num7 * Math.Cos(Math.PI / 6.0 * (double)((float)i + hue_tweak))); - num5 += (float)((double)num7 * Math.Sin(Math.PI / 6.0 * (double)((float)i + hue_tweak))); - } - num4 *= saturation; - num5 *= saturation; - return 65536 * clamp(255f * gammafix(num3 + 0.946882f * num4 + 0.623557f * num5, gamma)) + 256 * clamp(255f * gammafix(num3 - 245f / (328f * (float)Math.E) * num4 - 0.635691f * num5, gamma)) + clamp(255f * gammafix(num3 - 1.108545f * num4 + 1.709007f * num5, gamma)); - } - - public static int[] GeneratePalette() - { - int[] array = new int[512]; - for (int i = 0; i < 512; i++) - { - array[i] = MakeRGBcolor(i) | -16777216; - } - return array; - } - - public static int[] GeneratePaletteGBR() - { - int[] array = new int[512]; - for (int i = 0; i < 512; i++) - { - int num = MakeRGBcolor(i); - byte b = (byte)((num & 0xFF0000) >> 16); - byte b2 = (byte)((num & 0xFF00) >> 8); - byte b3 = (byte)((uint)num & 0xFFu); - array[i] = -16777216 | (b3 << 16) | (b2 << 8) | b; - } - return array; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NTSCPaletteGenerator.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/NTSCPaletteGenerator.cs.meta deleted file mode 100644 index e5cadd3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NTSCPaletteGenerator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 29be0f25cd887b349ab47194ae46b123 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106.cs deleted file mode 100644 index 9a44427..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106.cs +++ /dev/null @@ -1,557 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - [WithExternalSound] - internal abstract class Namcot106 : Board - { - private int irq_counter; - - private bool irq_enable; - - private bool disables_chr_ram_A; - - private bool disables_chr_ram_B; - - private bool enable_mirroring_switch; - - private bool enable_N106_sound; - - private int temp_nmt; - - private Namcot106Chnl[] sound_channels; - - private byte soundReg; - - public int enabledChannels; - - private int enabledChannels1; - - private int channelIndex; - - private byte temp_val; - - private byte temp_i; - - public byte[] EXRAM; - - private bool[] sound_channels_enable; - - private double soundOut; - - private int sound_out_div; - - internal override void HardReset() - { - base.HardReset(); - EXRAM = new byte[128]; - Switch08KPRG(PRG_ROM_08KB_Mask, PRGArea.AreaE000); - enable_mirroring_switch = (enable_N106_sound = base.MapperNumber == 19); - switch (SHA1.ToUpper()) - { - case "97E7E61EECB73CB1EA0C15AE51E65EA56301A685": - case "3D554F55411AB2DDD1A87E7583E643970DB784F3": - case "7FA51058307DB50825C2D3A3A98C0DA554BC3C92": - case "1C476C795CFC17E987C22FFD6F09BAF1396ED2C9": - enable_mirroring_switch = false; - enable_N106_sound = false; - break; - } - if (enable_N106_sound) - { - sound_channels = new Namcot106Chnl[8]; - sound_channels_enable = new bool[8]; - for (int i = 0; i < 8; i++) - { - sound_channels[i] = new Namcot106Chnl(this); - sound_channels[i].HardReset(); - } - soundReg = 0; - enabledChannels = 0; - channelIndex = 0; - APUApplyChannelsSettings(); - } - } - - internal override void WriteEX(ref ushort address, ref byte data) - { - switch (address & 0xF800) - { - case 18432: - if (soundReg >= 64) - { - switch (soundReg & 0x7F) - { - case 64: - sound_channels[0].WriteA(ref data); - break; - case 66: - sound_channels[0].WriteB(ref data); - break; - case 68: - sound_channels[0].WriteC(ref data); - break; - case 70: - sound_channels[0].WriteD(ref data); - break; - case 71: - sound_channels[0].WriteE(ref data); - break; - case 72: - sound_channels[1].WriteA(ref data); - break; - case 74: - sound_channels[1].WriteB(ref data); - break; - case 76: - sound_channels[1].WriteC(ref data); - break; - case 78: - sound_channels[1].WriteD(ref data); - break; - case 79: - sound_channels[1].WriteE(ref data); - break; - case 80: - sound_channels[2].WriteA(ref data); - break; - case 82: - sound_channels[2].WriteB(ref data); - break; - case 84: - sound_channels[2].WriteC(ref data); - break; - case 86: - sound_channels[2].WriteD(ref data); - break; - case 87: - sound_channels[2].WriteE(ref data); - break; - case 88: - sound_channels[3].WriteA(ref data); - break; - case 90: - sound_channels[3].WriteB(ref data); - break; - case 92: - sound_channels[3].WriteC(ref data); - break; - case 94: - sound_channels[3].WriteD(ref data); - break; - case 95: - sound_channels[3].WriteE(ref data); - break; - case 96: - sound_channels[4].WriteA(ref data); - break; - case 98: - sound_channels[4].WriteB(ref data); - break; - case 100: - sound_channels[4].WriteC(ref data); - break; - case 102: - sound_channels[4].WriteD(ref data); - break; - case 103: - sound_channels[4].WriteE(ref data); - break; - case 104: - sound_channels[5].WriteA(ref data); - break; - case 106: - sound_channels[5].WriteB(ref data); - break; - case 108: - sound_channels[5].WriteC(ref data); - break; - case 110: - sound_channels[5].WriteD(ref data); - break; - case 111: - sound_channels[5].WriteE(ref data); - break; - case 112: - sound_channels[6].WriteA(ref data); - break; - case 114: - sound_channels[6].WriteB(ref data); - break; - case 116: - sound_channels[6].WriteC(ref data); - break; - case 118: - sound_channels[6].WriteD(ref data); - break; - case 119: - sound_channels[6].WriteE(ref data); - break; - case 120: - sound_channels[7].WriteA(ref data); - break; - case 122: - sound_channels[7].WriteB(ref data); - break; - case 124: - sound_channels[7].WriteC(ref data); - break; - case 126: - sound_channels[7].WriteD(ref data); - break; - case 127: - sound_channels[7].WriteE(ref data); - enabledChannels = (data & 0x70) >> 4; - channelIndex = 0; - enabledChannels1 = enabledChannels + 1; - temp_i = 7; - while (temp_i >= 0 && enabledChannels1 > 0) - { - sound_channels[temp_i].Enabled = true; - enabledChannels1--; - temp_i--; - } - break; - } - } - EXRAM[soundReg & 0x7F] = data; - if ((soundReg & 0x80) == 128) - { - soundReg = (byte)(((uint)(soundReg + 1) & 0x7Fu) | 0x80u); - } - break; - case 20480: - NesEmu.IRQFlags &= -9; - irq_counter = (irq_counter & 0x7F00) | data; - break; - case 22528: - NesEmu.IRQFlags &= -9; - irq_counter = (irq_counter & 0xFF) | ((data & 0x7F) << 8); - irq_enable = (data & 0x80) == 128; - break; - } - } - - internal override void ReadEX(ref ushort address, out byte value) - { - switch (address & 0xF800) - { - case 18432: - value = EXRAM[soundReg & 0x7F]; - if ((soundReg & 0x80) == 128) - { - soundReg = (byte)(((uint)(soundReg + 1) & 0x7Fu) | 0x80u); - } - break; - case 20480: - NesEmu.IRQFlags &= -9; - value = (byte)((uint)irq_counter & 0xFFu); - break; - case 22528: - NesEmu.IRQFlags &= -9; - value = (byte)((irq_enable ? 128u : 0u) | (uint)((irq_counter & 0x7F00) >> 8)); - break; - default: - value = 0; - break; - } - } - - internal override void WritePRG(ref ushort address, ref byte data) - { - switch (address & 0xF800) - { - case 32768: - if (!disables_chr_ram_A) - { - Toggle01KCHR_RAM(data >= 224, CHRArea.Area0000); - Switch01KCHR((data >= 224) ? (data - 224) : data, CHRArea.Area0000); - } - else - { - Toggle01KCHR_RAM(ram: false, CHRArea.Area0000); - Switch01KCHR(data, CHRArea.Area0000); - } - break; - case 34816: - if (!disables_chr_ram_A) - { - Toggle01KCHR_RAM(data >= 224, CHRArea.Area0400); - Switch01KCHR((data >= 224) ? (data - 224) : data, CHRArea.Area0400); - } - else - { - Toggle01KCHR_RAM(ram: false, CHRArea.Area0400); - Switch01KCHR(data, CHRArea.Area0400); - } - break; - case 36864: - if (!disables_chr_ram_A) - { - Toggle01KCHR_RAM(data >= 224, CHRArea.Area0800); - Switch01KCHR((data >= 224) ? (data - 224) : data, CHRArea.Area0800); - } - else - { - Toggle01KCHR_RAM(ram: false, CHRArea.Area0800); - Switch01KCHR(data, CHRArea.Area0800); - } - break; - case 38912: - if (!disables_chr_ram_A) - { - Toggle01KCHR_RAM(data >= 224, CHRArea.Area0C00); - Switch01KCHR((data >= 224) ? (data - 224) : data, CHRArea.Area0C00); - } - else - { - Toggle01KCHR_RAM(ram: false, CHRArea.Area0C00); - Switch01KCHR(data, CHRArea.Area0C00); - } - break; - case 40960: - if (!disables_chr_ram_B) - { - Toggle01KCHR_RAM(data >= 224, CHRArea.Area1000); - Switch01KCHR((data >= 224) ? (data - 224) : data, CHRArea.Area1000); - } - else - { - Toggle01KCHR_RAM(ram: false, CHRArea.Area1000); - Switch01KCHR(data, CHRArea.Area1000); - } - break; - case 43008: - if (!disables_chr_ram_B) - { - Toggle01KCHR_RAM(data >= 224, CHRArea.Area1400); - Switch01KCHR((data >= 224) ? (data - 224) : data, CHRArea.Area1400); - } - else - { - Toggle01KCHR_RAM(ram: false, CHRArea.Area1400); - Switch01KCHR(data, CHRArea.Area1400); - } - break; - case 45056: - if (!disables_chr_ram_B) - { - Toggle01KCHR_RAM(data >= 224, CHRArea.Area1800); - Switch01KCHR((data >= 224) ? (data - 224) : data, CHRArea.Area1800); - } - else - { - Toggle01KCHR_RAM(ram: false, CHRArea.Area1800); - Switch01KCHR(data, CHRArea.Area1800); - } - break; - case 47104: - if (!disables_chr_ram_B) - { - Toggle01KCHR_RAM(data >= 224, CHRArea.Area1C00); - Switch01KCHR((data >= 224) ? (data - 224) : data, CHRArea.Area1C00); - } - else - { - Toggle01KCHR_RAM(ram: false, CHRArea.Area1C00); - Switch01KCHR(data, CHRArea.Area1C00); - } - break; - case 49152: - if (enable_mirroring_switch) - { - NMT_AREA_BLK_INDEX[0] = data; - } - break; - case 51200: - if (enable_mirroring_switch) - { - NMT_AREA_BLK_INDEX[1] = data; - } - break; - case 53248: - if (enable_mirroring_switch) - { - NMT_AREA_BLK_INDEX[2] = data; - } - break; - case 55296: - if (enable_mirroring_switch) - { - NMT_AREA_BLK_INDEX[3] = data; - } - break; - case 57344: - Switch08KPRG(data & 0x3F, PRGArea.Area8000); - break; - case 59392: - Switch08KPRG(data & 0x3F, PRGArea.AreaA000); - disables_chr_ram_A = (data & 0x40) == 64; - disables_chr_ram_B = (data & 0x80) == 128; - break; - case 61440: - Switch08KPRG(data & 0x3F, PRGArea.AreaC000); - break; - case 63488: - soundReg = data; - break; - } - } - - internal override void ReadNMT(ref ushort address, out byte data) - { - if (enable_mirroring_switch) - { - temp_nmt = NMT_AREA_BLK_INDEX[(address >> 10) & 3]; - if (temp_nmt >= 224) - { - data = NMT_RAM[(temp_nmt - 224) & 1][address & 0x3FF]; - } - else - { - data = CHR_ROM[temp_nmt][address & 0x3FF]; - } - } - else - { - base.ReadNMT(ref address, out data); - } - } - - internal override void WriteNMT(ref ushort address, ref byte data) - { - if (enable_mirroring_switch) - { - temp_nmt = NMT_AREA_BLK_INDEX[(address >> 10) & 3]; - if (temp_nmt >= 224) - { - NMT_RAM[(temp_nmt - 224) & 1][address & 0x3FF] = data; - } - } - else - { - base.WriteNMT(ref address, ref data); - } - } - - internal override void OnCPUClock() - { - if (irq_enable) - { - if (irq_counter == 32767) - { - NesEmu.IRQFlags |= 8; - irq_counter = 0; - } - else - { - irq_counter++; - } - } - } - - internal override void OnAPUClockSingle() - { - if (sound_channels != null) - { - for (int i = 0; i < sound_channels.Length; i++) - { - sound_channels[i].ClockSingle(); - } - } - } - - internal override double APUGetSample() - { - soundOut = 0.0; - sound_out_div = 0; - if (enabledChannels > 0) - { - for (int i = 0; i < sound_channels.Length; i++) - { - if (sound_channels[i].Enabled && sound_channels_enable[i]) - { - if (sound_channels[i].clocks > 0) - { - sound_channels[i].output = sound_channels[i].output_av / sound_channels[i].clocks; - } - sound_channels[i].clocks = (sound_channels[i].output_av = 0); - soundOut += sound_channels[i].output; - sound_out_div++; - } - } - soundOut = soundOut / 8.0 / 225.0; - } - return soundOut; - } - - internal override void APUApplyChannelsSettings() - { - base.APUApplyChannelsSettings(); - sound_channels_enable[0] = MyNesMain.RendererSettings.Audio_ChannelEnabled_NMT1; - sound_channels_enable[1] = MyNesMain.RendererSettings.Audio_ChannelEnabled_NMT2; - sound_channels_enable[2] = MyNesMain.RendererSettings.Audio_ChannelEnabled_NMT3; - sound_channels_enable[3] = MyNesMain.RendererSettings.Audio_ChannelEnabled_NMT4; - sound_channels_enable[4] = MyNesMain.RendererSettings.Audio_ChannelEnabled_NMT5; - sound_channels_enable[5] = MyNesMain.RendererSettings.Audio_ChannelEnabled_NMT6; - sound_channels_enable[6] = MyNesMain.RendererSettings.Audio_ChannelEnabled_NMT7; - sound_channels_enable[7] = MyNesMain.RendererSettings.Audio_ChannelEnabled_NMT8; - } - - internal override void WriteStateData(ref BinaryWriter stream) - { - base.WriteStateData(ref stream); - stream.Write(irq_counter); - stream.Write(irq_enable); - stream.Write(disables_chr_ram_A); - stream.Write(disables_chr_ram_B); - stream.Write(enable_mirroring_switch); - stream.Write(enable_N106_sound); - stream.Write(temp_nmt); - if (enable_N106_sound) - { - for (int i = 0; i < sound_channels.Length; i++) - { - sound_channels[i].SaveState(stream); - } - } - stream.Write(soundReg); - stream.Write(enabledChannels); - stream.Write(enabledChannels1); - stream.Write(channelIndex); - stream.Write(temp_val); - stream.Write(temp_i); - stream.Write(EXRAM); - } - - internal override void ReadStateData(ref BinaryReader stream) - { - base.ReadStateData(ref stream); - irq_counter = stream.ReadInt32(); - irq_enable = stream.ReadBoolean(); - disables_chr_ram_A = stream.ReadBoolean(); - disables_chr_ram_B = stream.ReadBoolean(); - enable_mirroring_switch = stream.ReadBoolean(); - enable_N106_sound = stream.ReadBoolean(); - temp_nmt = stream.ReadInt32(); - if (enable_N106_sound) - { - for (int i = 0; i < sound_channels.Length; i++) - { - sound_channels[i].LoadState(stream); - } - } - soundReg = stream.ReadByte(); - enabledChannels = stream.ReadInt32(); - enabledChannels1 = stream.ReadInt32(); - channelIndex = stream.ReadInt32(); - temp_val = stream.ReadByte(); - temp_i = stream.ReadByte(); - stream.Read(EXRAM, 0, EXRAM.Length); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106.cs.meta deleted file mode 100644 index c0890af..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dd8e287326f773a47afba9c9ca5dac87 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106Chnl.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106Chnl.cs deleted file mode 100644 index 945e7fd..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106Chnl.cs +++ /dev/null @@ -1,157 +0,0 @@ -using System.IO; - -namespace MyNes.Core -{ - internal class Namcot106Chnl - { - private Namcot106 namcot; - - private int freqTimer; - - private int frequency; - - public int output; - - public int output_av; - - public int clocks; - - private int cycles; - - private int InstrumentLength; - - private byte InstrumentAddress; - - private int startPoint; - - private int endPoint; - - private int readPoint; - - public int volume; - - private bool freez; - - public bool Enabled { get; set; } - - public Namcot106Chnl(Namcot106 namcot) - { - this.namcot = namcot; - } - - public void HardReset() - { - } - - private void UpdateFrequency() - { - if (frequency > 0) - { - freqTimer = 983040 * (namcot.enabledChannels + 1) / frequency; - freez = false; - } - else - { - freez = true; - output_av = 0; - } - } - - private void UpdatePlaybackParameters() - { - startPoint = InstrumentAddress; - endPoint = InstrumentAddress + 4 * (8 - InstrumentLength); - readPoint = InstrumentAddress; - } - - public void WriteA(ref byte data) - { - frequency = (frequency & 0xFFFF00) | data; - UpdateFrequency(); - } - - public void WriteB(ref byte data) - { - frequency = (frequency & 0xFF00FF) | (data << 8); - UpdateFrequency(); - } - - public void WriteC(ref byte data) - { - frequency = (frequency & 0xFFFF) | ((data & 3) << 12); - InstrumentLength = (data >> 2) & 7; - UpdateFrequency(); - UpdatePlaybackParameters(); - } - - public void WriteD(ref byte data) - { - InstrumentAddress = data; - UpdatePlaybackParameters(); - } - - public void WriteE(ref byte data) - { - volume = data & 0xF; - } - - public void ClockSingle() - { - if (freez || --cycles > 0) - { - return; - } - cycles = freqTimer; - if (readPoint >= startPoint && readPoint <= endPoint) - { - if (Enabled && !freez) - { - if ((readPoint & 1) == 0) - { - output_av += (namcot.EXRAM[readPoint] & 0xF) * volume; - } - else - { - output_av += ((namcot.EXRAM[readPoint] >> 4) & 0xF) * volume; - } - } - readPoint++; - } - else - { - readPoint = startPoint; - } - clocks++; - } - - public void SaveState(BinaryWriter stream) - { - stream.Write(freqTimer); - stream.Write(frequency); - stream.Write(output); - stream.Write(cycles); - stream.Write(InstrumentLength); - stream.Write(InstrumentAddress); - stream.Write(startPoint); - stream.Write(endPoint); - stream.Write(readPoint); - stream.Write(volume); - stream.Write(freez); - } - - public void LoadState(BinaryReader stream) - { - freqTimer = stream.ReadInt32(); - frequency = stream.ReadInt32(); - output = stream.ReadByte(); - cycles = stream.ReadInt32(); - InstrumentLength = stream.ReadInt32(); - InstrumentAddress = stream.ReadByte(); - startPoint = stream.ReadInt32(); - endPoint = stream.ReadInt32(); - readPoint = stream.ReadInt32(); - volume = stream.ReadInt32(); - freez = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106Chnl.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106Chnl.cs.meta deleted file mode 100644 index 86980e7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Namcot106Chnl.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 609941ad8b89ba84c81aab729de7eded -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabase.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabase.cs deleted file mode 100644 index cf42c2e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabase.cs +++ /dev/null @@ -1,331 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using System.Xml; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class NesCartDatabase - { - private static List _databaseRoms = new List(); - - public static string DBVersion = ""; - - public static string DBConformance = ""; - - public static string DBAgent = ""; - - public static string DBAuthor = ""; - - public static string DBTimeStamp = ""; - - public static bool Ready = false; - - public static List DatabaseRoms => _databaseRoms; - - public static void LoadDatabase(out bool success) - { - success = false; - Ready = false; - _databaseRoms.Clear(); - - var stream = MyNesMain.Supporter.OpenDatabaseFile(); - XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); - xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore; - xmlReaderSettings.IgnoreWhitespace = true; - XmlReader xmlReader = XmlReader.Create(stream, xmlReaderSettings); - NesCartDatabaseGameInfo nesCartDatabaseGameInfo = default(NesCartDatabaseGameInfo); - nesCartDatabaseGameInfo.Cartridges = new List(); - nesCartDatabaseGameInfo.Game_AltName = ""; - nesCartDatabaseGameInfo.Game_Catalog = ""; - nesCartDatabaseGameInfo.Game_Class = ""; - nesCartDatabaseGameInfo.Game_Developer = ""; - nesCartDatabaseGameInfo.Game_Name = ""; - nesCartDatabaseGameInfo.Game_Players = ""; - nesCartDatabaseGameInfo.Game_Publisher = ""; - nesCartDatabaseGameInfo.Game_Region = ""; - nesCartDatabaseGameInfo.Game_ReleaseDate = ""; - while (xmlReader.Read()) - { - if ((xmlReader.Name == "xml") & xmlReader.IsStartElement()) - { - if (xmlReader.MoveToAttribute("version")) - { - DBVersion = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("conformance")) - { - DBConformance = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("agent")) - { - DBAgent = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("author")) - { - DBAuthor = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("timestamp")) - { - DBTimeStamp = xmlReader.Value; - } - } - else - { - if (!((xmlReader.Name == "game") & xmlReader.IsStartElement())) - { - continue; - } - nesCartDatabaseGameInfo = default(NesCartDatabaseGameInfo); - if (xmlReader.MoveToAttribute("name")) - { - nesCartDatabaseGameInfo.Game_Name = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("altname")) - { - nesCartDatabaseGameInfo.Game_AltName = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("class")) - { - nesCartDatabaseGameInfo.Game_Class = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("catalog")) - { - nesCartDatabaseGameInfo.Game_Catalog = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("publisher")) - { - nesCartDatabaseGameInfo.Game_Publisher = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("developer")) - { - nesCartDatabaseGameInfo.Game_Developer = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("region")) - { - nesCartDatabaseGameInfo.Game_Region = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("players")) - { - nesCartDatabaseGameInfo.Game_Players = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("date")) - { - nesCartDatabaseGameInfo.Game_ReleaseDate = xmlReader.Value; - } - NesCartDatabaseCartridgeInfo nesCartDatabaseCartridgeInfo = new NesCartDatabaseCartridgeInfo(); - nesCartDatabaseCartridgeInfo.PAD_h = ""; - nesCartDatabaseCartridgeInfo.PAD_v = ""; - nesCartDatabaseCartridgeInfo.PRG_crc = ""; - nesCartDatabaseCartridgeInfo.PRG_name = ""; - nesCartDatabaseCartridgeInfo.PRG_sha1 = ""; - nesCartDatabaseCartridgeInfo.PRG_size = ""; - nesCartDatabaseCartridgeInfo.chip_type = new List(); - nesCartDatabaseCartridgeInfo.CHR_crc = ""; - nesCartDatabaseCartridgeInfo.CHR_name = ""; - nesCartDatabaseCartridgeInfo.CHR_sha1 = ""; - nesCartDatabaseCartridgeInfo.CHR_size = ""; - nesCartDatabaseCartridgeInfo.CIC_type = ""; - nesCartDatabaseCartridgeInfo.Board_Mapper = ""; - nesCartDatabaseCartridgeInfo.Board_Pcb = ""; - nesCartDatabaseCartridgeInfo.Board_Type = ""; - nesCartDatabaseCartridgeInfo.VRAM_sizes = new List(); - nesCartDatabaseCartridgeInfo.WRAMBanks = new List(); - while (xmlReader.Read()) - { - if ((xmlReader.Name == "game") & !xmlReader.IsStartElement()) - { - _databaseRoms.Add(nesCartDatabaseGameInfo); - break; - } - if ((xmlReader.Name == "cartridge") & xmlReader.IsStartElement()) - { - if (nesCartDatabaseGameInfo.Cartridges == null) - { - nesCartDatabaseGameInfo.Cartridges = new List(); - } - nesCartDatabaseCartridgeInfo = new NesCartDatabaseCartridgeInfo(); - nesCartDatabaseCartridgeInfo.PAD_h = ""; - nesCartDatabaseCartridgeInfo.PAD_v = ""; - nesCartDatabaseCartridgeInfo.PRG_crc = ""; - nesCartDatabaseCartridgeInfo.PRG_name = ""; - nesCartDatabaseCartridgeInfo.PRG_sha1 = ""; - nesCartDatabaseCartridgeInfo.PRG_size = ""; - nesCartDatabaseCartridgeInfo.chip_type = new List(); - nesCartDatabaseCartridgeInfo.CHR_crc = ""; - nesCartDatabaseCartridgeInfo.CHR_name = ""; - nesCartDatabaseCartridgeInfo.CHR_sha1 = ""; - nesCartDatabaseCartridgeInfo.CHR_size = ""; - nesCartDatabaseCartridgeInfo.CIC_type = ""; - nesCartDatabaseCartridgeInfo.Board_Mapper = ""; - nesCartDatabaseCartridgeInfo.Board_Pcb = ""; - nesCartDatabaseCartridgeInfo.Board_Type = ""; - nesCartDatabaseCartridgeInfo.VRAM_sizes = new List(); - nesCartDatabaseCartridgeInfo.WRAMBanks = new List(); - if (xmlReader.MoveToAttribute("system")) - { - nesCartDatabaseCartridgeInfo.System = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("crc")) - { - nesCartDatabaseCartridgeInfo.CRC = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("sha1")) - { - nesCartDatabaseCartridgeInfo.SHA1 = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("dump")) - { - nesCartDatabaseCartridgeInfo.Dump = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("dumper")) - { - nesCartDatabaseCartridgeInfo.Dumper = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("datedumped")) - { - nesCartDatabaseCartridgeInfo.DateDumped = xmlReader.Value; - } - } - else if ((xmlReader.Name == "cartridge") & !xmlReader.IsStartElement()) - { - nesCartDatabaseGameInfo.Cartridges.Add(nesCartDatabaseCartridgeInfo); - } - else if ((xmlReader.Name == "board") & xmlReader.IsStartElement()) - { - if (xmlReader.MoveToAttribute("type")) - { - nesCartDatabaseCartridgeInfo.Board_Type = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("pcb")) - { - nesCartDatabaseCartridgeInfo.Board_Pcb = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("mapper")) - { - nesCartDatabaseCartridgeInfo.Board_Mapper = xmlReader.Value; - } - } - else if ((xmlReader.Name == "prg") & xmlReader.IsStartElement()) - { - if (xmlReader.MoveToAttribute("name")) - { - nesCartDatabaseCartridgeInfo.PRG_name = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("size")) - { - nesCartDatabaseCartridgeInfo.PRG_size = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("crc")) - { - nesCartDatabaseCartridgeInfo.PRG_crc = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("sha1")) - { - nesCartDatabaseCartridgeInfo.PRG_sha1 = xmlReader.Value; - } - } - else if ((xmlReader.Name == "chr") & xmlReader.IsStartElement()) - { - if (xmlReader.MoveToAttribute("name")) - { - nesCartDatabaseCartridgeInfo.CHR_name = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("size")) - { - nesCartDatabaseCartridgeInfo.CHR_size = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("crc")) - { - nesCartDatabaseCartridgeInfo.CHR_crc = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("sha1")) - { - nesCartDatabaseCartridgeInfo.CHR_sha1 = xmlReader.Value; - } - } - else if ((xmlReader.Name == "vram") & xmlReader.IsStartElement()) - { - if (xmlReader.MoveToAttribute("size")) - { - nesCartDatabaseCartridgeInfo.VRAM_sizes.Add(xmlReader.Value); - } - } - else if ((xmlReader.Name == "wram") & xmlReader.IsStartElement()) - { - string sIZE = ""; - bool bATTERY = false; - int result = 0; - if (xmlReader.MoveToAttribute("size")) - { - sIZE = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("battery")) - { - bATTERY = xmlReader.Value == "1"; - } - if (xmlReader.MoveToAttribute("id")) - { - int.TryParse(xmlReader.Value, out result); - } - nesCartDatabaseCartridgeInfo.WRAMBanks.Add(new SRAMBankInfo(result, sIZE, bATTERY)); - } - else if ((xmlReader.Name == "chip") & xmlReader.IsStartElement()) - { - if (xmlReader.MoveToAttribute("type")) - { - if (nesCartDatabaseCartridgeInfo.chip_type == null) - { - nesCartDatabaseCartridgeInfo.chip_type = new List(); - } - nesCartDatabaseCartridgeInfo.chip_type.Add(xmlReader.Value); - } - } - else if ((xmlReader.Name == "cic") & xmlReader.IsStartElement()) - { - if (xmlReader.MoveToAttribute("type")) - { - nesCartDatabaseCartridgeInfo.CIC_type = xmlReader.Value; - } - } - else if ((xmlReader.Name == "pad") & xmlReader.IsStartElement()) - { - if (xmlReader.MoveToAttribute("h")) - { - nesCartDatabaseCartridgeInfo.PAD_h = xmlReader.Value; - } - if (xmlReader.MoveToAttribute("v")) - { - nesCartDatabaseCartridgeInfo.PAD_v = xmlReader.Value; - } - } - } - } - } - Ready = true; - success = true; - xmlReader.Close(); - stream.Close(); - } - - public static NesCartDatabaseGameInfo Find(string Cart_sha1, out bool found) - { - found = false; - foreach (NesCartDatabaseGameInfo databaseRom in _databaseRoms) - { - foreach (NesCartDatabaseCartridgeInfo cartridge in databaseRom.Cartridges) - { - if (cartridge.SHA1.ToLower() == Cart_sha1.ToLower()) - { - found = true; - return databaseRom; - } - } - } - return default(NesCartDatabaseGameInfo); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabase.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabase.cs.meta deleted file mode 100644 index 513535b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabase.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3e7570468c0a69b41b986d9624f1e8ac -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseCartridgeInfo.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseCartridgeInfo.cs deleted file mode 100644 index 3759c2c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseCartridgeInfo.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System.Collections.Generic; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class NesCartDatabaseCartridgeInfo - { - public string System; - - public string CRC; - - public string SHA1; - - public string Dump; - - public string Dumper; - - public string DateDumped; - - public string Board_Type; - - public string Board_Pcb; - - public string Board_Mapper; - - public List VRAM_sizes; - - public List WRAMBanks; - - public string PRG_name; - - public string PRG_size; - - public string PRG_crc; - - public string PRG_sha1; - - public string CHR_name; - - public string CHR_size; - - public string CHR_crc; - - public string CHR_sha1; - - public List chip_type; - - public string CIC_type; - - public string PAD_h; - - public string PAD_v; - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseCartridgeInfo.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseCartridgeInfo.cs.meta deleted file mode 100644 index 115630f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseCartridgeInfo.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 6bd7965d8d1e7144995a612d1a42d260 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseGameInfo.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseGameInfo.cs deleted file mode 100644 index ee111ea..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseGameInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Collections.Generic; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public struct NesCartDatabaseGameInfo - { - public string Game_Name; - - public string Game_AltName; - - public string Game_Class; - - public string Game_Catalog; - - public string Game_Publisher; - - public string Game_Developer; - - public string Game_Region; - - public string Game_Players; - - public string Game_ReleaseDate; - - public List Cartridges; - - public static NesCartDatabaseGameInfo Empty => default(NesCartDatabaseGameInfo); - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseGameInfo.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseGameInfo.cs.meta deleted file mode 100644 index ea2beb7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesCartDatabaseGameInfo.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 304f3d587a65dad48a326a1431d975e1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesEmu.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/NesEmu.cs deleted file mode 100644 index 8b2e57e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesEmu.cs +++ /dev/null @@ -1,5750 +0,0 @@ -using Google.Protobuf.WellKnownTypes; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Threading; -using System.Xml; -using Unity.IL2CPP.CompilerServices; -using Option = Unity.IL2CPP.CompilerServices.Option; - - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class NesEmu - { - [StructLayout(LayoutKind.Explicit)] - private struct CPURegister - { - [FieldOffset(0)] - internal byte l; - - [FieldOffset(1)] - internal byte h; - - [FieldOffset(0)] - internal ushort v; - } - - private enum RequestMode - { - None, - HardReset, - SoftReset, - LoadState, - SaveState, - TakeSnapshot - } - - private static int[][] dmc_freq_table = new int[3][] - { - new int[16] - { - 428, 380, 340, 320, 286, 254, 226, 214, 190, 160, - 142, 128, 106, 84, 72, 54 - }, - new int[16] - { - 398, 354, 316, 298, 276, 236, 210, 198, 176, 148, - 132, 118, 98, 78, 66, 50 - }, - new int[16] - { - 428, 380, 340, 320, 286, 254, 226, 214, 190, 160, - 142, 128, 106, 84, 72, 54 - } - }; - - private static int dmc_output_a; - - private static int dmc_output; - - private static int dmc_period_devider; - - private static bool dmc_irq_enabled; - - private static bool dmc_loop_flag; - - private static byte dmc_rate_index; - - private static ushort dmc_addr_refresh; - - private static int dmc_size_refresh; - - private static bool dmc_dmaEnabled; - - private static byte dmc_dmaByte; - - private static int dmc_dmaBits; - - private static bool dmc_bufferFull; - - private static byte dmc_dmaBuffer; - - private static int dmc_dmaSize; - - private static ushort dmc_dmaAddr; - - private static ushort[][] nos_freq_table = new ushort[3][] - { - new ushort[16] - { - 4, 8, 16, 32, 64, 96, 128, 160, 202, 254, - 380, 508, 762, 1016, 2034, 4068 - }, - new ushort[16] - { - 4, 7, 14, 30, 60, 88, 118, 148, 188, 236, - 354, 472, 708, 944, 1890, 3778 - }, - new ushort[16] - { - 4, 8, 16, 32, 64, 96, 128, 160, 202, 254, - 380, 508, 762, 1016, 2034, 4068 - } - }; - - private static bool nos_length_halt; - - private static bool nos_constant_volume_envelope; - - private static byte nos_volume_devider_period; - - private static ushort nos_timer; - - private static bool nos_mode; - - private static int nos_period_devider; - - private static bool nos_length_enabled; - - private static int nos_length_counter; - - private static bool nos_envelope_start_flag; - - private static byte nos_envelope_devider; - - private static byte nos_envelope_decay_level_counter; - - private static byte nos_envelope; - - private static int nos_output; - - private static int nos_shift_reg; - - private static int nos_feedback; - - private static bool nos_ignore_reload; - - private static readonly byte[][] sq_duty_cycle_sequences = new byte[4][] - { - new byte[8] { 0, 0, 0, 0, 0, 0, 0, 1 }, - new byte[8] { 0, 0, 0, 0, 0, 0, 1, 1 }, - new byte[8] { 0, 0, 0, 0, 1, 1, 1, 1 }, - new byte[8] { 1, 1, 1, 1, 1, 1, 0, 0 } - }; - - private static readonly byte[] sq_duration_table = new byte[32] - { - 10, 254, 20, 2, 40, 4, 80, 6, 160, 8, - 60, 10, 14, 12, 26, 14, 12, 16, 24, 18, - 48, 20, 96, 22, 192, 24, 72, 26, 16, 28, - 32, 30 - }; - - private static byte sq1_duty_cycle; - - private static bool sq1_length_halt; - - private static bool sq1_constant_volume_envelope; - - private static byte sq1_volume_devider_period; - - private static bool sq1_sweep_enable; - - private static byte sq1_sweep_devider_period; - - private static bool sq1_sweep_negate; - - private static byte sq1_sweep_shift_count; - - private static int sq1_timer; - - private static int sq1_period_devider; - - private static byte sq1_seqencer; - - private static bool sq1_length_enabled; - - private static int sq1_length_counter; - - private static bool sq1_envelope_start_flag; - - private static byte sq1_envelope_devider; - - private static byte sq1_envelope_decay_level_counter; - - private static byte sq1_envelope; - - private static int sq1_sweep_counter; - - private static bool sq1_sweep_reload; - - private static int sq1_sweep_change; - - private static bool sq1_valid_freq; - - private static int sq1_output; - - private static bool sq1_ignore_reload; - - private static readonly byte[] trl_step_seq = new byte[32] - { - 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, - 5, 4, 3, 2, 1, 0, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15 - }; - - private static bool trl_liner_control_flag; - - private static byte trl_liner_control_reload; - - private static ushort trl_timer; - - private static bool trl_length_enabled; - - private static byte trl_length_counter; - - private static bool trl_liner_control_reload_flag; - - private static byte trl_liner_counter; - - private static int trl_output; - - private static int trl_period_devider; - - private static int trl_step; - - private static bool trl_ignore_reload; - - private static byte apu_reg_io_db; - - private static byte apu_reg_io_addr; - - private static bool apu_reg_access_happened; - - private static bool apu_reg_access_w; - - private static Action[] apu_reg_update_func; - - private static Action[] apu_reg_read_func; - - private static Action[] apu_reg_write_func; - - private static Action apu_update_playback_func; - - private static bool apu_odd_cycle; - - private static bool apu_irq_enabled; - - private static bool apu_irq_flag; - - internal static bool apu_irq_delta_occur; - - private static bool apu_seq_mode; - - private static int apu_ferq_f; - - private static int apu_ferq_l; - - private static int apu_ferq_e; - - private static int apu_cycle_f; - - private static int apu_cycle_f_t; - - private static int apu_cycle_e; - - private static int apu_cycle_l; - - private static bool apu_odd_l; - - private static bool apu_check_irq; - - private static bool apu_do_env; - - private static bool apu_do_length; - - public static bool SoundEnabled; - - public static double audio_playback_amplitude = 1.5; - - public static int audio_playback_peek_limit = 124; - - private static bool audio_playback_dac_initialized; - - public static int cpu_speed; - - private static short[] audio_samples; - - private static int audio_w_pos; - - private static int audio_samples_added; - - internal static int audio_samples_count; - - private static int[][][][][] mix_table; - - private static double audio_x; - - private static double audio_y; - - private static double audio_y_av; - - private static double audio_y_timer; - - public static double audio_timer_ratio = 40.0; - - private static double audio_timer; - - private static SoundLowPassFilter audio_low_pass_filter_14K; - - private static SoundHighPassFilter audio_high_pass_filter_90; - - private static SoundHighPassFilter audio_high_pass_filter_440; - - private static bool audio_sq1_outputable; - - private static bool audio_sq2_outputable; - - private static bool audio_nos_outputable; - - private static bool audio_trl_outputable; - - private static bool audio_dmc_outputable; - - private static bool audio_signal_outputed; - - private static bool apu_use_external_sound; - - private static CPURegister cpu_reg_pc; - - private static CPURegister cpu_reg_sp; - - private static CPURegister cpu_reg_ea; - - private static byte cpu_reg_a; - - private static byte cpu_reg_x; - - private static byte cpu_reg_y; - - private static bool cpu_flag_n; - - private static bool cpu_flag_v; - - private static bool cpu_flag_d; - - private static bool cpu_flag_i; - - private static bool cpu_flag_z; - - private static bool cpu_flag_c; - - private static byte cpu_m; - - private static byte cpu_opcode; - - private static byte cpu_byte_temp; - - private static int cpu_int_temp; - - private static int cpu_int_temp1; - - private static byte cpu_dummy; - - private static bool cpu_bool_tmp; - - private static CPURegister temp_add; - - private static bool CPU_IRQ_PIN; - - private static bool CPU_NMI_PIN; - - private static bool cpu_suspend_nmi; - - private static bool cpu_suspend_irq; - - private static Action[] cpu_addressings; - - private static Action[] cpu_instructions; - - private static int dma_DMCDMAWaitCycles; - - private static int dma_OAMDMAWaitCycles; - - private static bool dma_isOamDma; - - private static int dma_oamdma_i; - - private static bool dma_DMCOn; - - private static bool dma_OAMOn; - - private static bool dma_DMC_occurring; - - private static bool dma_OAM_occurring; - - private static int dma_OAMFinishCounter; - - private static ushort dma_Oamaddress; - - private static int dma_OAMCYCLE; - - private static byte dma_latch; - - private static byte dma_dummy; - - private static ushort reg_2004; - - internal static int IRQFlags = 0; - - private static bool PPU_NMI_Current; - - private static bool PPU_NMI_Old; - - private const int IRQ_APU = 1; - - internal const int IRQ_DMC = 2; - - internal const int IRQ_BOARD = 8; - - private static ushort InterruptVector; - - private static byte[] mem_wram; - - internal static Board mem_board; - - private static MemReadAccess[] mem_read_accesses; - - private static MemWriteAccess[] mem_write_accesses; - - private static bool BUS_RW; - - private static ushort BUS_ADDRESS; - - private static string SRAMFileName; - - public static string GMFileName; - - private static int PORT0; - - private static int PORT1; - - private static int inputStrobe; - - private static IJoypadConnecter joypad1; - - private static IJoypadConnecter joypad2; - - private static IJoypadConnecter joypad3; - - private static IJoypadConnecter joypad4; - - public static bool IsFourPlayers; - - private static readonly byte[] reverseLookup = new byte[256] - { - 0, 128, 64, 192, 32, 160, 96, 224, 16, 144, - 80, 208, 48, 176, 112, 240, 8, 136, 72, 200, - 40, 168, 104, 232, 24, 152, 88, 216, 56, 184, - 120, 248, 4, 132, 68, 196, 36, 164, 100, 228, - 20, 148, 84, 212, 52, 180, 116, 244, 12, 140, - 76, 204, 44, 172, 108, 236, 28, 156, 92, 220, - 60, 188, 124, 252, 2, 130, 66, 194, 34, 162, - 98, 226, 18, 146, 82, 210, 50, 178, 114, 242, - 10, 138, 74, 202, 42, 170, 106, 234, 26, 154, - 90, 218, 58, 186, 122, 250, 6, 134, 70, 198, - 38, 166, 102, 230, 22, 150, 86, 214, 54, 182, - 118, 246, 14, 142, 78, 206, 46, 174, 110, 238, - 30, 158, 94, 222, 62, 190, 126, 254, 1, 129, - 65, 193, 33, 161, 97, 225, 17, 145, 81, 209, - 49, 177, 113, 241, 9, 137, 73, 201, 41, 169, - 105, 233, 25, 153, 89, 217, 57, 185, 121, 249, - 5, 133, 69, 197, 37, 165, 101, 229, 21, 149, - 85, 213, 53, 181, 117, 245, 13, 141, 77, 205, - 45, 173, 109, 237, 29, 157, 93, 221, 61, 189, - 125, 253, 3, 131, 67, 195, 35, 163, 99, 227, - 19, 147, 83, 211, 51, 179, 115, 243, 11, 139, - 75, 203, 43, 171, 107, 235, 27, 155, 91, 219, - 59, 187, 123, 251, 7, 135, 71, 199, 39, 167, - 103, 231, 23, 151, 87, 215, 55, 183, 119, 247, - 15, 143, 79, 207, 47, 175, 111, 239, 31, 159, - 95, 223, 63, 191, 127, 255 - }; - - private static Action[] ppu_v_clocks; - - private static Action[] ppu_h_clocks; - - private static Action[] ppu_bkg_fetches; - - private static Action[] ppu_spr_fetches; - - private static Action[] ppu_oam_phases; - - private static int[] ppu_bkg_pixels; - - private static int[] ppu_spr_pixels; - - private static int[] ppu_screen_pixels; - - private static int[] ppu_palette; - - private static int ppu_clock_h; - - internal static ushort ppu_clock_v; - - private static ushort ppu_clock_vblank_start; - - private static ushort ppu_clock_vblank_end; - - private static bool ppu_use_odd_cycle; - - private static bool ppu_use_odd_swap; - - private static bool ppu_odd_swap_done; - - private static bool ppu_is_nmi_time; - - private static bool ppu_frame_finished; - - private static byte[] ppu_oam_bank; - - private static byte[] ppu_oam_bank_secondary; - - private static byte[] ppu_palette_bank; - - private static byte ppu_reg_io_db; - - private static byte ppu_reg_io_addr; - - private static bool ppu_reg_access_happened; - - private static bool ppu_reg_access_w; - - private static Action[] ppu_reg_update_func; - - private static Action[] ppu_reg_read_func; - - private static byte ppu_reg_2000_vram_address_increament; - - private static ushort ppu_reg_2000_sprite_pattern_table_address_for_8x8_sprites; - - private static ushort ppu_reg_2000_background_pattern_table_address; - - internal static byte ppu_reg_2000_Sprite_size; - - private static bool ppu_reg_2000_VBI; - - private static bool ppu_reg_2001_show_background_in_leftmost_8_pixels_of_screen; - - private static bool ppu_reg_2001_show_sprites_in_leftmost_8_pixels_of_screen; - - private static bool ppu_reg_2001_show_background; - - private static bool ppu_reg_2001_show_sprites; - - private static int ppu_reg_2001_grayscale; - - private static int ppu_reg_2001_emphasis; - - private static bool ppu_reg_2002_SpriteOverflow; - - private static bool ppu_reg_2002_Sprite0Hit; - - private static bool ppu_reg_2002_VblankStartedFlag; - - private static byte ppu_reg_2003_oam_addr; - - private static ushort ppu_vram_addr; - - private static byte ppu_vram_data; - - private static ushort ppu_vram_addr_temp; - - private static ushort ppu_vram_addr_access_temp; - - private static bool ppu_vram_flip_flop; - - private static byte ppu_vram_finex; - - private static ushort ppu_bkgfetch_nt_addr; - - private static byte ppu_bkgfetch_nt_data; - - private static ushort ppu_bkgfetch_at_addr; - - private static byte ppu_bkgfetch_at_data; - - private static ushort ppu_bkgfetch_lb_addr; - - private static byte ppu_bkgfetch_lb_data; - - private static ushort ppu_bkgfetch_hb_addr; - - private static byte ppu_bkgfetch_hb_data; - - private static int ppu_sprfetch_slot; - - private static byte ppu_sprfetch_y_data; - - private static byte ppu_sprfetch_t_data; - - private static byte ppu_sprfetch_at_data; - - private static byte ppu_sprfetch_x_data; - - private static ushort ppu_sprfetch_lb_addr; - - private static byte ppu_sprfetch_lb_data; - - private static ushort ppu_sprfetch_hb_addr; - - private static byte ppu_sprfetch_hb_data; - - internal static bool ppu_is_sprfetch; - - private static int ppu_bkg_render_i; - - private static int ppu_bkg_render_pos; - - private static int ppu_bkg_render_tmp_val; - - private static int ppu_bkg_current_pixel; - - private static int ppu_spr_current_pixel; - - private static int ppu_current_pixel; - - private static int ppu_render_x; - - private static int ppu_render_y; - - private static byte ppu_oamev_n; - - private static byte ppu_oamev_m; - - private static bool ppu_oamev_compare; - - private static byte ppu_oamev_slot; - - private static byte ppu_fetch_data; - - private static byte ppu_phase_index; - - private static bool ppu_sprite0_should_hit; - - private static int ppu_temp_comparator; - - public static bool ON; - - public static bool PAUSED; - - public static bool isPaused; - - public static string CurrentFilePath; - - public static bool FrameLimiterEnabled; - - private static Thread mainThread; - - private static double fps_time_period; - - private static double emu_time_target_fps = 60.0; - - private static bool render_initialized; - - private static RenderVideoFrame render_video; - - private static RenderAudioSamples render_audio; - - private static TogglePause render_audio_toggle_pause; - - private static GetIsPlaying render_audio_get_is_playing; - - private static bool render_audio_is_playing; - - public static EmuRegion Region; - - private static int SystemIndex; - - private static RequestMode emu_request_mode = RequestMode.None; - - public static bool FrameSkipEnabled; - - public static int FrameSkipInterval; - - private static int FrameSkipCounter; - - private static byte sq2_duty_cycle; - - private static bool sq2_length_halt; - - private static bool sq2_constant_volume_envelope; - - private static byte sq2_volume_devider_period; - - private static bool sq2_sweep_enable; - - private static byte sq2_sweep_devider_period; - - private static bool sq2_sweep_negate; - - private static byte sq2_sweep_shift_count; - - private static int sq2_timer; - - private static int sq2_period_devider; - - private static byte sq2_seqencer; - - private static bool sq2_length_enabled; - - private static int sq2_length_counter; - - private static bool sq2_envelope_start_flag; - - private static byte sq2_envelope_devider; - - private static byte sq2_envelope_decay_level_counter; - - private static byte sq2_envelope; - - private static int sq2_sweep_counter; - - private static bool sq2_sweep_reload; - - private static int sq2_sweep_change; - - private static bool sq2_valid_freq; - - private static int sq2_output; - - private static bool sq2_ignore_reload; - - private static byte register_p - { - get - { - return (byte)((cpu_flag_n ? 128u : 0u) | (cpu_flag_v ? 64u : 0u) | (cpu_flag_d ? 8u : 0u) | (cpu_flag_i ? 4u : 0u) | (cpu_flag_z ? 2u : 0u) | (cpu_flag_c ? 1u : 0u) | 0x20u); - } - set - { - cpu_flag_n = (value & 0x80) != 0; - cpu_flag_v = (value & 0x40) != 0; - cpu_flag_d = (value & 8) != 0; - cpu_flag_i = (value & 4) != 0; - cpu_flag_z = (value & 2) != 0; - cpu_flag_c = (value & 1) != 0; - } - } - - public static GameGenieCode[] GameGenieCodes - { - get - { - if (mem_board != null) - { - return mem_board.GameGenieCodes; - } - return null; - } - } - - public static bool IsGameGenieActive - { - get - { - if (mem_board != null) - { - return mem_board.IsGameGenieActive; - } - return false; - } - set - { - if (mem_board != null) - { - mem_board.IsGameGenieActive = value; - } - } - } - - public static bool IsGameFoundOnDB - { - get - { - if (mem_board != null) - { - return mem_board.IsGameFoundOnDB; - } - return false; - } - } - - public static NesCartDatabaseGameInfo GameInfo - { - get - { - if (mem_board != null) - { - return mem_board.GameInfo; - } - return NesCartDatabaseGameInfo.Empty; - } - } - - public static NesCartDatabaseCartridgeInfo GameCartInfo - { - get - { - if (mem_board != null) - { - return mem_board.GameCartInfo; - } - return new NesCartDatabaseCartridgeInfo(); - } - } - - public static string SHA1 => mem_board.SHA1; - - public static event EventHandler EmuShutdown; - - private static void DMCHardReset() - { - dmc_output_a = 0; - dmc_output = 0; - dmc_period_devider = 0; - dmc_loop_flag = false; - dmc_rate_index = 0; - dmc_irq_enabled = false; - dmc_dmaAddr = 49152; - dmc_addr_refresh = 49152; - dmc_size_refresh = 0; - dmc_dmaBits = 1; - dmc_dmaByte = 1; - dmc_period_devider = 0; - dmc_dmaEnabled = false; - dmc_bufferFull = false; - dmc_dmaSize = 0; - } - - private static void DMCSoftReset() - { - DMCHardReset(); - } - - private static void DMCClock() - { - dmc_period_devider--; - if (dmc_period_devider > 0) - { - return; - } - dmc_period_devider = dmc_freq_table[SystemIndex][dmc_rate_index]; - if (dmc_dmaEnabled) - { - if (((uint)dmc_dmaByte & (true ? 1u : 0u)) != 0) - { - if (dmc_output_a <= 125) - { - dmc_output_a += 2; - } - } - else if (dmc_output_a >= 2) - { - dmc_output_a -= 2; - } - dmc_dmaByte >>= 1; - } - dmc_dmaBits--; - if (dmc_dmaBits == 0) - { - dmc_dmaBits = 8; - if (dmc_bufferFull) - { - dmc_bufferFull = false; - dmc_dmaEnabled = true; - dmc_dmaByte = dmc_dmaBuffer; - if (dmc_dmaSize > 0) - { - AssertDMCDMA(); - } - } - else - { - dmc_dmaEnabled = false; - } - } - if (audio_dmc_outputable) - { - dmc_output = dmc_output_a; - } - audio_signal_outputed = true; - } - - private static void DMCDoDMA() - { - dmc_bufferFull = true; - Read(ref dmc_dmaAddr, out dmc_dmaBuffer); - if (dmc_dmaAddr == ushort.MaxValue) - { - dmc_dmaAddr = 32768; - } - else - { - dmc_dmaAddr++; - } - if (dmc_dmaSize > 0) - { - dmc_dmaSize--; - } - if (dmc_dmaSize == 0) - { - if (dmc_loop_flag) - { - dmc_dmaSize = dmc_size_refresh; - dmc_dmaAddr = dmc_addr_refresh; - } - else if (dmc_irq_enabled) - { - IRQFlags |= 2; - apu_irq_delta_occur = true; - } - } - } - - private static void APUOnRegister4010() - { - if (apu_reg_access_w) - { - dmc_irq_enabled = (apu_reg_io_db & 0x80) != 0; - dmc_loop_flag = (apu_reg_io_db & 0x40) != 0; - if (!dmc_irq_enabled) - { - apu_irq_delta_occur = false; - IRQFlags &= -3; - } - dmc_rate_index = (byte)(apu_reg_io_db & 0xFu); - } - } - - private static void APUOnRegister4011() - { - if (apu_reg_access_w) - { - dmc_output_a = (byte)(apu_reg_io_db & 0x7F); - } - } - - private static void APUOnRegister4012() - { - if (apu_reg_access_w) - { - dmc_addr_refresh = (ushort)((uint)(apu_reg_io_db << 6) | 0xC000u); - } - } - - private static void APUOnRegister4013() - { - if (apu_reg_access_w) - { - dmc_size_refresh = (apu_reg_io_db << 4) | 1; - } - } - - private static void DMCOn4015() - { - apu_irq_delta_occur = false; - IRQFlags &= -3; - } - - private static void DMCRead4015() - { - if (dmc_dmaSize > 0) - { - apu_reg_io_db = (byte)((apu_reg_io_db & 0xEFu) | 0x10u); - } - } - - private static void DMCWriteState(ref BinaryWriter bin) - { - bin.Write(dmc_output_a); - bin.Write(dmc_output); - bin.Write(dmc_period_devider); - bin.Write(dmc_irq_enabled); - bin.Write(dmc_loop_flag); - bin.Write(dmc_rate_index); - bin.Write(dmc_addr_refresh); - bin.Write(dmc_size_refresh); - bin.Write(dmc_dmaEnabled); - bin.Write(dmc_dmaByte); - bin.Write(dmc_dmaBits); - bin.Write(dmc_bufferFull); - bin.Write(dmc_dmaBuffer); - bin.Write(dmc_dmaSize); - bin.Write(dmc_dmaAddr); - } - - private static void DMCReadState(ref BinaryReader bin) - { - dmc_output_a = bin.ReadInt32(); - dmc_output = bin.ReadInt32(); - dmc_period_devider = bin.ReadInt32(); - dmc_irq_enabled = bin.ReadBoolean(); - dmc_loop_flag = bin.ReadBoolean(); - dmc_rate_index = bin.ReadByte(); - dmc_addr_refresh = bin.ReadUInt16(); - dmc_size_refresh = bin.ReadInt32(); - dmc_dmaEnabled = bin.ReadBoolean(); - dmc_dmaByte = bin.ReadByte(); - dmc_dmaBits = bin.ReadInt32(); - dmc_bufferFull = bin.ReadBoolean(); - dmc_dmaBuffer = bin.ReadByte(); - dmc_dmaSize = bin.ReadInt32(); - dmc_dmaAddr = bin.ReadUInt16(); - } - - private static void NOSHardReset() - { - nos_length_halt = false; - nos_constant_volume_envelope = false; - nos_volume_devider_period = 0; - nos_shift_reg = 1; - nos_timer = 0; - nos_mode = false; - nos_period_devider = 0; - nos_length_enabled = false; - nos_length_counter = 0; - nos_envelope_start_flag = false; - nos_envelope_devider = 0; - nos_envelope_decay_level_counter = 0; - nos_envelope = 0; - nos_output = 0; - nos_feedback = 0; - nos_ignore_reload = false; - } - - private static void NOSSoftReset() - { - NOSHardReset(); - } - - private static void NOSClock() - { - nos_period_devider--; - if (nos_period_devider > 0) - { - return; - } - nos_period_devider = nos_timer; - if (nos_mode) - { - nos_feedback = ((nos_shift_reg >> 6) & 1) ^ (nos_shift_reg & 1); - } - else - { - nos_feedback = ((nos_shift_reg >> 1) & 1) ^ (nos_shift_reg & 1); - } - nos_shift_reg >>= 1; - nos_shift_reg = (nos_shift_reg & 0x3FFF) | ((nos_feedback & 1) << 14); - if (nos_length_counter > 0 && (nos_shift_reg & 1) == 0) - { - if (audio_nos_outputable) - { - nos_output = nos_envelope; - } - } - else - { - nos_output = 0; - } - audio_signal_outputed = true; - } - - private static void NOSClockLength() - { - if (nos_length_counter > 0 && !nos_length_halt) - { - nos_length_counter--; - if (apu_reg_access_happened && apu_reg_io_addr == 15 && apu_reg_access_w) - { - nos_ignore_reload = true; - } - } - } - - private static void NOSClockEnvelope() - { - if (nos_envelope_start_flag) - { - nos_envelope_start_flag = false; - nos_envelope_decay_level_counter = 15; - nos_envelope_devider = (byte)(nos_volume_devider_period + 1); - } - else if (nos_envelope_devider > 0) - { - nos_envelope_devider--; - } - else - { - nos_envelope_devider = (byte)(nos_volume_devider_period + 1); - if (nos_envelope_decay_level_counter > 0) - { - nos_envelope_decay_level_counter--; - } - else if (nos_length_halt) - { - nos_envelope_decay_level_counter = 15; - } - } - nos_envelope = (nos_constant_volume_envelope ? nos_volume_devider_period : nos_envelope_decay_level_counter); - } - - private static void APUOnRegister400C() - { - if (apu_reg_access_w) - { - nos_volume_devider_period = (byte)(apu_reg_io_db & 0xFu); - nos_length_halt = (apu_reg_io_db & 0x20) != 0; - nos_constant_volume_envelope = (apu_reg_io_db & 0x10) != 0; - nos_envelope = (nos_constant_volume_envelope ? nos_volume_devider_period : nos_envelope_decay_level_counter); - } - } - - private static void APUOnRegister400D() - { - } - - private static void APUOnRegister400E() - { - if (apu_reg_access_w) - { - nos_timer = (ushort)(nos_freq_table[SystemIndex][apu_reg_io_db & 0xF] / 2); - nos_mode = (apu_reg_io_db & 0x80) == 128; - } - } - - private static void APUOnRegister400F() - { - if (apu_reg_access_w) - { - if (nos_length_enabled && !nos_ignore_reload) - { - nos_length_counter = sq_duration_table[apu_reg_io_db >> 3]; - } - if (nos_ignore_reload) - { - nos_ignore_reload = false; - } - nos_envelope_start_flag = true; - } - } - - private static void NOSOn4015() - { - nos_length_enabled = (apu_reg_io_db & 8) != 0; - if (!nos_length_enabled) - { - nos_length_counter = 0; - } - } - - private static void NOSRead4015() - { - if (nos_length_counter > 0) - { - apu_reg_io_db = (byte)((apu_reg_io_db & 0xF7u) | 8u); - } - } - - private static void NOSWriteState(ref BinaryWriter bin) - { - bin.Write(nos_length_halt); - bin.Write(nos_constant_volume_envelope); - bin.Write(nos_volume_devider_period); - bin.Write(nos_timer); - bin.Write(nos_mode); - bin.Write(nos_period_devider); - bin.Write(nos_length_enabled); - bin.Write(nos_length_counter); - bin.Write(nos_envelope_start_flag); - bin.Write(nos_envelope_devider); - bin.Write(nos_envelope_decay_level_counter); - bin.Write(nos_envelope); - bin.Write(nos_output); - bin.Write(nos_shift_reg); - bin.Write(nos_feedback); - bin.Write(nos_ignore_reload); - } - - private static void NOSReadState(ref BinaryReader bin) - { - nos_length_halt = bin.ReadBoolean(); - nos_constant_volume_envelope = bin.ReadBoolean(); - nos_volume_devider_period = bin.ReadByte(); - nos_timer = bin.ReadUInt16(); - nos_mode = bin.ReadBoolean(); - nos_period_devider = bin.ReadInt32(); - nos_length_enabled = bin.ReadBoolean(); - nos_length_counter = bin.ReadInt32(); - nos_envelope_start_flag = bin.ReadBoolean(); - nos_envelope_devider = bin.ReadByte(); - nos_envelope_decay_level_counter = bin.ReadByte(); - nos_envelope = bin.ReadByte(); - nos_output = bin.ReadInt32(); - nos_shift_reg = bin.ReadInt32(); - nos_feedback = bin.ReadInt32(); - nos_ignore_reload = bin.ReadBoolean(); - } - - private static void SQ1HardReset() - { - sq1_duty_cycle = 0; - sq1_length_halt = false; - sq1_constant_volume_envelope = false; - sq1_volume_devider_period = 0; - sq1_sweep_enable = false; - sq1_sweep_devider_period = 0; - sq1_sweep_negate = false; - sq1_sweep_shift_count = 0; - sq1_timer = 0; - sq1_period_devider = 0; - sq1_seqencer = 0; - sq1_length_enabled = false; - sq1_length_counter = 0; - sq1_envelope_start_flag = false; - sq1_envelope_devider = 0; - sq1_envelope_decay_level_counter = 0; - sq1_envelope = 0; - sq1_sweep_counter = 0; - sq1_sweep_reload = false; - sq1_sweep_change = 0; - sq1_valid_freq = false; - sq1_output = 0; - sq1_ignore_reload = false; - } - - private static void SQ1SoftReset() - { - SQ1HardReset(); - } - - private static void SQ1Clock() - { - sq1_period_devider--; - if (sq1_period_devider > 0) - { - return; - } - sq1_period_devider = sq1_timer + 1; - sq1_seqencer = (byte)((uint)(sq1_seqencer + 1) & 7u); - if (sq1_length_counter > 0 && sq1_valid_freq) - { - if (audio_sq1_outputable) - { - sq1_output = sq_duty_cycle_sequences[sq1_duty_cycle][sq1_seqencer] * sq1_envelope; - } - } - else - { - sq1_output = 0; - } - audio_signal_outputed = true; - } - - private static void SQ1ClockLength() - { - if (sq1_length_counter > 0 && !sq1_length_halt) - { - sq1_length_counter--; - if (apu_reg_access_happened && apu_reg_io_addr == 3 && apu_reg_access_w) - { - sq1_ignore_reload = true; - } - } - sq1_sweep_counter--; - if (sq1_sweep_counter == 0) - { - sq1_sweep_counter = sq1_sweep_devider_period + 1; - if (sq1_sweep_enable && sq1_sweep_shift_count > 0 && sq1_valid_freq) - { - sq1_sweep_change = sq1_timer >> (int)sq1_sweep_shift_count; - sq1_timer += (sq1_sweep_negate ? (~sq1_sweep_change) : sq1_sweep_change); - SQ1CalculateValidFreq(); - } - } - if (sq1_sweep_reload) - { - sq1_sweep_counter = sq1_sweep_devider_period + 1; - sq1_sweep_reload = false; - } - } - - private static void SQ1ClockEnvelope() - { - if (sq1_envelope_start_flag) - { - sq1_envelope_start_flag = false; - sq1_envelope_decay_level_counter = 15; - sq1_envelope_devider = (byte)(sq1_volume_devider_period + 1); - } - else if (sq1_envelope_devider > 0) - { - sq1_envelope_devider--; - } - else - { - sq1_envelope_devider = (byte)(sq1_volume_devider_period + 1); - if (sq1_envelope_decay_level_counter > 0) - { - sq1_envelope_decay_level_counter--; - } - else if (sq1_length_halt) - { - sq1_envelope_decay_level_counter = 15; - } - } - sq1_envelope = (sq1_constant_volume_envelope ? sq1_volume_devider_period : sq1_envelope_decay_level_counter); - } - - private static void APUOnRegister4000() - { - if (apu_reg_access_w) - { - sq1_duty_cycle = (byte)((apu_reg_io_db & 0xC0) >> 6); - sq1_volume_devider_period = (byte)(apu_reg_io_db & 0xFu); - sq1_length_halt = (apu_reg_io_db & 0x20) != 0; - sq1_constant_volume_envelope = (apu_reg_io_db & 0x10) != 0; - sq1_envelope = (sq1_constant_volume_envelope ? sq1_volume_devider_period : sq1_envelope_decay_level_counter); - } - } - - private static void APUOnRegister4001() - { - if (apu_reg_access_w) - { - sq1_sweep_enable = (apu_reg_io_db & 0x80) == 128; - sq1_sweep_devider_period = (byte)((uint)(apu_reg_io_db >> 4) & 7u); - sq1_sweep_negate = (apu_reg_io_db & 8) == 8; - sq1_sweep_shift_count = (byte)(apu_reg_io_db & 7u); - sq1_sweep_reload = true; - SQ1CalculateValidFreq(); - } - } - - private static void APUOnRegister4002() - { - if (apu_reg_access_w) - { - sq1_timer = (sq1_timer & 0xFF00) | apu_reg_io_db; - SQ1CalculateValidFreq(); - } - } - - private static void APUOnRegister4003() - { - if (apu_reg_access_w) - { - sq1_timer = (sq1_timer & 0xFF) | ((apu_reg_io_db & 7) << 8); - if (sq1_length_enabled && !sq1_ignore_reload) - { - sq1_length_counter = sq_duration_table[apu_reg_io_db >> 3]; - } - if (sq1_ignore_reload) - { - sq1_ignore_reload = false; - } - sq1_seqencer = 0; - sq1_envelope_start_flag = true; - SQ1CalculateValidFreq(); - } - } - - private static void SQ1On4015() - { - sq1_length_enabled = (apu_reg_io_db & 1) != 0; - if (!sq1_length_enabled) - { - sq1_length_counter = 0; - } - } - - private static void SQ1Read4015() - { - if (sq1_length_counter > 0) - { - apu_reg_io_db = (byte)((apu_reg_io_db & 0xFEu) | 1u); - } - } - - private static void SQ1CalculateValidFreq() - { - sq1_valid_freq = sq1_timer >= 8 && (sq1_sweep_negate || ((sq1_timer + (sq1_timer >> (int)sq1_sweep_shift_count)) & 0x800) == 0); - } - - private static void SQ1WriteState(ref BinaryWriter bin) - { - bin.Write(sq1_duty_cycle); - bin.Write(sq1_length_halt); - bin.Write(sq1_constant_volume_envelope); - bin.Write(sq1_volume_devider_period); - bin.Write(sq1_sweep_enable); - bin.Write(sq1_sweep_devider_period); - bin.Write(sq1_sweep_negate); - bin.Write(sq1_sweep_shift_count); - bin.Write(sq1_timer); - bin.Write(sq1_period_devider); - bin.Write(sq1_seqencer); - bin.Write(sq1_length_enabled); - bin.Write(sq1_length_counter); - bin.Write(sq1_envelope_start_flag); - bin.Write(sq1_envelope_devider); - bin.Write(sq1_envelope_decay_level_counter); - bin.Write(sq1_envelope); - bin.Write(sq1_sweep_counter); - bin.Write(sq1_sweep_reload); - bin.Write(sq1_sweep_change); - bin.Write(sq1_valid_freq); - bin.Write(sq1_output); - bin.Write(sq1_ignore_reload); - } - - private static void SQ1ReadState(ref BinaryReader bin) - { - sq1_duty_cycle = bin.ReadByte(); - sq1_length_halt = bin.ReadBoolean(); - sq1_constant_volume_envelope = bin.ReadBoolean(); - sq1_volume_devider_period = bin.ReadByte(); - sq1_sweep_enable = bin.ReadBoolean(); - sq1_sweep_devider_period = bin.ReadByte(); - sq1_sweep_negate = bin.ReadBoolean(); - sq1_sweep_shift_count = bin.ReadByte(); - sq1_timer = bin.ReadInt32(); - sq1_period_devider = bin.ReadInt32(); - sq1_seqencer = bin.ReadByte(); - sq1_length_enabled = bin.ReadBoolean(); - sq1_length_counter = bin.ReadInt32(); - sq1_envelope_start_flag = bin.ReadBoolean(); - sq1_envelope_devider = bin.ReadByte(); - sq1_envelope_decay_level_counter = bin.ReadByte(); - sq1_envelope = bin.ReadByte(); - sq1_sweep_counter = bin.ReadInt32(); - sq1_sweep_reload = bin.ReadBoolean(); - sq1_sweep_change = bin.ReadInt32(); - sq1_valid_freq = bin.ReadBoolean(); - sq1_output = bin.ReadInt32(); - sq1_ignore_reload = bin.ReadBoolean(); - } - - private static void TRLHardReset() - { - trl_liner_control_flag = false; - trl_liner_control_reload = 0; - trl_timer = 0; - trl_length_enabled = false; - trl_length_counter = 0; - trl_liner_control_reload_flag = false; - trl_liner_counter = 0; - trl_output = 0; - trl_period_devider = 0; - trl_step = 0; - trl_ignore_reload = false; - } - - private static void TRLSoftReset() - { - TRLHardReset(); - } - - private static void TRLClock() - { - trl_period_devider--; - if (trl_period_devider > 0) - { - return; - } - trl_period_devider = trl_timer + 1; - if (trl_length_counter > 0 && trl_liner_counter > 0 && trl_timer >= 4) - { - trl_step++; - trl_step &= 31; - if (audio_trl_outputable) - { - trl_output = trl_step_seq[trl_step]; - } - } - audio_signal_outputed = true; - } - - private static void TRLClockLength() - { - if (trl_length_counter > 0 && !trl_liner_control_flag) - { - trl_length_counter--; - if (apu_reg_access_happened && apu_reg_io_addr == 11 && apu_reg_access_w) - { - trl_ignore_reload = true; - } - } - } - - private static void TRLClockEnvelope() - { - if (trl_liner_control_reload_flag) - { - trl_liner_counter = trl_liner_control_reload; - } - else if (trl_liner_counter > 0) - { - trl_liner_counter--; - } - if (!trl_liner_control_flag) - { - trl_liner_control_reload_flag = false; - } - } - - private static void APUOnRegister4008() - { - if (apu_reg_access_w) - { - trl_liner_control_flag = (apu_reg_io_db & 0x80) == 128; - trl_liner_control_reload = (byte)(apu_reg_io_db & 0x7Fu); - } - } - - private static void APUOnRegister4009() - { - } - - private static void APUOnRegister400A() - { - if (apu_reg_access_w) - { - trl_timer = (ushort)((trl_timer & 0x7F00u) | apu_reg_io_db); - } - } - - private static void APUOnRegister400B() - { - if (apu_reg_access_w) - { - trl_timer = (ushort)((trl_timer & 0xFFu) | (uint)((apu_reg_io_db & 7) << 8)); - if (trl_length_enabled && !trl_ignore_reload) - { - trl_length_counter = sq_duration_table[apu_reg_io_db >> 3]; - } - if (trl_ignore_reload) - { - trl_ignore_reload = false; - } - trl_liner_control_reload_flag = true; - } - } - - private static void TRLOn4015() - { - trl_length_enabled = (apu_reg_io_db & 4) != 0; - if (!trl_length_enabled) - { - trl_length_counter = 0; - } - } - - private static void TRLRead4015() - { - if (trl_length_counter > 0) - { - apu_reg_io_db = (byte)((apu_reg_io_db & 0xFBu) | 4u); - } - } - - private static void TRLWriteState(ref BinaryWriter bin) - { - bin.Write(trl_liner_control_flag); - bin.Write(trl_liner_control_reload); - bin.Write(trl_timer); - bin.Write(trl_length_enabled); - bin.Write(trl_length_counter); - bin.Write(trl_liner_control_reload_flag); - bin.Write(trl_liner_counter); - bin.Write(trl_output); - bin.Write(trl_period_devider); - bin.Write(trl_step); - bin.Write(trl_ignore_reload); - } - - private static void TRLReadState(ref BinaryReader bin) - { - trl_liner_control_flag = bin.ReadBoolean(); - trl_liner_control_reload = bin.ReadByte(); - trl_timer = bin.ReadUInt16(); - trl_length_enabled = bin.ReadBoolean(); - trl_length_counter = bin.ReadByte(); - trl_liner_control_reload_flag = bin.ReadBoolean(); - trl_liner_counter = bin.ReadByte(); - trl_output = bin.ReadInt32(); - trl_period_devider = bin.ReadInt32(); - trl_step = bin.ReadInt32(); - trl_ignore_reload = bin.ReadBoolean(); - } - - private static void APUInitialize() - { - apu_reg_update_func = new Action[32]; - apu_reg_read_func = new Action[32]; - apu_reg_write_func = new Action[32]; - for (int i = 0; i < 32; i++) - { - apu_reg_update_func[i] = APUBlankAccess; - apu_reg_read_func[i] = APUBlankAccess; - apu_reg_write_func[i] = APUBlankAccess; - } - apu_reg_update_func[0] = APUOnRegister4000; - apu_reg_update_func[1] = APUOnRegister4001; - apu_reg_update_func[2] = APUOnRegister4002; - apu_reg_update_func[3] = APUOnRegister4003; - apu_reg_update_func[4] = APUOnRegister4004; - apu_reg_update_func[5] = APUOnRegister4005; - apu_reg_update_func[6] = APUOnRegister4006; - apu_reg_update_func[7] = APUOnRegister4007; - apu_reg_update_func[8] = APUOnRegister4008; - apu_reg_update_func[9] = APUOnRegister4009; - apu_reg_update_func[10] = APUOnRegister400A; - apu_reg_update_func[11] = APUOnRegister400B; - apu_reg_update_func[12] = APUOnRegister400C; - apu_reg_update_func[13] = APUOnRegister400D; - apu_reg_update_func[14] = APUOnRegister400E; - apu_reg_update_func[15] = APUOnRegister400F; - apu_reg_update_func[16] = APUOnRegister4010; - apu_reg_update_func[17] = APUOnRegister4011; - apu_reg_update_func[18] = APUOnRegister4012; - apu_reg_update_func[19] = APUOnRegister4013; - apu_reg_update_func[21] = APUOnRegister4015; - apu_reg_update_func[22] = APUOnRegister4016; - apu_reg_update_func[23] = APUOnRegister4017; - apu_reg_read_func[21] = APURead4015; - apu_reg_read_func[22] = APURead4016; - apu_reg_read_func[23] = APURead4017; - apu_reg_write_func[20] = APUWrite4014; - apu_reg_write_func[21] = APUWrite4015; - audio_low_pass_filter_14K = new SoundLowPassFilter(0.00815686); - audio_high_pass_filter_90 = new SoundHighPassFilter(0.999835); - audio_high_pass_filter_440 = new SoundHighPassFilter(0.996039); - apu_update_playback_func = APUUpdatePlaybackWithFilters; - } - - public static void ApplyAudioSettings(bool all = true) - { - SoundEnabled = MyNesMain.RendererSettings.Audio_SoundEnabled; - audio_sq1_outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_SQ1; - audio_sq2_outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_SQ2; - audio_nos_outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_NOZ; - audio_trl_outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_TRL; - audio_dmc_outputable = MyNesMain.RendererSettings.Audio_ChannelEnabled_DMC; - if (apu_use_external_sound) - { - mem_board.APUApplyChannelsSettings(); - } - if (all) - { - CalculateAudioPlaybackValues(); - } - } - - private static void APUHardReset() - { - apu_reg_io_db = 0; - apu_reg_io_addr = 0; - apu_reg_access_happened = false; - apu_reg_access_w = false; - apu_seq_mode = false; - apu_odd_cycle = true; - apu_cycle_f_t = 0; - apu_cycle_e = 4; - apu_cycle_f = 4; - apu_cycle_l = 4; - apu_odd_l = false; - apu_check_irq = false; - apu_do_env = false; - apu_do_length = false; - switch (Region) - { - case EmuRegion.NTSC: - cpu_speed = 1789773; - apu_ferq_f = 14914; - apu_ferq_e = 3728; - apu_ferq_l = 7456; - break; - case EmuRegion.PALB: - cpu_speed = 1662607; - apu_ferq_f = 14914; - apu_ferq_e = 3728; - apu_ferq_l = 7456; - break; - case EmuRegion.DENDY: - cpu_speed = 1773448; - apu_ferq_f = 14914; - apu_ferq_e = 3728; - apu_ferq_l = 7456; - break; - } - Tracer.WriteLine("NES: cpu speed = " + cpu_speed); - SQ1HardReset(); - SQ2HardReset(); - NOSHardReset(); - DMCHardReset(); - TRLHardReset(); - apu_irq_enabled = true; - apu_irq_flag = false; - reg_2004 = 8196; - CalculateAudioPlaybackValues(); - apu_use_external_sound = mem_board.enable_external_sound; - if (apu_use_external_sound) - { - Tracer.WriteInformation("External sound channels has been enabled on apu."); - } - } - - private static void APUSoftReset() - { - apu_reg_io_db = 0; - apu_reg_io_addr = 0; - apu_reg_access_happened = false; - apu_reg_access_w = false; - apu_seq_mode = false; - apu_odd_cycle = false; - apu_cycle_f_t = 0; - apu_cycle_e = 4; - apu_cycle_f = 4; - apu_cycle_l = 4; - apu_odd_l = false; - apu_check_irq = false; - apu_do_env = false; - apu_do_length = false; - apu_irq_enabled = true; - apu_irq_flag = false; - SQ1SoftReset(); - SQ2SoftReset(); - TRLSoftReset(); - NOSSoftReset(); - DMCSoftReset(); - } - - private static void APUIORead(ref ushort addr, out byte value) - { - if (addr >= 16416) - { - mem_board.ReadEX(ref addr, out value); - return; - } - apu_reg_io_addr = (byte)(addr & 0x1Fu); - apu_reg_access_happened = true; - apu_reg_access_w = false; - apu_reg_read_func[apu_reg_io_addr](); - value = apu_reg_io_db; - } - - private static void APUIOWrite(ref ushort addr, ref byte value) - { - if (addr >= 16416) - { - mem_board.WriteEX(ref addr, ref value); - return; - } - apu_reg_io_addr = (byte)(addr & 0x1Fu); - apu_reg_io_db = value; - apu_reg_access_w = true; - apu_reg_access_happened = true; - apu_reg_write_func[apu_reg_io_addr](); - } - - private static void APUBlankAccess() - { - } - - private static void APUWrite4014() - { - dma_Oamaddress = (ushort)(apu_reg_io_db << 8); - AssertOAMDMA(); - } - - private static void APUWrite4015() - { - if ((apu_reg_io_db & 0x10u) != 0) - { - if (dmc_dmaSize == 0) - { - dmc_dmaSize = dmc_size_refresh; - dmc_dmaAddr = dmc_addr_refresh; - } - } - else - { - dmc_dmaSize = 0; - } - if (!dmc_bufferFull && dmc_dmaSize > 0) - { - AssertDMCDMA(); - } - } - - private static void APUOnRegister4015() - { - if (apu_reg_access_w) - { - SQ1On4015(); - SQ2On4015(); - NOSOn4015(); - TRLOn4015(); - DMCOn4015(); - } - else - { - apu_irq_flag = false; - IRQFlags &= -2; - } - } - - private static void APUOnRegister4016() - { - if (!apu_reg_access_w) - { - return; - } - if (inputStrobe > (apu_reg_io_db & 1)) - { - if (IsFourPlayers) - { - PORT0 = (joypad3.GetData() << 8) | joypad1.GetData() | 0x1010000; - PORT1 = (joypad4.GetData() << 8) | joypad2.GetData() | 0x2020000; - } - else - { - PORT0 = joypad1.GetData() | 0x1010100; - PORT1 = joypad2.GetData() | 0x2020200; - } - } - inputStrobe = apu_reg_io_db & 1; - } - - private static void APUOnRegister4017() - { - if (apu_reg_access_w) - { - apu_seq_mode = (apu_reg_io_db & 0x80) != 0; - apu_irq_enabled = (apu_reg_io_db & 0x40) == 0; - apu_cycle_e = -1; - apu_cycle_l = -1; - apu_cycle_f = -1; - apu_odd_l = false; - apu_do_length = apu_seq_mode; - apu_do_env = apu_seq_mode; - apu_check_irq = false; - if (!apu_irq_enabled) - { - apu_irq_flag = false; - IRQFlags &= -2; - } - } - } - - private static void APURead4015() - { - apu_reg_io_db &= 32; - SQ1Read4015(); - SQ2Read4015(); - NOSRead4015(); - TRLRead4015(); - DMCRead4015(); - if (apu_irq_flag) - { - apu_reg_io_db = (byte)((apu_reg_io_db & 0xBFu) | 0x40u); - } - if (apu_irq_delta_occur) - { - apu_reg_io_db = (byte)((apu_reg_io_db & 0x7Fu) | 0x80u); - } - } - - private static void APURead4016() - { - apu_reg_io_db = (byte)((uint)PORT0 & 1u); - PORT0 >>= 1; - } - - private static void APURead4017() - { - apu_reg_io_db = (byte)((uint)PORT1 & 1u); - PORT1 >>= 1; - } - - private static void APUClock() - { - apu_odd_cycle = !apu_odd_cycle; - if (apu_do_env) - { - APUClockEnvelope(); - } - if (apu_do_length) - { - APUClockDuration(); - } - if (apu_odd_cycle) - { - apu_cycle_f++; - if (apu_cycle_f >= apu_ferq_f) - { - apu_cycle_f = -1; - apu_check_irq = true; - apu_cycle_f_t = 3; - } - apu_cycle_e++; - if (apu_cycle_e >= apu_ferq_e) - { - apu_cycle_e = -1; - if (apu_check_irq) - { - if (!apu_seq_mode) - { - apu_do_env = true; - } - else - { - apu_cycle_e = 4; - } - } - else - { - apu_do_env = true; - } - } - apu_cycle_l++; - if (apu_cycle_l >= apu_ferq_l) - { - apu_odd_l = !apu_odd_l; - apu_cycle_l = (apu_odd_l ? (-2) : (-1)); - if (apu_check_irq && apu_seq_mode) - { - apu_cycle_l = 3730; - apu_odd_l = true; - } - else - { - apu_do_length = true; - } - } - SQ1Clock(); - SQ2Clock(); - NOSClock(); - if (apu_use_external_sound) - { - mem_board.OnAPUClock(); - } - if (apu_reg_access_happened) - { - apu_reg_access_happened = false; - apu_reg_update_func[apu_reg_io_addr](); - } - } - TRLClock(); - DMCClock(); - if (apu_check_irq) - { - if (!apu_seq_mode) - { - APUCheckIRQ(); - } - apu_cycle_f_t--; - if (apu_cycle_f_t == 0) - { - apu_check_irq = false; - } - } - if (apu_use_external_sound) - { - mem_board.OnAPUClockSingle(); - } - apu_update_playback_func(); - } - - private static void APUClockDuration() - { - SQ1ClockLength(); - SQ2ClockLength(); - NOSClockLength(); - TRLClockLength(); - if (apu_use_external_sound) - { - mem_board.OnAPUClockDuration(); - } - apu_do_length = false; - } - - private static void APUClockEnvelope() - { - SQ1ClockEnvelope(); - SQ2ClockEnvelope(); - NOSClockEnvelope(); - TRLClockEnvelope(); - if (apu_use_external_sound) - { - mem_board.OnAPUClockEnvelope(); - } - apu_do_env = false; - } - - private static void APUCheckIRQ() - { - if (apu_irq_enabled) - { - apu_irq_flag = true; - } - if (apu_irq_flag) - { - IRQFlags |= 1; - } - } - - private static void CalculateAudioPlaybackValues() - { - audio_timer_ratio = (double)cpu_speed / (double)MyNesMain.RendererSettings.Audio_Frequency; - audio_playback_peek_limit = MyNesMain.RendererSettings.Audio_InternalPeekLimit; - audio_samples_count = MyNesMain.RendererSettings.Audio_InternalSamplesCount; - audio_playback_amplitude = MyNesMain.RendererSettings.Audio_PlaybackAmplitude; - audio_samples = new short[audio_samples_count]; - audio_w_pos = 0; - audio_samples_added = 0; - audio_timer = 0.0; - audio_x = (audio_y = 0.0); - Tracer.WriteLine("AUDIO: frequency = " + MyNesMain.RendererSettings.Audio_Frequency); - Tracer.WriteLine("AUDIO: timer ratio = " + audio_timer_ratio); - Tracer.WriteLine("AUDIO: internal samples count = " + audio_samples_count); - Tracer.WriteLine("AUDIO: amplitude = " + audio_playback_amplitude); - if (MyNesMain.RendererSettings.Audio_EnableFilters) - { - apu_update_playback_func = APUUpdatePlaybackWithFilters; - audio_low_pass_filter_14K = new SoundLowPassFilter(SoundLowPassFilter.GetK((double)cpu_speed / 14000.0, 14000.0)); - audio_high_pass_filter_90 = new SoundHighPassFilter(SoundHighPassFilter.GetK((double)cpu_speed / 90.0, 90.0)); - audio_high_pass_filter_440 = new SoundHighPassFilter(SoundHighPassFilter.GetK((double)cpu_speed / 440.0, 440.0)); - } - else - { - apu_update_playback_func = APUUpdatePlaybackWithoutFilters; - } - InitializeDACTables(force_intitialize: false); - } - - public static void InitializeDACTables(bool force_intitialize) - { - if (audio_playback_dac_initialized && !force_intitialize) - { - return; - } - int[] array = new int[5]; - mix_table = new int[16][][][][]; - for (int i = 0; i < 16; i++) - { - mix_table[i] = new int[16][][][]; - for (int j = 0; j < 16; j++) - { - mix_table[i][j] = new int[16][][]; - for (int k = 0; k < 16; k++) - { - mix_table[i][j][k] = new int[16][]; - for (int l = 0; l < 16; l++) - { - mix_table[i][j][k][l] = new int[128]; - for (int m = 0; m < 128; m++) - { - if (MyNesMain.RendererSettings.Audio_UseDefaultMixer) - { - double num = 95.88 / (8128.0 / (double)(i + j) + 100.0); - double num2 = 159.79 / (1.0 / ((double)k / 8227.0 + (double)l / 12241.0 + (double)m / 22638.0) + 100.0); - mix_table[i][j][k][l][m] = (int)Math.Ceiling((num + num2) * audio_playback_amplitude); - continue; - } - GetPrec(i, 255, 2048, out array[0]); - GetPrec(j, 255, 2048, out array[1]); - GetPrec(l, 255, 2048, out array[2]); - GetPrec(k, 255, 2048, out array[3]); - GetPrec(m, 255, 2048, out array[4]); - array[4] /= 2; - int num3 = array[0] + array[1] + array[2] + array[3] + array[4]; - num3 /= 5; - mix_table[i][j][k][l][m] = num3; - } - } - } - } - } - audio_playback_dac_initialized = true; - } - - private static void APUUpdatePlaybackWithFilters() - { - if (!SoundEnabled) - { - return; - } - audio_x = mix_table[sq1_output][sq2_output][trl_output][nos_output][dmc_output]; - if (apu_use_external_sound) - { - audio_x = (audio_x + mem_board.APUGetSample() * audio_playback_amplitude) / 2.0; - } - audio_high_pass_filter_90.DoFiltering(audio_x, out audio_y); - audio_high_pass_filter_440.DoFiltering(audio_y, out audio_y); - audio_low_pass_filter_14K.DoFiltering(audio_y, out audio_y); - audio_y_av += audio_y; - audio_y_timer += 1.0; - audio_timer += 1.0; - if (!(audio_timer >= audio_timer_ratio)) - { - return; - } - if (audio_y_timer > 0.0) - { - audio_y = audio_y_av / audio_y_timer; - } - else - { - audio_y = 0.0; - } - audio_y_av = 0.0; - audio_y_timer = 0.0; - audio_timer -= audio_timer_ratio; - if (audio_w_pos < audio_samples_count) - { - if (audio_y > (double)audio_playback_peek_limit) - { - audio_y = audio_playback_peek_limit; - } - if (audio_y < (double)(-audio_playback_peek_limit)) - { - audio_y = -audio_playback_peek_limit; - } - audio_samples[audio_w_pos] = (short)audio_y; - if (MyNesMain.WaveRecorder.IsRecording) - { - MyNesMain.WaveRecorder.AddSample((short)audio_y); - } - audio_w_pos++; - audio_samples_added++; - } - audio_y = 0.0; - } - - private static void APUUpdatePlaybackWithoutFilters() - { - if (!SoundEnabled) - { - return; - } - audio_y = mix_table[sq1_output][sq2_output][trl_output][nos_output][dmc_output] / 2; - if (apu_use_external_sound) - { - audio_y = (audio_y + mem_board.APUGetSample() * audio_playback_amplitude) / 2.0; - } - audio_y_av += audio_y; - audio_y_timer += 1.0; - audio_timer += 1.0; - if (!(audio_timer >= audio_timer_ratio)) - { - return; - } - if (audio_y_timer > 0.0) - { - audio_y = audio_y_av / audio_y_timer; - } - else - { - audio_y = 0.0; - } - audio_y_av = 0.0; - audio_y_timer = 0.0; - audio_timer -= audio_timer_ratio; - if (audio_w_pos < audio_samples_count) - { - if (audio_y > (double)audio_playback_peek_limit) - { - audio_y = audio_playback_peek_limit; - } - if (audio_y < (double)(-audio_playback_peek_limit)) - { - audio_y = -audio_playback_peek_limit; - } - audio_samples[audio_w_pos] = (short)audio_y; - if (MyNesMain.WaveRecorder.IsRecording) - { - MyNesMain.WaveRecorder.AddSample((short)audio_y); - } - audio_w_pos++; - audio_samples_added++; - } - audio_y = 0.0; - } - - private static void GetPrec(int inVal, int inMax, int outMax, out int val) - { - val = outMax * inVal / inMax; - } - - private static void APUWriteState(ref BinaryWriter bin) - { - bin.Write(apu_reg_io_db); - bin.Write(apu_reg_io_addr); - bin.Write(apu_reg_access_happened); - bin.Write(apu_reg_access_w); - bin.Write(apu_odd_cycle); - bin.Write(apu_irq_enabled); - bin.Write(apu_irq_flag); - bin.Write(apu_irq_delta_occur); - bin.Write(apu_seq_mode); - bin.Write(apu_ferq_f); - bin.Write(apu_ferq_l); - bin.Write(apu_ferq_e); - bin.Write(apu_cycle_f); - bin.Write(apu_cycle_e); - bin.Write(apu_cycle_l); - bin.Write(apu_odd_l); - bin.Write(apu_cycle_f_t); - bin.Write(apu_check_irq); - bin.Write(apu_do_env); - bin.Write(apu_do_length); - SQ1WriteState(ref bin); - SQ2WriteState(ref bin); - NOSWriteState(ref bin); - TRLWriteState(ref bin); - DMCWriteState(ref bin); - } - - private static void APUReadState(ref BinaryReader bin) - { - apu_reg_io_db = bin.ReadByte(); - apu_reg_io_addr = bin.ReadByte(); - apu_reg_access_happened = bin.ReadBoolean(); - apu_reg_access_w = bin.ReadBoolean(); - apu_odd_cycle = bin.ReadBoolean(); - apu_irq_enabled = bin.ReadBoolean(); - apu_irq_flag = bin.ReadBoolean(); - apu_irq_delta_occur = bin.ReadBoolean(); - apu_seq_mode = bin.ReadBoolean(); - apu_ferq_f = bin.ReadInt32(); - apu_ferq_l = bin.ReadInt32(); - apu_ferq_e = bin.ReadInt32(); - apu_cycle_f = bin.ReadInt32(); - apu_cycle_e = bin.ReadInt32(); - apu_cycle_l = bin.ReadInt32(); - apu_odd_l = bin.ReadBoolean(); - apu_cycle_f_t = bin.ReadInt32(); - apu_check_irq = bin.ReadBoolean(); - apu_do_env = bin.ReadBoolean(); - apu_do_length = bin.ReadBoolean(); - SQ1ReadState(ref bin); - SQ2ReadState(ref bin); - NOSReadState(ref bin); - TRLReadState(ref bin); - DMCReadState(ref bin); - } - - private static byte register_pb() - { - return (byte)((cpu_flag_n ? 128u : 0u) | (cpu_flag_v ? 64u : 0u) | (cpu_flag_d ? 8u : 0u) | (cpu_flag_i ? 4u : 0u) | (cpu_flag_z ? 2u : 0u) | (cpu_flag_c ? 1u : 0u) | 0x30u); - } - - private static void CPUInitialize() - { - cpu_addressings = new Action[256] - { - Imp____, IndX_R_, ImA____, IndX_W_, Zpg_R__, Zpg_R__, Zpg_RW_, Zpg_W__, ImA____, Imm____, - ImA____, Imm____, Abs_R__, Abs_R__, Abs_RW_, Abs_W__, Imp____, IndY_R_, Imp____, IndY_W_, - ZpgX_R_, ZpgX_R_, ZpgX_RW, ZpgX_W_, ImA____, AbsY_R_, ImA____, AbsY_W_, AbsX_R_, AbsX_R_, - AbsX_RW, AbsX_W_, Imp____, IndX_R_, ImA____, IndX_W_, Zpg_R__, Zpg_R__, Zpg_RW_, Zpg_W__, - ImA____, Imm____, ImA____, Imm____, Abs_R__, Abs_R__, Abs_RW_, Abs_W__, Imp____, IndY_R_, - Imp____, IndY_W_, ZpgX_R_, ZpgX_R_, ZpgX_RW, ZpgX_W_, ImA____, AbsY_R_, ImA____, AbsY_W_, - AbsX_R_, AbsX_R_, AbsX_RW, AbsX_W_, ImA____, IndX_R_, ImA____, IndX_W_, Zpg_R__, Zpg_R__, - Zpg_RW_, Zpg_W__, ImA____, Imm____, ImA____, Imm____, Abs_W__, Abs_R__, Abs_RW_, Abs_W__, - Imp____, IndY_R_, Imp____, IndY_W_, ZpgX_R_, ZpgX_R_, ZpgX_RW, ZpgX_W_, ImA____, AbsY_R_, - ImA____, AbsY_W_, AbsX_R_, AbsX_R_, AbsX_RW, AbsX_W_, ImA____, IndX_R_, ImA____, IndX_W_, - Zpg_R__, Zpg_R__, Zpg_RW_, Zpg_W__, ImA____, Imm____, ImA____, Imm____, Imp____, Abs_R__, - Abs_RW_, Abs_W__, Imp____, IndY_R_, Imp____, IndY_W_, ZpgX_R_, ZpgX_R_, ZpgX_RW, ZpgX_W_, - ImA____, AbsY_R_, ImA____, AbsY_W_, AbsX_R_, AbsX_R_, AbsX_RW, AbsX_W_, Imm____, IndX_W_, - Imm____, IndX_W_, Zpg_W__, Zpg_W__, Zpg_W__, Zpg_W__, ImA____, Imm____, ImA____, Imm____, - Abs_W__, Abs_W__, Abs_W__, Abs_W__, Imp____, IndY_W_, Imp____, IndY_W_, ZpgX_W_, ZpgX_W_, - ZpgY_W_, ZpgY_W_, ImA____, AbsY_W_, ImA____, AbsY_W_, Abs_W__, AbsX_W_, Abs_W__, AbsY_W_, - Imm____, IndX_R_, Imm____, IndX_R_, Zpg_R__, Zpg_R__, Zpg_R__, Zpg_R__, ImA____, Imm____, - ImA____, Imm____, Abs_R__, Abs_R__, Abs_R__, Abs_R__, Imp____, IndY_R_, Imp____, IndY_R_, - ZpgX_R_, ZpgX_R_, ZpgY_R_, ZpgY_R_, ImA____, AbsY_R_, ImA____, AbsY_R_, AbsX_R_, AbsX_R_, - AbsY_R_, AbsY_R_, Imm____, IndX_R_, Imm____, IndX_R_, Zpg_R__, Zpg_R__, Zpg_RW_, Zpg_R__, - ImA____, Imm____, ImA____, Imm____, Abs_R__, Abs_R__, Abs_RW_, Abs_R__, Imp____, IndY_R_, - Imp____, IndY_RW, ZpgX_R_, ZpgX_R_, ZpgX_RW, ZpgX_RW, ImA____, AbsY_R_, ImA____, AbsY_RW, - AbsX_R_, AbsX_R_, AbsX_RW, AbsX_RW, Imm____, IndX_R_, Imm____, IndX_W_, Zpg_R__, Zpg_R__, - Zpg_RW_, Zpg_W__, ImA____, Imm____, ImA____, Imm____, Abs_R__, Abs_R__, Abs_RW_, Abs_W__, - Imp____, IndY_R_, Imp____, IndY_W_, ZpgX_R_, ZpgX_R_, ZpgX_RW, ZpgX_W_, ImA____, AbsY_R_, - ImA____, AbsY_W_, AbsX_R_, AbsX_R_, AbsX_RW, AbsX_W_ - }; - cpu_instructions = new Action[256] - { - BRK__, ORA__, NOP__, SLO__, NOP__, ORA__, ASL_M, SLO__, PHP__, ORA__, - ASL_A, ANC__, NOP__, ORA__, ASL_M, SLO__, BPL__, ORA__, NOP__, SLO__, - NOP__, ORA__, ASL_M, SLO__, CLC__, ORA__, NOP__, SLO__, NOP__, ORA__, - ASL_M, SLO__, JSR__, AND__, NOP__, RLA__, BIT__, AND__, ROL_M, RLA__, - PLP__, AND__, ROL_A, ANC__, BIT__, AND__, ROL_M, RLA__, BMI__, AND__, - NOP__, RLA__, NOP__, AND__, ROL_M, RLA__, SEC__, AND__, NOP__, RLA__, - NOP__, AND__, ROL_M, RLA__, RTI__, EOR__, NOP__, SRE__, NOP__, EOR__, - LSR_M, SRE__, PHA__, EOR__, LSR_A, ALR__, JMP__, EOR__, LSR_M, SRE__, - BVC__, EOR__, NOP__, SRE__, NOP__, EOR__, LSR_M, SRE__, CLI__, EOR__, - NOP__, SRE__, NOP__, EOR__, LSR_M, SRE__, RTS__, ADC__, NOP__, RRA__, - NOP__, ADC__, ROR_M, RRA__, PLA__, ADC__, ROR_A, ARR__, JMP_I, ADC__, - ROR_M, RRA__, BVS__, ADC__, NOP__, RRA__, NOP__, ADC__, ROR_M, RRA__, - SEI__, ADC__, NOP__, RRA__, NOP__, ADC__, ROR_M, RRA__, NOP__, STA__, - NOP__, SAX__, STY__, STA__, STX__, SAX__, DEY__, NOP__, TXA__, XAA__, - STY__, STA__, STX__, SAX__, BCC__, STA__, NOP__, AHX__, STY__, STA__, - STX__, SAX__, TYA__, STA__, TXS__, XAS__, SHY__, STA__, SHX__, AHX__, - LDY__, LDA__, LDX__, LAX__, LDY__, LDA__, LDX__, LAX__, TAY__, LDA__, - TAX__, LAX__, LDY__, LDA__, LDX__, LAX__, BCS__, LDA__, NOP__, LAX__, - LDY__, LDA__, LDX__, LAX__, CLV__, LDA__, TSX__, LAR__, LDY__, LDA__, - LDX__, LAX__, CPY__, CMP__, NOP__, DCP__, CPY__, CMP__, DEC__, DCP__, - INY__, CMP__, DEX__, AXS__, CPY__, CMP__, DEC__, DCP__, BNE__, CMP__, - NOP__, DCP__, NOP__, CMP__, DEC__, DCP__, CLD__, CMP__, NOP__, DCP__, - NOP__, CMP__, DEC__, DCP__, CPX__, SBC__, NOP__, ISC__, CPX__, SBC__, - INC__, ISC__, INX__, SBC__, NOP__, SBC__, CPX__, SBC__, INC__, ISC__, - BEQ__, SBC__, NOP__, ISC__, NOP__, SBC__, INC__, ISC__, SED__, SBC__, - NOP__, ISC__, NOP__, SBC__, INC__, ISC__ - }; - } - - private static void CPUClock() - { - Read(ref cpu_reg_pc.v, out cpu_opcode); - cpu_reg_pc.v++; - cpu_addressings[cpu_opcode](); - cpu_instructions[cpu_opcode](); - if (CPU_IRQ_PIN || CPU_NMI_PIN) - { - Read(ref cpu_reg_pc.v, out cpu_dummy); - Read(ref cpu_reg_pc.v, out cpu_dummy); - Interrupt(); - } - } - - private static void CPUHardReset() - { - cpu_reg_a = 0; - cpu_reg_x = 0; - cpu_reg_y = 0; - cpu_reg_sp.l = 253; - cpu_reg_sp.h = 1; - ushort addr = 65532; - mem_board.ReadPRG(ref addr, out cpu_reg_pc.l); - addr++; - mem_board.ReadPRG(ref addr, out cpu_reg_pc.h); - register_p = 0; - cpu_flag_i = true; - cpu_reg_ea.v = 0; - cpu_opcode = 0; - CPU_IRQ_PIN = false; - CPU_NMI_PIN = false; - cpu_suspend_nmi = false; - cpu_suspend_irq = false; - IRQFlags = 0; - } - - private static void CPUSoftReset() - { - cpu_flag_i = true; - cpu_reg_sp.v -= 3; - ushort addr = 65532; - Read(ref addr, out cpu_reg_pc.l); - addr++; - Read(ref addr, out cpu_reg_pc.h); - } - - private static void Imp____() - { - } - - private static void IndX_R_() - { - temp_add.h = 0; - Read(ref cpu_reg_pc.v, out temp_add.l); - cpu_reg_pc.v++; - Read(ref temp_add.v, out cpu_dummy); - temp_add.l += cpu_reg_x; - Read(ref temp_add.v, out cpu_reg_ea.l); - temp_add.l++; - Read(ref temp_add.v, out cpu_reg_ea.h); - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void IndX_W_() - { - temp_add.h = 0; - Read(ref cpu_reg_pc.v, out temp_add.l); - cpu_reg_pc.v++; - Read(ref temp_add.v, out cpu_dummy); - temp_add.l += cpu_reg_x; - Read(ref temp_add.v, out cpu_reg_ea.l); - temp_add.l++; - Read(ref temp_add.v, out cpu_reg_ea.h); - } - - private static void IndX_RW() - { - temp_add.h = 0; - Read(ref cpu_reg_pc.v, out temp_add.l); - cpu_reg_pc.v++; - Read(ref temp_add.v, out cpu_dummy); - temp_add.l += cpu_reg_x; - Read(ref temp_add.v, out cpu_reg_ea.l); - temp_add.l++; - Read(ref temp_add.v, out cpu_reg_ea.h); - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void IndY_R_() - { - temp_add.h = 0; - Read(ref cpu_reg_pc.v, out temp_add.l); - cpu_reg_pc.v++; - Read(ref temp_add.v, out cpu_reg_ea.l); - temp_add.l++; - Read(ref temp_add.v, out cpu_reg_ea.h); - cpu_reg_ea.l += cpu_reg_y; - Read(ref cpu_reg_ea.v, out cpu_m); - if (cpu_reg_ea.l < cpu_reg_y) - { - cpu_reg_ea.h++; - Read(ref cpu_reg_ea.v, out cpu_m); - } - } - - private static void IndY_W_() - { - temp_add.h = 0; - Read(ref cpu_reg_pc.v, out temp_add.l); - cpu_reg_pc.v++; - Read(ref temp_add.v, out cpu_reg_ea.l); - temp_add.l++; - Read(ref temp_add.v, out cpu_reg_ea.h); - cpu_reg_ea.l += cpu_reg_y; - Read(ref cpu_reg_ea.v, out cpu_m); - if (cpu_reg_ea.l < cpu_reg_y) - { - cpu_reg_ea.h++; - } - } - - private static void IndY_RW() - { - temp_add.h = 0; - Read(ref cpu_reg_pc.v, out temp_add.l); - cpu_reg_pc.v++; - Read(ref temp_add.v, out cpu_reg_ea.l); - temp_add.l++; - Read(ref temp_add.v, out cpu_reg_ea.h); - cpu_reg_ea.l += cpu_reg_y; - Read(ref cpu_reg_ea.v, out cpu_dummy); - if (cpu_reg_ea.l < cpu_reg_y) - { - cpu_reg_ea.h++; - } - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void Zpg_R__() - { - cpu_reg_ea.h = 0; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void Zpg_W__() - { - cpu_reg_ea.h = 0; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - } - - private static void Zpg_RW_() - { - cpu_reg_ea.h = 0; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void ZpgX_R_() - { - cpu_reg_ea.h = 0; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_dummy); - cpu_reg_ea.l += cpu_reg_x; - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void ZpgX_W_() - { - cpu_reg_ea.h = 0; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_dummy); - cpu_reg_ea.l += cpu_reg_x; - } - - private static void ZpgX_RW() - { - cpu_reg_ea.h = 0; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_dummy); - cpu_reg_ea.l += cpu_reg_x; - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void ZpgY_R_() - { - cpu_reg_ea.h = 0; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_dummy); - cpu_reg_ea.l += cpu_reg_y; - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void ZpgY_W_() - { - cpu_reg_ea.h = 0; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_dummy); - cpu_reg_ea.l += cpu_reg_y; - } - - private static void ZpgY_RW() - { - cpu_reg_ea.h = 0; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_dummy); - cpu_reg_ea.l += cpu_reg_y; - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void Imm____() - { - Read(ref cpu_reg_pc.v, out cpu_m); - cpu_reg_pc.v++; - } - - private static void ImA____() - { - Read(ref cpu_reg_pc.v, out cpu_dummy); - } - - private static void Abs_R__() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void Abs_W__() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v++; - } - - private static void Abs_RW_() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v++; - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void AbsX_R_() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v++; - cpu_reg_ea.l += cpu_reg_x; - Read(ref cpu_reg_ea.v, out cpu_m); - if (cpu_reg_ea.l < cpu_reg_x) - { - cpu_reg_ea.h++; - Read(ref cpu_reg_ea.v, out cpu_m); - } - } - - private static void AbsX_W_() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v++; - cpu_reg_ea.l += cpu_reg_x; - Read(ref cpu_reg_ea.v, out cpu_m); - if (cpu_reg_ea.l < cpu_reg_x) - { - cpu_reg_ea.h++; - } - } - - private static void AbsX_RW() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v++; - cpu_reg_ea.l += cpu_reg_x; - Read(ref cpu_reg_ea.v, out cpu_dummy); - if (cpu_reg_ea.l < cpu_reg_x) - { - cpu_reg_ea.h++; - } - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void AbsY_R_() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v++; - cpu_reg_ea.l += cpu_reg_y; - Read(ref cpu_reg_ea.v, out cpu_m); - if (cpu_reg_ea.l < cpu_reg_y) - { - cpu_reg_ea.h++; - Read(ref cpu_reg_ea.v, out cpu_m); - } - } - - private static void AbsY_W_() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v++; - cpu_reg_ea.l += cpu_reg_y; - Read(ref cpu_reg_ea.v, out cpu_m); - if (cpu_reg_ea.l < cpu_reg_y) - { - cpu_reg_ea.h++; - } - } - - private static void AbsY_RW() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v++; - cpu_reg_ea.l += cpu_reg_y; - Read(ref cpu_reg_ea.v, out cpu_m); - if (cpu_reg_ea.l < cpu_reg_y) - { - cpu_reg_ea.h++; - } - Read(ref cpu_reg_ea.v, out cpu_m); - } - - private static void Interrupt() - { - Push(ref cpu_reg_pc.h); - Push(ref cpu_reg_pc.l); - cpu_dummy = ((cpu_opcode == 0) ? register_pb() : register_p); - Push(ref cpu_dummy); - temp_add.v = InterruptVector; - cpu_suspend_nmi = true; - cpu_flag_i = true; - CPU_NMI_PIN = false; - Read(ref temp_add.v, out cpu_reg_pc.l); - temp_add.v++; - Read(ref temp_add.v, out cpu_reg_pc.h); - cpu_suspend_nmi = false; - } - - private static void Branch(ref bool condition) - { - Read(ref cpu_reg_pc.v, out cpu_byte_temp); - cpu_reg_pc.v++; - if (!condition) - { - return; - } - cpu_suspend_irq = true; - Read(ref cpu_reg_pc.v, out cpu_dummy); - cpu_reg_pc.l += cpu_byte_temp; - cpu_suspend_irq = false; - if (cpu_byte_temp >= 128) - { - if (cpu_reg_pc.l >= cpu_byte_temp) - { - Read(ref cpu_reg_pc.v, out cpu_dummy); - cpu_reg_pc.h--; - } - } - else if (cpu_reg_pc.l < cpu_byte_temp) - { - Read(ref cpu_reg_pc.v, out cpu_dummy); - cpu_reg_pc.h++; - } - } - - private static void Push(ref byte val) - { - Write(ref cpu_reg_sp.v, ref val); - cpu_reg_sp.l--; - } - - private static void Pull(out byte val) - { - cpu_reg_sp.l++; - Read(ref cpu_reg_sp.v, out val); - } - - private static void ADC__() - { - cpu_int_temp = cpu_reg_a + cpu_m + (cpu_flag_c ? 1 : 0); - cpu_flag_v = ((cpu_int_temp ^ cpu_reg_a) & (cpu_int_temp ^ cpu_m) & 0x80) != 0; - cpu_flag_n = (cpu_int_temp & 0x80) != 0; - cpu_flag_z = (cpu_int_temp & 0xFF) == 0; - cpu_flag_c = cpu_int_temp >> 8 != 0; - cpu_reg_a = (byte)((uint)cpu_int_temp & 0xFFu); - } - - private static void AHX__() - { - cpu_byte_temp = (byte)((uint)(cpu_reg_a & cpu_reg_x) & 7u); - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - } - - private static void ALR__() - { - cpu_reg_a &= cpu_m; - cpu_flag_c = (cpu_reg_a & 1) != 0; - cpu_reg_a >>= 1; - cpu_flag_n = (cpu_reg_a & 0x80) != 0; - cpu_flag_z = cpu_reg_a == 0; - } - - private static void ANC__() - { - cpu_reg_a &= cpu_m; - cpu_flag_n = (cpu_reg_a & 0x80) != 0; - cpu_flag_z = cpu_reg_a == 0; - cpu_flag_c = (cpu_reg_a & 0x80) != 0; - } - - private static void AND__() - { - cpu_reg_a &= cpu_m; - cpu_flag_n = (cpu_reg_a & 0x80) == 128; - cpu_flag_z = cpu_reg_a == 0; - } - - private static void ARR__() - { - cpu_reg_a = (byte)((uint)((cpu_m & cpu_reg_a) >> 1) | (cpu_flag_c ? 128u : 0u)); - cpu_flag_z = (cpu_reg_a & 0xFF) == 0; - cpu_flag_n = (cpu_reg_a & 0x80) != 0; - cpu_flag_c = (cpu_reg_a & 0x40) != 0; - cpu_flag_v = (((cpu_reg_a << 1) ^ cpu_reg_a) & 0x40) != 0; - } - - private static void AXS__() - { - cpu_int_temp = (cpu_reg_a & cpu_reg_x) - cpu_m; - cpu_flag_n = (cpu_int_temp & 0x80) != 0; - cpu_flag_z = (cpu_int_temp & 0xFF) == 0; - cpu_flag_c = ~cpu_int_temp >> 8 != 0; - cpu_reg_x = (byte)((uint)cpu_int_temp & 0xFFu); - } - - private static void ASL_M() - { - cpu_flag_c = (cpu_m & 0x80) == 128; - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_m = (byte)((uint)(cpu_m << 1) & 0xFEu); - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_flag_n = (cpu_m & 0x80) == 128; - cpu_flag_z = cpu_m == 0; - } - - private static void ASL_A() - { - cpu_flag_c = (cpu_reg_a & 0x80) == 128; - cpu_reg_a = (byte)((uint)(cpu_reg_a << 1) & 0xFEu); - cpu_flag_n = (cpu_reg_a & 0x80) == 128; - cpu_flag_z = cpu_reg_a == 0; - } - - private static void BCC__() - { - cpu_bool_tmp = !cpu_flag_c; - Branch(ref cpu_bool_tmp); - } - - private static void BCS__() - { - Branch(ref cpu_flag_c); - } - - private static void BEQ__() - { - Branch(ref cpu_flag_z); - } - - private static void BIT__() - { - cpu_flag_n = (cpu_m & 0x80) != 0; - cpu_flag_v = (cpu_m & 0x40) != 0; - cpu_flag_z = (cpu_m & cpu_reg_a) == 0; - } - - private static void BRK__() - { - Read(ref cpu_reg_pc.v, out cpu_dummy); - cpu_reg_pc.v++; - Interrupt(); - } - - private static void BPL__() - { - cpu_bool_tmp = !cpu_flag_n; - Branch(ref cpu_bool_tmp); - } - - private static void BNE__() - { - cpu_bool_tmp = !cpu_flag_z; - Branch(ref cpu_bool_tmp); - } - - private static void BMI__() - { - Branch(ref cpu_flag_n); - } - - private static void BVC__() - { - cpu_bool_tmp = !cpu_flag_v; - Branch(ref cpu_bool_tmp); - } - - private static void BVS__() - { - Branch(ref cpu_flag_v); - } - - private static void SED__() - { - cpu_flag_d = true; - } - - private static void CLC__() - { - cpu_flag_c = false; - } - - private static void CLD__() - { - cpu_flag_d = false; - } - - private static void CLV__() - { - cpu_flag_v = false; - } - - private static void CMP__() - { - cpu_int_temp = cpu_reg_a - cpu_m; - cpu_flag_n = (cpu_int_temp & 0x80) == 128; - cpu_flag_c = cpu_reg_a >= cpu_m; - cpu_flag_z = cpu_int_temp == 0; - } - - private static void CPX__() - { - cpu_int_temp = cpu_reg_x - cpu_m; - cpu_flag_n = (cpu_int_temp & 0x80) == 128; - cpu_flag_c = cpu_reg_x >= cpu_m; - cpu_flag_z = cpu_int_temp == 0; - } - - private static void CPY__() - { - cpu_int_temp = cpu_reg_y - cpu_m; - cpu_flag_n = (cpu_int_temp & 0x80) == 128; - cpu_flag_c = cpu_reg_y >= cpu_m; - cpu_flag_z = cpu_int_temp == 0; - } - - private static void CLI__() - { - cpu_flag_i = false; - } - - private static void DCP__() - { - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_m--; - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_int_temp = cpu_reg_a - cpu_m; - cpu_flag_n = (cpu_int_temp & 0x80) != 0; - cpu_flag_z = cpu_int_temp == 0; - cpu_flag_c = ~cpu_int_temp >> 8 != 0; - } - - private static void DEC__() - { - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_m--; - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_flag_n = (cpu_m & 0x80) == 128; - cpu_flag_z = cpu_m == 0; - } - - private static void DEY__() - { - cpu_reg_y--; - cpu_flag_z = cpu_reg_y == 0; - cpu_flag_n = (cpu_reg_y & 0x80) == 128; - } - - private static void DEX__() - { - cpu_reg_x--; - cpu_flag_z = cpu_reg_x == 0; - cpu_flag_n = (cpu_reg_x & 0x80) == 128; - } - - private static void EOR__() - { - cpu_reg_a ^= cpu_m; - cpu_flag_n = (cpu_reg_a & 0x80) == 128; - cpu_flag_z = cpu_reg_a == 0; - } - - private static void INC__() - { - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_m++; - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_flag_n = (cpu_m & 0x80) == 128; - cpu_flag_z = cpu_m == 0; - } - - private static void INX__() - { - cpu_reg_x++; - cpu_flag_z = cpu_reg_x == 0; - cpu_flag_n = (cpu_reg_x & 0x80) == 128; - } - - private static void INY__() - { - cpu_reg_y++; - cpu_flag_n = (cpu_reg_y & 0x80) == 128; - cpu_flag_z = cpu_reg_y == 0; - } - - private static void ISC__() - { - Read(ref cpu_reg_ea.v, out cpu_byte_temp); - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_byte_temp++; - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_int_temp = cpu_byte_temp ^ 0xFF; - cpu_int_temp1 = cpu_reg_a + cpu_int_temp + (cpu_flag_c ? 1 : 0); - cpu_flag_n = (cpu_int_temp1 & 0x80) != 0; - cpu_flag_v = ((cpu_int_temp1 ^ cpu_reg_a) & (cpu_int_temp1 ^ cpu_int_temp) & 0x80) != 0; - cpu_flag_z = (cpu_int_temp1 & 0xFF) == 0; - cpu_flag_c = cpu_int_temp1 >> 8 != 0; - cpu_reg_a = (byte)((uint)cpu_int_temp1 & 0xFFu); - } - - private static void JMP__() - { - cpu_reg_pc.v = cpu_reg_ea.v; - } - - private static void JMP_I() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - Read(ref cpu_reg_ea.v, out cpu_reg_pc.l); - cpu_reg_ea.l++; - Read(ref cpu_reg_ea.v, out cpu_reg_pc.h); - } - - private static void JSR__() - { - Read(ref cpu_reg_pc.v, out cpu_reg_ea.l); - cpu_reg_pc.v++; - Write(ref cpu_reg_sp.v, ref cpu_reg_ea.l); - Push(ref cpu_reg_pc.h); - Push(ref cpu_reg_pc.l); - Read(ref cpu_reg_pc.v, out cpu_reg_ea.h); - cpu_reg_pc.v = cpu_reg_ea.v; - } - - private static void LAR__() - { - cpu_reg_sp.l &= cpu_m; - cpu_reg_a = cpu_reg_sp.l; - cpu_reg_x = cpu_reg_sp.l; - cpu_flag_n = (cpu_reg_sp.l & 0x80) != 0; - cpu_flag_z = (cpu_reg_sp.l & 0xFF) == 0; - } - - private static void LAX__() - { - cpu_reg_x = (cpu_reg_a = cpu_m); - cpu_flag_n = (cpu_reg_x & 0x80) != 0; - cpu_flag_z = (cpu_reg_x & 0xFF) == 0; - } - - private static void LDA__() - { - cpu_reg_a = cpu_m; - cpu_flag_n = (cpu_reg_a & 0x80) == 128; - cpu_flag_z = cpu_reg_a == 0; - } - - private static void LDX__() - { - cpu_reg_x = cpu_m; - cpu_flag_n = (cpu_reg_x & 0x80) == 128; - cpu_flag_z = cpu_reg_x == 0; - } - - private static void LDY__() - { - cpu_reg_y = cpu_m; - cpu_flag_n = (cpu_reg_y & 0x80) == 128; - cpu_flag_z = cpu_reg_y == 0; - } - - private static void LSR_A() - { - cpu_flag_c = (cpu_reg_a & 1) == 1; - cpu_reg_a >>= 1; - cpu_flag_z = cpu_reg_a == 0; - cpu_flag_n = (cpu_reg_a & 0x80) != 0; - } - - private static void LSR_M() - { - cpu_flag_c = (cpu_m & 1) == 1; - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_m >>= 1; - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_flag_z = cpu_m == 0; - cpu_flag_n = (cpu_m & 0x80) != 0; - } - - private static void NOP__() - { - } - - private static void ORA__() - { - cpu_reg_a |= cpu_m; - cpu_flag_n = (cpu_reg_a & 0x80) == 128; - cpu_flag_z = cpu_reg_a == 0; - } - - private static void PHA__() - { - Push(ref cpu_reg_a); - } - - private static void PHP__() - { - cpu_dummy = register_pb(); - Push(ref cpu_dummy); - } - - private static void PLA__() - { - Read(ref cpu_reg_sp.v, out cpu_dummy); - Pull(out cpu_reg_a); - cpu_flag_n = (cpu_reg_a & 0x80) == 128; - cpu_flag_z = cpu_reg_a == 0; - } - - private static void PLP__() - { - Read(ref cpu_reg_sp.v, out cpu_dummy); - Pull(out cpu_dummy); - register_p = cpu_dummy; - } - - private static void RLA__() - { - Read(ref cpu_reg_ea.v, out cpu_byte_temp); - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_dummy = (byte)((uint)(cpu_byte_temp << 1) | (cpu_flag_c ? 1u : 0u)); - Write(ref cpu_reg_ea.v, ref cpu_dummy); - cpu_flag_n = (cpu_dummy & 0x80) != 0; - cpu_flag_z = (cpu_dummy & 0xFF) == 0; - cpu_flag_c = (cpu_byte_temp & 0x80) != 0; - cpu_reg_a &= cpu_dummy; - cpu_flag_n = (cpu_reg_a & 0x80) != 0; - cpu_flag_z = (cpu_reg_a & 0xFF) == 0; - } - - private static void ROL_A() - { - cpu_byte_temp = (byte)((uint)(cpu_reg_a << 1) | (cpu_flag_c ? 1u : 0u)); - cpu_flag_n = (cpu_byte_temp & 0x80) != 0; - cpu_flag_z = (cpu_byte_temp & 0xFF) == 0; - cpu_flag_c = (cpu_reg_a & 0x80) != 0; - cpu_reg_a = cpu_byte_temp; - } - - private static void ROL_M() - { - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_byte_temp = (byte)((uint)(cpu_m << 1) | (cpu_flag_c ? 1u : 0u)); - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_flag_n = (cpu_byte_temp & 0x80) != 0; - cpu_flag_z = (cpu_byte_temp & 0xFF) == 0; - cpu_flag_c = (cpu_m & 0x80) != 0; - } - - private static void ROR_A() - { - cpu_byte_temp = (byte)((uint)(cpu_reg_a >> 1) | (cpu_flag_c ? 128u : 0u)); - cpu_flag_n = (cpu_byte_temp & 0x80) != 0; - cpu_flag_z = (cpu_byte_temp & 0xFF) == 0; - cpu_flag_c = (cpu_reg_a & 1) != 0; - cpu_reg_a = cpu_byte_temp; - } - - private static void ROR_M() - { - Write(ref cpu_reg_ea.v, ref cpu_m); - cpu_byte_temp = (byte)((uint)(cpu_m >> 1) | (cpu_flag_c ? 128u : 0u)); - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_flag_n = (cpu_byte_temp & 0x80) != 0; - cpu_flag_z = (cpu_byte_temp & 0xFF) == 0; - cpu_flag_c = (cpu_m & 1) != 0; - } - - private static void RRA__() - { - Read(ref cpu_reg_ea.v, out cpu_byte_temp); - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_dummy = (byte)((uint)(cpu_byte_temp >> 1) | (cpu_flag_c ? 128u : 0u)); - Write(ref cpu_reg_ea.v, ref cpu_dummy); - cpu_flag_n = (cpu_dummy & 0x80) != 0; - cpu_flag_z = (cpu_dummy & 0xFF) == 0; - cpu_flag_c = (cpu_byte_temp & 1) != 0; - cpu_byte_temp = cpu_dummy; - cpu_int_temp = cpu_reg_a + cpu_byte_temp + (cpu_flag_c ? 1 : 0); - cpu_flag_n = (cpu_int_temp & 0x80) != 0; - cpu_flag_v = ((cpu_int_temp ^ cpu_reg_a) & (cpu_int_temp ^ cpu_byte_temp) & 0x80) != 0; - cpu_flag_z = (cpu_int_temp & 0xFF) == 0; - cpu_flag_c = cpu_int_temp >> 8 != 0; - cpu_reg_a = (byte)cpu_int_temp; - } - - private static void RTI__() - { - Read(ref cpu_reg_sp.v, out cpu_dummy); - Pull(out cpu_dummy); - register_p = cpu_dummy; - Pull(out cpu_reg_pc.l); - Pull(out cpu_reg_pc.h); - } - - private static void RTS__() - { - Read(ref cpu_reg_sp.v, out cpu_dummy); - Pull(out cpu_reg_pc.l); - Pull(out cpu_reg_pc.h); - cpu_reg_pc.v++; - Read(ref cpu_reg_pc.v, out cpu_dummy); - } - - private static void SAX__() - { - cpu_dummy = (byte)(cpu_reg_x & cpu_reg_a); - Write(ref cpu_reg_ea.v, ref cpu_dummy); - } - - private static void SBC__() - { - cpu_m ^= byte.MaxValue; - cpu_int_temp = cpu_reg_a + cpu_m + (cpu_flag_c ? 1 : 0); - cpu_flag_n = (cpu_int_temp & 0x80) != 0; - cpu_flag_v = ((cpu_int_temp ^ cpu_reg_a) & (cpu_int_temp ^ cpu_m) & 0x80) != 0; - cpu_flag_z = (cpu_int_temp & 0xFF) == 0; - cpu_flag_c = cpu_int_temp >> 8 != 0; - cpu_reg_a = (byte)cpu_int_temp; - } - - private static void SEC__() - { - cpu_flag_c = true; - } - - private static void SEI__() - { - cpu_flag_i = true; - } - - private static void SHX__() - { - cpu_byte_temp = (byte)(cpu_reg_x & (cpu_reg_ea.h + 1)); - Read(ref cpu_reg_ea.v, out cpu_dummy); - cpu_reg_ea.l += cpu_reg_y; - if (cpu_reg_ea.l < cpu_reg_y) - { - cpu_reg_ea.h = cpu_byte_temp; - } - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - } - - private static void SHY__() - { - cpu_byte_temp = (byte)(cpu_reg_y & (cpu_reg_ea.h + 1)); - Read(ref cpu_reg_ea.v, out cpu_dummy); - cpu_reg_ea.l += cpu_reg_x; - if (cpu_reg_ea.l < cpu_reg_x) - { - cpu_reg_ea.h = cpu_byte_temp; - } - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - } - - private static void SLO__() - { - Read(ref cpu_reg_ea.v, out cpu_byte_temp); - cpu_flag_c = (cpu_byte_temp & 0x80) != 0; - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_byte_temp <<= 1; - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_flag_n = (cpu_byte_temp & 0x80) != 0; - cpu_flag_z = (cpu_byte_temp & 0xFF) == 0; - cpu_reg_a |= cpu_byte_temp; - cpu_flag_n = (cpu_reg_a & 0x80) != 0; - cpu_flag_z = (cpu_reg_a & 0xFF) == 0; - } - - private static void SRE__() - { - Read(ref cpu_reg_ea.v, out cpu_byte_temp); - cpu_flag_c = (cpu_byte_temp & 1) != 0; - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_byte_temp >>= 1; - Write(ref cpu_reg_ea.v, ref cpu_byte_temp); - cpu_flag_n = (cpu_byte_temp & 0x80) != 0; - cpu_flag_z = (cpu_byte_temp & 0xFF) == 0; - cpu_reg_a ^= cpu_byte_temp; - cpu_flag_n = (cpu_reg_a & 0x80) != 0; - cpu_flag_z = (cpu_reg_a & 0xFF) == 0; - } - - private static void STA__() - { - Write(ref cpu_reg_ea.v, ref cpu_reg_a); - } - - private static void STX__() - { - Write(ref cpu_reg_ea.v, ref cpu_reg_x); - } - - private static void STY__() - { - Write(ref cpu_reg_ea.v, ref cpu_reg_y); - } - - private static void TAX__() - { - cpu_reg_x = cpu_reg_a; - cpu_flag_n = (cpu_reg_x & 0x80) == 128; - cpu_flag_z = cpu_reg_x == 0; - } - - private static void TAY__() - { - cpu_reg_y = cpu_reg_a; - cpu_flag_n = (cpu_reg_y & 0x80) == 128; - cpu_flag_z = cpu_reg_y == 0; - } - - private static void TSX__() - { - cpu_reg_x = cpu_reg_sp.l; - cpu_flag_n = (cpu_reg_x & 0x80) != 0; - cpu_flag_z = cpu_reg_x == 0; - } - - private static void TXA__() - { - cpu_reg_a = cpu_reg_x; - cpu_flag_n = (cpu_reg_a & 0x80) == 128; - cpu_flag_z = cpu_reg_a == 0; - } - - private static void TXS__() - { - cpu_reg_sp.l = cpu_reg_x; - } - - private static void TYA__() - { - cpu_reg_a = cpu_reg_y; - cpu_flag_n = (cpu_reg_a & 0x80) == 128; - cpu_flag_z = cpu_reg_a == 0; - } - - private static void XAA__() - { - cpu_reg_a = (byte)(cpu_reg_x & cpu_m); - cpu_flag_n = (cpu_reg_a & 0x80) != 0; - cpu_flag_z = (cpu_reg_a & 0xFF) == 0; - } - - private static void XAS__() - { - cpu_reg_sp.l = (byte)(cpu_reg_a & cpu_reg_x); - Write(ref cpu_reg_ea.v, ref cpu_reg_sp.l); - } - - private static void CPUWriteState(ref BinaryWriter bin) - { - bin.Write(cpu_reg_pc.v); - bin.Write(cpu_reg_sp.v); - bin.Write(cpu_reg_ea.v); - bin.Write(cpu_reg_a); - bin.Write(cpu_reg_x); - bin.Write(cpu_reg_y); - bin.Write(cpu_flag_n); - bin.Write(cpu_flag_v); - bin.Write(cpu_flag_d); - bin.Write(cpu_flag_i); - bin.Write(cpu_flag_z); - bin.Write(cpu_flag_c); - bin.Write(cpu_m); - bin.Write(cpu_opcode); - bin.Write(cpu_byte_temp); - bin.Write(cpu_int_temp); - bin.Write(cpu_int_temp1); - bin.Write(cpu_dummy); - bin.Write(cpu_bool_tmp); - bin.Write(temp_add.v); - bin.Write(CPU_IRQ_PIN); - bin.Write(CPU_NMI_PIN); - bin.Write(cpu_suspend_nmi); - bin.Write(cpu_suspend_irq); - } - - private static void CPUReadState(ref BinaryReader bin) - { - cpu_reg_pc.v = bin.ReadUInt16(); - cpu_reg_sp.v = bin.ReadUInt16(); - cpu_reg_ea.v = bin.ReadUInt16(); - cpu_reg_a = bin.ReadByte(); - cpu_reg_x = bin.ReadByte(); - cpu_reg_y = bin.ReadByte(); - cpu_flag_n = bin.ReadBoolean(); - cpu_flag_v = bin.ReadBoolean(); - cpu_flag_d = bin.ReadBoolean(); - cpu_flag_i = bin.ReadBoolean(); - cpu_flag_z = bin.ReadBoolean(); - cpu_flag_c = bin.ReadBoolean(); - cpu_m = bin.ReadByte(); - cpu_opcode = bin.ReadByte(); - cpu_byte_temp = bin.ReadByte(); - cpu_int_temp = bin.ReadInt32(); - cpu_int_temp1 = bin.ReadInt32(); - cpu_dummy = bin.ReadByte(); - cpu_bool_tmp = bin.ReadBoolean(); - temp_add.v = bin.ReadUInt16(); - CPU_IRQ_PIN = bin.ReadBoolean(); - CPU_NMI_PIN = bin.ReadBoolean(); - cpu_suspend_nmi = bin.ReadBoolean(); - cpu_suspend_irq = bin.ReadBoolean(); - } - - private static void DMAHardReset() - { - dma_DMCDMAWaitCycles = 0; - dma_OAMDMAWaitCycles = 0; - dma_isOamDma = false; - dma_oamdma_i = 0; - dma_DMCOn = false; - dma_OAMOn = false; - dma_DMC_occurring = false; - dma_OAM_occurring = false; - dma_OAMFinishCounter = 0; - dma_Oamaddress = 0; - dma_OAMCYCLE = 0; - dma_latch = 0; - reg_2004 = 8196; - } - - private static void DMASoftReset() - { - dma_DMCDMAWaitCycles = 0; - dma_OAMDMAWaitCycles = 0; - dma_isOamDma = false; - dma_oamdma_i = 0; - dma_DMCOn = false; - dma_OAMOn = false; - dma_DMC_occurring = false; - dma_OAM_occurring = false; - dma_OAMFinishCounter = 0; - dma_Oamaddress = 0; - dma_OAMCYCLE = 0; - dma_latch = 0; - } - - internal static void AssertDMCDMA() - { - if (dma_OAM_occurring) - { - if (dma_OAMCYCLE < 508) - { - dma_DMCDMAWaitCycles = (BUS_RW ? 1 : 0); - } - else - { - dma_DMCDMAWaitCycles = 4 - (512 - dma_OAMCYCLE); - } - } - else - { - if (dma_DMC_occurring) - { - return; - } - dma_DMCDMAWaitCycles = (BUS_RW ? 3 : 2); - if (dma_OAMFinishCounter == 3) - { - dma_DMCDMAWaitCycles++; - } - } - dma_isOamDma = false; - dma_DMCOn = true; - } - - private static void AssertOAMDMA() - { - if (!dma_OAM_occurring) - { - dma_OAMDMAWaitCycles = (apu_odd_cycle ? 1 : 2); - dma_isOamDma = true; - dma_OAMOn = true; - } - } - - private static void DMAClock() - { - if (dma_OAMFinishCounter > 0) - { - dma_OAMFinishCounter--; - } - if (!BUS_RW) - { - if (dma_DMCDMAWaitCycles > 0) - { - dma_DMCDMAWaitCycles--; - } - if (dma_OAMDMAWaitCycles > 0) - { - dma_OAMDMAWaitCycles--; - } - return; - } - if (dma_DMCOn) - { - dma_DMC_occurring = true; - dma_DMCOn = false; - if (dma_DMCDMAWaitCycles > 0) - { - if (BUS_ADDRESS == 16406 || BUS_ADDRESS == 16407) - { - Read(ref BUS_ADDRESS, out dma_dummy); - dma_DMCDMAWaitCycles--; - while (dma_DMCDMAWaitCycles > 0) - { - EmuClockComponents(); - dma_DMCDMAWaitCycles--; - } - } - else - { - if (dma_DMCDMAWaitCycles > 0) - { - EmuClockComponents(); - dma_DMCDMAWaitCycles--; - } - while (dma_DMCDMAWaitCycles > 0) - { - Read(ref BUS_ADDRESS, out dma_dummy); - dma_DMCDMAWaitCycles--; - } - } - } - DMCDoDMA(); - dma_DMC_occurring = false; - } - if (!dma_OAMOn) - { - return; - } - dma_OAM_occurring = true; - dma_OAMOn = false; - if (dma_OAMDMAWaitCycles > 0) - { - if (BUS_ADDRESS == 16406 || BUS_ADDRESS == 16407) - { - Read(ref BUS_ADDRESS, out dma_dummy); - dma_OAMDMAWaitCycles--; - while (dma_OAMDMAWaitCycles > 0) - { - EmuClockComponents(); - dma_OAMDMAWaitCycles--; - } - } - else - { - if (dma_OAMDMAWaitCycles > 0) - { - EmuClockComponents(); - dma_OAMDMAWaitCycles--; - } - while (dma_OAMDMAWaitCycles > 0) - { - Read(ref BUS_ADDRESS, out dma_dummy); - dma_OAMDMAWaitCycles--; - } - } - } - dma_OAMCYCLE = 0; - for (dma_oamdma_i = 0; dma_oamdma_i < 256; dma_oamdma_i++) - { - Read(ref dma_Oamaddress, out dma_latch); - dma_OAMCYCLE++; - Write(ref reg_2004, ref dma_latch); - dma_OAMCYCLE++; - dma_Oamaddress = (ushort)(++dma_Oamaddress & 0xFFFFu); - } - dma_OAMCYCLE = 0; - dma_OAMFinishCounter = 5; - dma_OAM_occurring = false; - } - - private static void DMAWriteState(ref BinaryWriter bin) - { - bin.Write(dma_DMCDMAWaitCycles); - bin.Write(dma_OAMDMAWaitCycles); - bin.Write(dma_isOamDma); - bin.Write(dma_oamdma_i); - bin.Write(dma_DMCOn); - bin.Write(dma_OAMOn); - bin.Write(dma_DMC_occurring); - bin.Write(dma_OAM_occurring); - bin.Write(dma_OAMFinishCounter); - bin.Write(dma_Oamaddress); - bin.Write(dma_OAMCYCLE); - bin.Write(dma_latch); - bin.Write(dma_dummy); - } - - private static void DMAReadState(ref BinaryReader bin) - { - dma_DMCDMAWaitCycles = bin.ReadInt32(); - dma_OAMDMAWaitCycles = bin.ReadInt32(); - dma_isOamDma = bin.ReadBoolean(); - dma_oamdma_i = bin.ReadInt32(); - dma_DMCOn = bin.ReadBoolean(); - dma_OAMOn = bin.ReadBoolean(); - dma_DMC_occurring = bin.ReadBoolean(); - dma_OAM_occurring = bin.ReadBoolean(); - dma_OAMFinishCounter = bin.ReadInt32(); - dma_Oamaddress = bin.ReadUInt16(); - dma_OAMCYCLE = bin.ReadInt32(); - dma_latch = bin.ReadByte(); - dma_dummy = bin.ReadByte(); - } - - private static void PollInterruptStatus() - { - if (!cpu_suspend_nmi) - { - if (PPU_NMI_Current & !PPU_NMI_Old) - { - CPU_NMI_PIN = true; - } - PPU_NMI_Old = (PPU_NMI_Current = false); - } - if (!cpu_suspend_irq) - { - CPU_IRQ_PIN = !cpu_flag_i && IRQFlags != 0; - } - if (CPU_NMI_PIN) - { - InterruptVector = 65530; - } - else - { - InterruptVector = 65534; - } - } - - private static void InterruptsWriteState(ref BinaryWriter bin) - { - bin.Write(IRQFlags); - bin.Write(PPU_NMI_Current); - bin.Write(PPU_NMI_Old); - bin.Write(InterruptVector); - } - - private static void InterruptsReadState(ref BinaryReader bin) - { - IRQFlags = bin.ReadInt32(); - PPU_NMI_Current = bin.ReadBoolean(); - PPU_NMI_Old = bin.ReadBoolean(); - InterruptVector = bin.ReadUInt16(); - } - - public static void SetupGameGenie(bool IsGameGenieActive, GameGenieCode[] GameGenieCodes) - { - if (mem_board != null) - { - mem_board.SetupGameGenie(IsGameGenieActive, GameGenieCodes); - } - } - - private static void MEMInitialize(IRom rom) - { - Tracer.WriteLine("Looking for mapper # " + rom.MapperNumber + "...."); - if (MyNesMain.IsBoardExist(rom.MapperNumber)) - { - Tracer.WriteLine("Mapper # " + rom.MapperNumber + " located, assigning..."); - mem_board = MyNesMain.GetBoard(rom.MapperNumber); - Tracer.WriteInformation("Mapper # " + rom.MapperNumber + " assigned successfully."); - if (mem_board.HasIssues) - { - Tracer.WriteWarning(MNInterfaceLanguage.Mapper + " # " + mem_board.MapperNumber + " [" + mem_board.Name + "] " + MNInterfaceLanguage.Message_Error17); - MyNesMain.VideoProvider.WriteWarningNotification(MNInterfaceLanguage.Mapper + " # " + mem_board.MapperNumber + " [" + mem_board.Name + "] " + MNInterfaceLanguage.Message_Error17, instant: false); - } - } - else - { - Tracer.WriteError("Mapper # " + rom.MapperNumber + " IS NOT LOCATED, mapper is not supported or unable to find it."); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Mapper + " # " + rom.MapperNumber + " " + MNInterfaceLanguage.Message_Error14, instant: false); - mem_board = MyNesMain.GetBoard(0); - Tracer.WriteWarning("Mapper # 0 [NROM] will be used instead, assigned successfully."); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Mapper + " # 0 [NROM] " + MNInterfaceLanguage.Message_Error15, instant: false); - } - mem_read_accesses = new MemReadAccess[65536]; - mem_write_accesses = new MemWriteAccess[65536]; - MEMMap(MEMReadWRAM, new ushort[2] { 0, 4096 }); - MEMMap(MEMWriteWRAM, new ushort[2] { 0, 4096 }); - MEMMap(PPUIORead, new ushort[2] { 8192, 12288 }); - MEMMap(PPUIOWrite, new ushort[2] { 8192, 12288 }); - MEMMap(APUIORead, new ushort[1] { 16384 }); - MEMMap(APUIOWrite, new ushort[1] { 16384 }); - MEMMap(mem_board.ReadEX, new ushort[1] { 20480 }); - MEMMap(mem_board.WriteEX, new ushort[1] { 20480 }); - MEMMap(mem_board.ReadSRM, new ushort[2] { 24576, 28672 }); - MEMMap(mem_board.WriteSRM, new ushort[2] { 24576, 28672 }); - MEMMap(mem_board.ReadPRG, new ushort[8] { 32768, 36864, 40960, 45056, 49152, 53248, 57344, 61440 }); - MEMMap(mem_board.WritePRG, new ushort[8] { 32768, 36864, 40960, 45056, 49152, 53248, 57344, 61440 }); - mem_board.Initialize(rom); - mem_wram = new byte[2048]; - } - - private static void MEMHardReset() - { - mem_wram = new byte[2048]; - mem_wram[8] = 247; - mem_wram[9] = 239; - mem_wram[10] = 223; - mem_wram[15] = 191; - Tracer.WriteLine("Reading SRAM ..."); - SRAMFileName = Path.Combine(MyNesMain.EmuSettings.SRAMFolder, Path.GetFileNameWithoutExtension(CurrentFilePath) + ".srm"); - if (File.Exists(SRAMFileName)) - { - FileStream fileStream = new FileStream(SRAMFileName, FileMode.Open, FileAccess.Read); - byte[] array = new byte[fileStream.Length]; - fileStream.Read(array, 0, array.Length); - fileStream.Flush(); - fileStream.Close(); - byte[] outData = new byte[0]; - ZlipWrapper.DecompressData(array, out outData); - mem_board.LoadSRAM(outData); - Tracer.WriteLine("SRAM read successfully."); - } - else - { - Tracer.WriteLine("SRAM file not found; rom has no SRAM or file not exist."); - } - ReloadGameGenieCodes(); - mem_board.HardReset(); - } - - public static void ReloadGameGenieCodes() - { - Tracer.WriteLine("Reading game genie codes (if available)...."); - GMFileName = Path.Combine(MyNesMain.EmuSettings.GameGenieFolder, Path.GetFileNameWithoutExtension(CurrentFilePath) + ".txt"); - mem_board.GameGenieCodes = new GameGenieCode[0]; - if (File.Exists(GMFileName)) - { - XmlReaderSettings xmlReaderSettings = new XmlReaderSettings(); - xmlReaderSettings.DtdProcessing = DtdProcessing.Ignore; - xmlReaderSettings.IgnoreWhitespace = true; - XmlReader xmlReader = XmlReader.Create(GMFileName, xmlReaderSettings); - xmlReader.Read(); - xmlReader.Read(); - if (xmlReader.Name != "MyNesGameGenieCodesList") - { - xmlReader.Close(); - return; - } - GameGenie gameGenie = new GameGenie(); - List list = new List(); - while (xmlReader.Read()) - { - if (xmlReader.Name == "Code") - { - GameGenieCode item = default(GameGenieCode); - item.Enabled = true; - xmlReader.MoveToAttribute("code"); - item.Name = xmlReader.Value.ToString(); - if (item.Name.Length == 6) - { - item.Address = gameGenie.GetGGAddress(gameGenie.GetCodeAsHEX(item.Name), 6) | 0x8000; - item.Value = gameGenie.GetGGValue(gameGenie.GetCodeAsHEX(item.Name), 6); - item.IsCompare = false; - } - else - { - item.Address = gameGenie.GetGGAddress(gameGenie.GetCodeAsHEX(item.Name), 8) | 0x8000; - item.Value = gameGenie.GetGGValue(gameGenie.GetCodeAsHEX(item.Name), 8); - item.Compare = gameGenie.GetGGCompareValue(gameGenie.GetCodeAsHEX(item.Name)); - item.IsCompare = true; - } - list.Add(item); - } - } - xmlReader.Close(); - if (list.Count > 0) - { - mem_board.GameGenieCodes = list.ToArray(); - Tracer.WriteInformation("Game Genie codes loaded successfully, total of " + list.Count); - } - else - { - Tracer.WriteError("There is no Game Genie code in the file to load."); - } - } - else - { - Tracer.WriteWarning("No Game Genie file found for this game."); - } - } - - private static void MEMMap(MemReadAccess readAccess, ushort[] addresses) - { - for (int i = 0; i < addresses.Length; i++) - { - mem_read_accesses[(addresses[i] & 0xF000) >> 12] = readAccess; - } - } - - private static void MEMMap(MemWriteAccess writeAccess, ushort[] addresses) - { - for (int i = 0; i < addresses.Length; i++) - { - mem_write_accesses[(addresses[i] & 0xF000) >> 12] = writeAccess; - } - } - - private static void MEMReadWRAM(ref ushort addr, out byte value) - { - value = mem_wram[addr & 0x7FF]; - } - - private static void MEMWriteWRAM(ref ushort addr, ref byte value) - { - mem_wram[addr & 0x7FF] = value; - } - - internal static void Read(ref ushort addr, out byte value) - { - BUS_RW = true; - BUS_ADDRESS = addr; - EmuClockComponents(); - mem_read_accesses[(addr & 0xF000) >> 12](ref addr, out value); - } - - private static void Write(ref ushort addr, ref byte value) - { - BUS_RW = false; - BUS_ADDRESS = addr; - EmuClockComponents(); - mem_write_accesses[(addr & 0xF000) >> 12](ref addr, ref value); - } - - internal static void SaveSRAM() - { - if (mem_board != null && MyNesMain.EmuSettings.SaveSRAMAtEmuShutdown && mem_board.SRAMSaveRequired) - { - Tracer.WriteLine("Saving SRAM ..."); - byte[] outData = new byte[0]; - ZlipWrapper.CompressData(mem_board.GetSRAMBuffer(), out outData); - FileStream fileStream = new FileStream(SRAMFileName, FileMode.Create, FileAccess.Write); - fileStream.Write(outData, 0, outData.Length); - fileStream.Flush(); - fileStream.Close(); - Tracer.WriteLine("SRAM saved successfully."); - } - } - - private static void MEMWriteState(ref BinaryWriter bin) - { - mem_board.WriteStateData(ref bin); - bin.Write(mem_wram); - bin.Write(BUS_RW); - bin.Write(BUS_ADDRESS); - } - - private static void MEMReadState(ref BinaryReader bin) - { - mem_board.ReadStateData(ref bin); - bin.Read(mem_wram, 0, mem_wram.Length); - BUS_RW = bin.ReadBoolean(); - BUS_ADDRESS = bin.ReadUInt16(); - } - - private static void PORTSInitialize() - { - if (joypad1 == null) - { - joypad1 = new BlankJoypad(); - } - if (joypad2 == null) - { - joypad2 = new BlankJoypad(); - } - if (joypad3 == null) - { - joypad3 = new BlankJoypad(); - } - if (joypad4 == null) - { - joypad4 = new BlankJoypad(); - } - } - - public static void SetupControllers(IJoypadConnecter joy1, IJoypadConnecter joy2, IJoypadConnecter joy3, IJoypadConnecter joy4) - { - joypad1 = joy1; - joypad2 = joy2; - joypad3 = joy3; - joypad4 = joy4; - } - - public static void SetupVSUnisystemDIP(IVSUnisystemDIPConnecter uni) - { - } - - public static void SetupControllersP1(IJoypadConnecter joy) - { - joypad1 = joy; - } - - public static void SetupControllersP2(IJoypadConnecter joy) - { - joypad2 = joy; - } - - public static void SetupControllersP3(IJoypadConnecter joy) - { - joypad3 = joy; - } - - public static void SetupControllersP4(IJoypadConnecter joy) - { - joypad4 = joy; - } - - public static void DestroyJoypads() - { - if (joypad1 == null) - { - joypad1 = new BlankJoypad(); - } - else - { - joypad1.Destroy(); - } - if (joypad2 == null) - { - joypad2 = new BlankJoypad(); - } - else - { - joypad1.Destroy(); - } - if (joypad3 == null) - { - joypad3 = new BlankJoypad(); - } - else - { - joypad1.Destroy(); - } - if (joypad4 == null) - { - joypad4 = new BlankJoypad(); - } - else - { - joypad1.Destroy(); - } - } - - private static void PORTWriteState(ref BinaryWriter bin) - { - bin.Write(PORT0); - bin.Write(PORT1); - bin.Write(inputStrobe); - } - - private static void PORTReadState(ref BinaryReader bin) - { - PORT0 = bin.ReadInt32(); - PORT1 = bin.ReadInt32(); - inputStrobe = bin.ReadInt32(); - } - - public static void SetupPalette(int[] pal) - { - ppu_palette = pal; - } - - private static void PPUInitialize() - { - ppu_reg_update_func = new Action[8] { PPUOnRegister2000, PPUOnRegister2001, PPUOnRegister2002, PPUOnRegister2003, PPUOnRegister2004, PPUOnRegister2005, PPUOnRegister2006, PPUOnRegister2007 }; - ppu_reg_read_func = new Action[8] { PPURead2000, PPURead2001, PPURead2002, PPURead2003, PPURead2004, PPURead2005, PPURead2006, PPURead2007 }; - ppu_bkg_fetches = new Action[8] { PPUBKFetch0, PPUBKFetch1, PPUBKFetch2, PPUBKFetch3, PPUBKFetch4, PPUBKFetch5, PPUBKFetch6, PPUBKFetch7 }; - ppu_spr_fetches = new Action[8] { PPUBKFetch0, PPUBKFetch1, PPUBKFetch2, PPUBKFetch3, PPUSPRFetch0, PPUSPRFetch1, PPUSPRFetch2, PPUSPRFetch3 }; - ppu_oam_phases = new Action[9] { PPUOamPhase0, PPUOamPhase1, PPUOamPhase2, PPUOamPhase3, PPUOamPhase4, PPUOamPhase5, PPUOamPhase6, PPUOamPhase7, PPUOamPhase8 }; - ppu_h_clocks = new Action[341]; - ppu_h_clocks[0] = PPUHClock_000_Idle; - for (int i = 1; i < 257; i++) - { - ppu_h_clocks[i] = PPUHClock_1_256_BKGClocks; - } - for (int j = 257; j < 321; j++) - { - ppu_h_clocks[j] = PPUHClock_257_320_SPRClocks; - } - for (int k = 321; k < 337; k++) - { - ppu_h_clocks[k] = PPUHClock_321_336_DUMClocks; - } - for (int l = 337; l < 341; l++) - { - ppu_h_clocks[l] = PPUHClock_337_340_DUMClocks; - } - ppu_v_clocks = new Action[320]; - for (int m = 0; m < 240; m++) - { - ppu_v_clocks[m] = PPUScanlineRender; - } - ppu_v_clocks[240] = PPUScanlineVBLANK; - ppu_oam_bank = new byte[256]; - ppu_oam_bank_secondary = new byte[32]; - ppu_palette_bank = new byte[32]; - ppu_bkg_pixels = new int[512]; - ppu_spr_pixels = new int[512]; - ppu_screen_pixels = new int[61440]; - ppu_palette = NTSCPaletteGenerator.GeneratePalette(); - } - - private static void PPUHardReset() - { - ppu_reg_2001_grayscale = 243; - switch (Region) - { - case EmuRegion.NTSC: - ppu_clock_vblank_start = 241; - ppu_clock_vblank_end = 261; - ppu_use_odd_cycle = true; - break; - case EmuRegion.PALB: - ppu_clock_vblank_start = 241; - ppu_clock_vblank_end = 311; - ppu_use_odd_cycle = false; - break; - case EmuRegion.DENDY: - { - ppu_clock_vblank_start = 291; - ppu_clock_vblank_end = 311; - for (int i = 241; i <= 290; i++) - { - ppu_v_clocks[i] = PPUScanlineVBLANK; - } - ppu_use_odd_cycle = false; - break; - } - } - ppu_v_clocks[ppu_clock_vblank_start] = PPUScanlineVBLANKStart; - for (int j = ppu_clock_vblank_start + 1; j <= ppu_clock_vblank_end - 1; j++) - { - ppu_v_clocks[j] = PPUScanlineVBLANK; - } - ppu_v_clocks[ppu_clock_vblank_end] = PPUScanlineVBLANKEnd; - ppu_oam_bank = new byte[256]; - ppu_oam_bank_secondary = new byte[32]; - PPUOamReset(); - ppu_palette_bank = new byte[32] - { - 9, 1, 0, 1, 0, 2, 2, 13, 8, 16, - 8, 36, 0, 0, 4, 44, 9, 1, 52, 3, - 0, 4, 0, 20, 8, 58, 0, 2, 0, 32, - 44, 8 - }; - ppu_reg_io_db = 0; - ppu_reg_io_addr = 0; - ppu_reg_access_happened = false; - ppu_reg_access_w = false; - ppu_reg_2000_vram_address_increament = 1; - ppu_reg_2000_sprite_pattern_table_address_for_8x8_sprites = 0; - ppu_reg_2000_background_pattern_table_address = 0; - ppu_reg_2000_Sprite_size = 0; - ppu_reg_2000_VBI = false; - ppu_reg_2001_show_background_in_leftmost_8_pixels_of_screen = false; - ppu_reg_2001_show_sprites_in_leftmost_8_pixels_of_screen = false; - ppu_reg_2001_show_background = false; - ppu_reg_2001_show_sprites = false; - ppu_reg_2001_grayscale = 63; - ppu_reg_2001_emphasis = 0; - ppu_reg_2002_SpriteOverflow = false; - ppu_reg_2002_Sprite0Hit = false; - ppu_reg_2002_VblankStartedFlag = false; - ppu_reg_2003_oam_addr = 0; - ppu_is_sprfetch = false; - ppu_use_odd_swap = false; - ppu_clock_h = 0; - ppu_clock_v = 0; - } - - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - private static void PPUClock() - { - mem_board.OnPPUClock(); - ppu_v_clocks[ppu_clock_v](); - ppu_clock_h++; - if (ppu_clock_h >= 341) - { - mem_board.OnPPUScanlineTick(); - if (ppu_clock_v == ppu_clock_vblank_end) - { - ppu_clock_v = 0; - ppu_frame_finished = true; - } - else - { - ppu_clock_v++; - } - ppu_clock_h -= 341; - } - if (ppu_reg_access_happened) - { - ppu_reg_access_happened = false; - ppu_reg_update_func[ppu_reg_io_addr](); - } - } - - public static int GetPixel(int x, int y) - { - return ppu_screen_pixels[y * 256 + x]; - } - - private static void PPUScanlineRender() - { - ppu_h_clocks[ppu_clock_h](); - } - - private static void PPUScanlineVBLANKStart() - { - ppu_is_nmi_time = (ppu_clock_h >= 1) & (ppu_clock_h <= 3); - if (ppu_is_nmi_time) - { - if (ppu_clock_h == 1) - { - ppu_reg_2002_VblankStartedFlag = true; - } - PPU_NMI_Current = ppu_reg_2002_VblankStartedFlag & ppu_reg_2000_VBI; - } - } - - private static void PPUScanlineVBLANKEnd() - { - ppu_is_nmi_time = (ppu_clock_h >= 1) & (ppu_clock_h <= 3); - if (ppu_clock_h == 1) - { - ppu_reg_2002_Sprite0Hit = false; - ppu_reg_2002_VblankStartedFlag = false; - ppu_reg_2002_SpriteOverflow = false; - } - PPUScanlineRender(); - if (ppu_use_odd_cycle && ppu_clock_h == 339) - { - ppu_use_odd_swap = !ppu_use_odd_swap; - if (!ppu_use_odd_swap & (ppu_reg_2001_show_background || ppu_reg_2001_show_sprites)) - { - ppu_odd_swap_done = true; - ppu_clock_h++; - } - } - } - - private static void PPUScanlineVBLANK() - { - } - - private static void PPUHClock_000_Idle() - { - if (ppu_odd_swap_done) - { - ppu_bkg_fetches[1](); - ppu_odd_swap_done = false; - } - } - - private static void PPUHClock_1_256_BKGClocks() - { - if (ppu_reg_2001_show_background || ppu_reg_2001_show_sprites) - { - if (ppu_clock_v != ppu_clock_vblank_end) - { - if (ppu_clock_h > 0 && ppu_clock_h < 65) - { - ppu_oam_bank_secondary[(ppu_clock_h - 1) & 0x1F] = byte.MaxValue; - } - else - { - if (ppu_clock_h == 65) - { - PPUOamReset(); - } - if (((ppu_clock_h - 1) & 1) == 0) - { - PPUOamEvFetch(); - } - else - { - ppu_oam_phases[ppu_phase_index](); - } - if (ppu_clock_h == 256) - { - PPUOamClear(); - } - } - } - ppu_bkg_fetches[(ppu_clock_h - 1) & 7](); - if (ppu_clock_v < 240) - { - RenderPixel(); - } - } - else - { - if (ppu_clock_v >= 240) - { - return; - } - if ((ppu_vram_addr & 0x3F00) == 16128) - { - if ((ppu_vram_addr & 3) == 0) - { - ppu_screen_pixels[ppu_clock_h - 1 + ppu_clock_v * 256] = ppu_palette[(ppu_palette_bank[ppu_vram_addr & 0xC] & ppu_reg_2001_grayscale) | ppu_reg_2001_emphasis]; - } - else - { - ppu_screen_pixels[ppu_clock_h - 1 + ppu_clock_v * 256] = ppu_palette[(ppu_palette_bank[ppu_vram_addr & 0x1F] & ppu_reg_2001_grayscale) | ppu_reg_2001_emphasis]; - } - } - else - { - ppu_screen_pixels[ppu_clock_h - 1 + ppu_clock_v * 256] = ppu_palette[(ppu_palette_bank[0] & ppu_reg_2001_grayscale) | ppu_reg_2001_emphasis]; - } - } - } - - private static void PPUHClock_257_320_SPRClocks() - { - if (ppu_reg_2001_show_background || ppu_reg_2001_show_sprites) - { - ppu_spr_fetches[(ppu_clock_h - 1) & 7](); - if (ppu_clock_h == 257) - { - ppu_vram_addr = (ushort)((ppu_vram_addr & 0x7BE0u) | (ppu_vram_addr_temp & 0x41Fu)); - } - if (ppu_clock_v == ppu_clock_vblank_end && ppu_clock_h >= 280 && ppu_clock_h <= 304) - { - ppu_vram_addr = (ushort)((ppu_vram_addr & 0x41Fu) | (ppu_vram_addr_temp & 0x7BE0u)); - } - } - } - - private static void PPUHClock_321_336_DUMClocks() - { - if (ppu_reg_2001_show_background || ppu_reg_2001_show_sprites) - { - ppu_bkg_fetches[(ppu_clock_h - 1) & 7](); - } - } - - private static void PPUHClock_337_340_DUMClocks() - { - if (ppu_reg_2001_show_background || ppu_reg_2001_show_sprites) - { - ppu_bkg_fetches[(ppu_clock_h - 1) & 1](); - } - } - - private static void PPUBKFetch0() - { - ppu_bkgfetch_nt_addr = (ushort)(0x2000u | (ppu_vram_addr & 0xFFFu)); - mem_board.OnPPUAddressUpdate(ref ppu_bkgfetch_nt_addr); - } - - private static void PPUBKFetch1() - { - mem_board.ReadNMT(ref ppu_bkgfetch_nt_addr, out ppu_bkgfetch_nt_data); - } - - private static void PPUBKFetch2() - { - ppu_bkgfetch_at_addr = (ushort)(0x23C0u | (ppu_vram_addr & 0xC00u) | ((uint)(ppu_vram_addr >> 4) & 0x38u) | ((uint)(ppu_vram_addr >> 2) & 7u)); - mem_board.OnPPUAddressUpdate(ref ppu_bkgfetch_at_addr); - } - - private static void PPUBKFetch3() - { - mem_board.ReadNMT(ref ppu_bkgfetch_at_addr, out ppu_bkgfetch_at_data); - ppu_bkgfetch_at_data = (byte)(ppu_bkgfetch_at_data >> (((ppu_vram_addr >> 4) & 4) | (ppu_vram_addr & 2))); - } - - private static void PPUBKFetch4() - { - ppu_bkgfetch_lb_addr = (ushort)((uint)(ppu_reg_2000_background_pattern_table_address | (ppu_bkgfetch_nt_data << 4)) | ((uint)(ppu_vram_addr >> 12) & 7u)); - mem_board.OnPPUAddressUpdate(ref ppu_bkgfetch_lb_addr); - } - - private static void PPUBKFetch5() - { - mem_board.ReadCHR(ref ppu_bkgfetch_lb_addr, out ppu_bkgfetch_lb_data); - } - - private static void PPUBKFetch6() - { - ppu_bkgfetch_hb_addr = (ushort)((uint)(ppu_reg_2000_background_pattern_table_address | (ppu_bkgfetch_nt_data << 4)) | 8u | ((uint)(ppu_vram_addr >> 12) & 7u)); - mem_board.OnPPUAddressUpdate(ref ppu_bkgfetch_hb_addr); - } - - private static void PPUBKFetch7() - { - mem_board.ReadCHR(ref ppu_bkgfetch_hb_addr, out ppu_bkgfetch_hb_data); - ppu_bkg_render_pos = ppu_clock_h + 8; - ppu_bkg_render_pos %= 336; - if (ppu_clock_h == 256) - { - if ((ppu_vram_addr & 0x7000) != 28672) - { - ppu_vram_addr += 4096; - } - else - { - ppu_vram_addr ^= 28672; - switch (ppu_vram_addr & 0x3E0) - { - case 928: - ppu_vram_addr ^= 2976; - break; - case 992: - ppu_vram_addr ^= 992; - break; - default: - ppu_vram_addr += 32; - break; - } - } - } - else if ((ppu_vram_addr & 0x1F) == 31) - { - ppu_vram_addr ^= 1055; - } - else - { - ppu_vram_addr++; - } - for (ppu_bkg_render_i = 0; ppu_bkg_render_i < 8; ppu_bkg_render_i++) - { - ppu_bkg_render_tmp_val = ((ppu_bkgfetch_at_data << 2) & 0xC) | ((ppu_bkgfetch_lb_data >> 7) & 1) | ((ppu_bkgfetch_hb_data >> 6) & 2); - ppu_bkg_pixels[ppu_bkg_render_i + ppu_bkg_render_pos] = ppu_bkg_render_tmp_val; - ppu_bkgfetch_lb_data <<= 1; - ppu_bkgfetch_hb_data <<= 1; - } - } - - private static void PPUSPRFetch0() - { - ppu_sprfetch_slot = (ppu_clock_h - 1 >> 3) & 7; - ppu_sprfetch_slot = 7 - ppu_sprfetch_slot; - ppu_sprfetch_y_data = ppu_oam_bank_secondary[ppu_sprfetch_slot * 4]; - ppu_sprfetch_t_data = ppu_oam_bank_secondary[ppu_sprfetch_slot * 4 + 1]; - ppu_sprfetch_at_data = ppu_oam_bank_secondary[ppu_sprfetch_slot * 4 + 2]; - ppu_sprfetch_x_data = ppu_oam_bank_secondary[ppu_sprfetch_slot * 4 + 3]; - ppu_temp_comparator = (ppu_clock_v - ppu_sprfetch_y_data) ^ (((ppu_sprfetch_at_data & 0x80u) != 0) ? 15 : 0); - if (ppu_reg_2000_Sprite_size == 16) - { - ppu_sprfetch_lb_addr = (ushort)(((uint)(ppu_sprfetch_t_data << 12) & 0x1000u) | ((uint)(ppu_sprfetch_t_data << 4) & 0xFE0u) | ((uint)(ppu_temp_comparator << 1) & 0x10u) | ((uint)ppu_temp_comparator & 7u)); - } - else - { - ppu_sprfetch_lb_addr = (ushort)((uint)(ppu_reg_2000_sprite_pattern_table_address_for_8x8_sprites | (ppu_sprfetch_t_data << 4)) | ((uint)ppu_temp_comparator & 7u)); - } - mem_board.OnPPUAddressUpdate(ref ppu_sprfetch_lb_addr); - } - - private static void PPUSPRFetch1() - { - ppu_is_sprfetch = true; - mem_board.ReadCHR(ref ppu_sprfetch_lb_addr, out ppu_sprfetch_lb_data); - ppu_is_sprfetch = false; - if ((ppu_sprfetch_at_data & 0x40u) != 0) - { - ppu_sprfetch_lb_data = reverseLookup[ppu_sprfetch_lb_data]; - } - } - - private static void PPUSPRFetch2() - { - ppu_sprfetch_hb_addr = (ushort)(ppu_sprfetch_lb_addr | 8u); - mem_board.OnPPUAddressUpdate(ref ppu_sprfetch_hb_addr); - } - - private static void PPUSPRFetch3() - { - ppu_is_sprfetch = true; - mem_board.ReadCHR(ref ppu_sprfetch_hb_addr, out ppu_sprfetch_hb_data); - ppu_is_sprfetch = false; - if ((ppu_sprfetch_at_data & 0x40u) != 0) - { - ppu_sprfetch_hb_data = reverseLookup[ppu_sprfetch_hb_data]; - } - if (ppu_sprfetch_x_data == byte.MaxValue) - { - return; - } - for (ppu_bkg_render_i = 0; ppu_bkg_render_i < 8; ppu_bkg_render_i++) - { - if (ppu_sprfetch_x_data < byte.MaxValue) - { - ppu_bkg_render_tmp_val = ((ppu_sprfetch_at_data << 2) & 0xC) | ((ppu_sprfetch_lb_data >> 7) & 1) | ((ppu_sprfetch_hb_data >> 6) & 2); - if (((uint)ppu_bkg_render_tmp_val & 3u) != 0) - { - ppu_spr_pixels[ppu_sprfetch_x_data] = ppu_bkg_render_tmp_val; - if (ppu_sprfetch_slot == 0 && ppu_sprite0_should_hit) - { - ppu_spr_pixels[ppu_sprfetch_x_data] |= 16384; - } - if ((ppu_sprfetch_at_data & 0x20) == 0) - { - ppu_spr_pixels[ppu_sprfetch_x_data] |= 32768; - } - } - ppu_sprfetch_lb_data <<= 1; - ppu_sprfetch_hb_data <<= 1; - ppu_sprfetch_x_data++; - } - } - } - - private static void PPUOamReset() - { - ppu_oamev_n = 0; - ppu_oamev_m = 0; - ppu_oamev_slot = 0; - ppu_phase_index = 0; - ppu_sprite0_should_hit = false; - } - - private static void PPUOamClear() - { - for (int i = 0; i < ppu_spr_pixels.Length; i++) - { - ppu_spr_pixels[i] = 0; - } - } - - private static void PPUOamEvFetch() - { - ppu_fetch_data = ppu_oam_bank[ppu_oamev_n * 4 + ppu_oamev_m]; - } - - private static void PPUOamPhase0() - { - ppu_oamev_compare = ppu_clock_v >= ppu_fetch_data && ppu_clock_v < ppu_fetch_data + ppu_reg_2000_Sprite_size; - if (ppu_oamev_compare) - { - ppu_oam_bank_secondary[ppu_oamev_slot * 4] = ppu_fetch_data; - ppu_oamev_m = 1; - ppu_phase_index++; - if (ppu_oamev_n == 0) - { - ppu_sprite0_should_hit = true; - } - } - else - { - ppu_oamev_m = 0; - ppu_oamev_n++; - if (ppu_oamev_n == 64) - { - ppu_oamev_n = 0; - ppu_phase_index = 8; - } - } - } - - private static void PPUOamPhase1() - { - ppu_oam_bank_secondary[ppu_oamev_slot * 4 + ppu_oamev_m] = ppu_fetch_data; - ppu_oamev_m = 2; - ppu_phase_index++; - } - - private static void PPUOamPhase2() - { - ppu_oam_bank_secondary[ppu_oamev_slot * 4 + ppu_oamev_m] = ppu_fetch_data; - ppu_oamev_m = 3; - ppu_phase_index++; - } - - private static void PPUOamPhase3() - { - ppu_oam_bank_secondary[ppu_oamev_slot * 4 + ppu_oamev_m] = ppu_fetch_data; - ppu_oamev_m = 0; - ppu_oamev_n++; - ppu_oamev_slot++; - if (ppu_oamev_n == 64) - { - ppu_oamev_n = 0; - ppu_phase_index = 8; - } - else if (ppu_oamev_slot < 8) - { - ppu_phase_index = 0; - } - else if (ppu_oamev_slot == 8) - { - ppu_phase_index = 4; - } - } - - private static void PPUOamPhase4() - { - ppu_oamev_compare = ppu_clock_v >= ppu_fetch_data && ppu_clock_v < ppu_fetch_data + ppu_reg_2000_Sprite_size; - if (ppu_oamev_compare) - { - ppu_oamev_m = 1; - ppu_phase_index++; - ppu_reg_2002_SpriteOverflow = true; - return; - } - ppu_oamev_m++; - if (ppu_oamev_m == 4) - { - ppu_oamev_m = 0; - } - ppu_oamev_n++; - if (ppu_oamev_n == 64) - { - ppu_oamev_n = 0; - ppu_phase_index = 8; - } - else - { - ppu_phase_index = 4; - } - } - - private static void PPUOamPhase5() - { - ppu_oamev_m = 2; - ppu_phase_index++; - } - - private static void PPUOamPhase6() - { - ppu_oamev_m = 3; - ppu_phase_index++; - } - - private static void PPUOamPhase7() - { - ppu_oamev_m = 0; - ppu_oamev_n++; - if (ppu_oamev_n == 64) - { - ppu_oamev_n = 0; - } - ppu_phase_index = 8; - } - - private static void PPUOamPhase8() - { - ppu_oamev_n++; - if (ppu_oamev_n >= 64) - { - ppu_oamev_n = 0; - } - } - - private static void RenderPixel() - { - if (ppu_clock_v == ppu_clock_vblank_end) - { - return; - } - ppu_render_x = ppu_clock_h - 1; - ppu_render_y = ppu_clock_v * 256; - if (ppu_render_x < 8) - { - if (ppu_reg_2001_show_background_in_leftmost_8_pixels_of_screen) - { - ppu_bkg_current_pixel = 0x3F00 | ppu_bkg_pixels[ppu_render_x + ppu_vram_finex]; - } - else - { - ppu_bkg_current_pixel = 16128; - } - if (ppu_reg_2001_show_sprites_in_leftmost_8_pixels_of_screen) - { - ppu_spr_current_pixel = 0x3F10 | ppu_spr_pixels[ppu_render_x]; - } - else - { - ppu_spr_current_pixel = 16144; - } - } - else - { - if (!ppu_reg_2001_show_background) - { - ppu_bkg_current_pixel = 16128; - } - else - { - ppu_bkg_current_pixel = 0x3F00 | ppu_bkg_pixels[ppu_render_x + ppu_vram_finex]; - } - if (!ppu_reg_2001_show_sprites || ppu_clock_v == 0) - { - ppu_spr_current_pixel = 16144; - } - else - { - ppu_spr_current_pixel = 0x3F10 | ppu_spr_pixels[ppu_render_x]; - } - } - ppu_current_pixel = 0; - if (((uint)ppu_spr_current_pixel & 0x8000u) != 0) - { - ppu_current_pixel = ppu_spr_current_pixel; - } - else - { - ppu_current_pixel = ppu_bkg_current_pixel; - } - if ((ppu_bkg_current_pixel & 3) == 0) - { - ppu_current_pixel = ppu_spr_current_pixel; - } - else if ((ppu_spr_current_pixel & 3) == 0) - { - ppu_current_pixel = ppu_bkg_current_pixel; - } - else if (((uint)ppu_spr_pixels[ppu_render_x] & 0x4000u) != 0) - { - ppu_reg_2002_Sprite0Hit = true; - } - if ((ppu_current_pixel & 3) == 0) - { - ppu_screen_pixels[ppu_render_x + ppu_render_y] = ppu_palette[(ppu_palette_bank[ppu_current_pixel & 0xC] & ppu_reg_2001_grayscale) | ppu_reg_2001_emphasis]; - } - else - { - ppu_screen_pixels[ppu_render_x + ppu_render_y] = ppu_palette[(ppu_palette_bank[ppu_current_pixel & 0x1F] & ppu_reg_2001_grayscale) | ppu_reg_2001_emphasis]; - } - } - - private static void PPUIORead(ref ushort addr, out byte value) - { - ppu_reg_io_addr = (byte)(addr & 7u); - ppu_reg_access_happened = true; - ppu_reg_access_w = false; - ppu_reg_read_func[ppu_reg_io_addr](); - value = ppu_reg_io_db; - } - - private static void PPUIOWrite(ref ushort addr, ref byte value) - { - ppu_reg_io_addr = (byte)(addr & 7u); - ppu_reg_io_db = value; - ppu_reg_access_w = true; - ppu_reg_access_happened = true; - } - - private static void PPUOnRegister2000() - { - if (ppu_reg_access_w) - { - ppu_vram_addr_temp = (ushort)((ppu_vram_addr_temp & 0x73FFu) | (uint)((ppu_reg_io_db & 3) << 10)); - if ((ppu_reg_io_db & 4u) != 0) - { - ppu_reg_2000_vram_address_increament = 32; - } - else - { - ppu_reg_2000_vram_address_increament = 1; - } - if ((ppu_reg_io_db & 8u) != 0) - { - ppu_reg_2000_sprite_pattern_table_address_for_8x8_sprites = 4096; - } - else - { - ppu_reg_2000_sprite_pattern_table_address_for_8x8_sprites = 0; - } - if ((ppu_reg_io_db & 0x10u) != 0) - { - ppu_reg_2000_background_pattern_table_address = 4096; - } - else - { - ppu_reg_2000_background_pattern_table_address = 0; - } - if ((ppu_reg_io_db & 0x20u) != 0) - { - ppu_reg_2000_Sprite_size = 16; - } - else - { - ppu_reg_2000_Sprite_size = 8; - } - if (!ppu_reg_2000_VBI && (ppu_reg_io_db & 0x80u) != 0 && ppu_reg_2002_VblankStartedFlag) - { - PPU_NMI_Current = true; - } - ppu_reg_2000_VBI = (ppu_reg_io_db & 0x80) != 0; - if (!ppu_reg_2000_VBI && ppu_is_nmi_time) - { - PPU_NMI_Current = false; - } - } - } - - private static void PPUOnRegister2001() - { - if (ppu_reg_access_w) - { - ppu_reg_2001_show_background_in_leftmost_8_pixels_of_screen = (ppu_reg_io_db & 2) != 0; - ppu_reg_2001_show_sprites_in_leftmost_8_pixels_of_screen = (ppu_reg_io_db & 4) != 0; - ppu_reg_2001_show_background = (ppu_reg_io_db & 8) != 0; - ppu_reg_2001_show_sprites = (ppu_reg_io_db & 0x10) != 0; - ppu_reg_2001_grayscale = ((((uint)ppu_reg_io_db & (true ? 1u : 0u)) != 0) ? 48 : 63); - ppu_reg_2001_emphasis = (ppu_reg_io_db & 0xE0) << 1; - } - } - - private static void PPUOnRegister2002() - { - if (!ppu_reg_access_w) - { - ppu_vram_flip_flop = false; - ppu_reg_2002_VblankStartedFlag = false; - if (ppu_clock_v == ppu_clock_vblank_start) - { - PPU_NMI_Current = ppu_reg_2002_VblankStartedFlag & ppu_reg_2000_VBI; - } - } - } - - private static void PPUOnRegister2003() - { - if (ppu_reg_access_w) - { - ppu_reg_2003_oam_addr = ppu_reg_io_db; - } - } - - private static void PPUOnRegister2004() - { - if (ppu_reg_access_w) - { - if (ppu_clock_v < 240 && IsRenderingOn()) - { - ppu_reg_io_db = byte.MaxValue; - } - if ((ppu_reg_2003_oam_addr & 3) == 2) - { - ppu_reg_io_db &= 227; - } - ppu_oam_bank[ppu_reg_2003_oam_addr] = ppu_reg_io_db; - ppu_reg_2003_oam_addr = (byte)((uint)(ppu_reg_2003_oam_addr + 1) & 0xFFu); - } - } - - private static void PPUOnRegister2005() - { - if (ppu_reg_access_w) - { - if (!ppu_vram_flip_flop) - { - ppu_vram_addr_temp = (ushort)((ppu_vram_addr_temp & 0x7FE0u) | (uint)((ppu_reg_io_db & 0xF8) >> 3)); - ppu_vram_finex = (byte)(ppu_reg_io_db & 7u); - } - else - { - ppu_vram_addr_temp = (ushort)((ppu_vram_addr_temp & 0xC1Fu) | (uint)((ppu_reg_io_db & 7) << 12) | (uint)((ppu_reg_io_db & 0xF8) << 2)); - } - ppu_vram_flip_flop = !ppu_vram_flip_flop; - } - } - - private static void PPUOnRegister2006() - { - if (ppu_reg_access_w) - { - if (!ppu_vram_flip_flop) - { - ppu_vram_addr_temp = (ushort)((ppu_vram_addr_temp & 0xFFu) | (uint)((ppu_reg_io_db & 0x3F) << 8)); - } - else - { - ppu_vram_addr_temp = (ushort)((ppu_vram_addr_temp & 0x7F00u) | ppu_reg_io_db); - ppu_vram_addr = ppu_vram_addr_temp; - mem_board.OnPPUAddressUpdate(ref ppu_vram_addr); - } - ppu_vram_flip_flop = !ppu_vram_flip_flop; - } - } - - private static void PPUOnRegister2007() - { - if (ppu_reg_access_w) - { - ppu_vram_addr_access_temp = (ushort)(ppu_vram_addr & 0x3FFFu); - if (ppu_vram_addr_access_temp < 8192) - { - mem_board.WriteCHR(ref ppu_vram_addr_access_temp, ref ppu_reg_io_db); - } - else if (ppu_vram_addr_access_temp < 16128) - { - mem_board.WriteNMT(ref ppu_vram_addr_access_temp, ref ppu_reg_io_db); - } - else if ((ppu_vram_addr_access_temp & 3u) != 0) - { - ppu_palette_bank[ppu_vram_addr_access_temp & 0x1F] = ppu_reg_io_db; - } - else - { - ppu_palette_bank[ppu_vram_addr_access_temp & 0xC] = ppu_reg_io_db; - } - } - else - { - if ((ppu_vram_addr & 0x3F00) == 16128) - { - ppu_vram_addr_access_temp = (ushort)(ppu_vram_addr & 0x2FFFu); - } - else - { - ppu_vram_addr_access_temp = (ushort)(ppu_vram_addr & 0x3FFFu); - } - if (ppu_vram_addr_access_temp < 8192) - { - mem_board.ReadCHR(ref ppu_vram_addr_access_temp, out ppu_vram_data); - } - else if (ppu_vram_addr_access_temp < 16128) - { - mem_board.ReadNMT(ref ppu_vram_addr_access_temp, out ppu_vram_data); - } - } - ppu_vram_addr = (ushort)((uint)(ppu_vram_addr + ppu_reg_2000_vram_address_increament) & 0x7FFFu); - mem_board.OnPPUAddressUpdate(ref ppu_vram_addr); - } - - private static void PPURead2000() - { - } - - private static void PPURead2001() - { - } - - private static void PPURead2002() - { - ppu_reg_io_db = (byte)((ppu_reg_io_db & 0xDFu) | (ppu_reg_2002_SpriteOverflow ? 32u : 0u)); - ppu_reg_io_db = (byte)((ppu_reg_io_db & 0xBFu) | (ppu_reg_2002_Sprite0Hit ? 64u : 0u)); - ppu_reg_io_db = (byte)((ppu_reg_io_db & 0x7Fu) | (ppu_reg_2002_VblankStartedFlag ? 128u : 0u)); - } - - private static void PPURead2003() - { - } - - private static void PPURead2004() - { - ppu_reg_io_db = ppu_oam_bank[ppu_reg_2003_oam_addr]; - if (ppu_clock_v < 240 && IsRenderingOn()) - { - if (ppu_clock_h < 64) - { - ppu_reg_io_db = byte.MaxValue; - } - else if (ppu_clock_h < 192) - { - ppu_reg_io_db = ppu_oam_bank[(ppu_clock_h - 64 << 1) & 0xFC]; - } - else if (ppu_clock_h < 256) - { - ppu_reg_io_db = (((ppu_clock_h & 1) == 1) ? ppu_oam_bank[252] : ppu_oam_bank[(ppu_clock_h - 192 << 1) & 0xFC]); - } - else if (ppu_clock_h < 320) - { - ppu_reg_io_db = byte.MaxValue; - } - else - { - ppu_reg_io_db = ppu_oam_bank[0]; - } - } - } - - private static void PPURead2005() - { - } - - private static void PPURead2006() - { - } - - private static void PPURead2007() - { - ppu_vram_addr_access_temp = (ushort)(ppu_vram_addr & 0x3FFFu); - if (ppu_vram_addr_access_temp < 16128) - { - ppu_reg_io_db = ppu_vram_data; - } - else if ((ppu_vram_addr_access_temp & 3u) != 0) - { - ppu_reg_io_db = ppu_palette_bank[ppu_vram_addr_access_temp & 0x1F]; - } - else - { - ppu_reg_io_db = ppu_palette_bank[ppu_vram_addr_access_temp & 0xC]; - } - } - - internal static bool IsRenderingOn() - { - if (!ppu_reg_2001_show_background) - { - return ppu_reg_2001_show_sprites; - } - return true; - } - - internal static bool IsInRender() - { - if (ppu_clock_v >= 240) - { - return ppu_clock_v == ppu_clock_vblank_end; - } - return true; - } - - private static void PPUWriteState(ref BinaryWriter bin) - { - bin.Write(ppu_clock_h); - bin.Write(ppu_clock_v); - bin.Write(ppu_clock_vblank_start); - bin.Write(ppu_clock_vblank_end); - bin.Write(ppu_use_odd_cycle); - bin.Write(ppu_use_odd_swap); - bin.Write(ppu_is_nmi_time); - bin.Write(ppu_frame_finished); - bin.Write(ppu_oam_bank); - bin.Write(ppu_oam_bank_secondary); - bin.Write(ppu_palette_bank); - bin.Write(ppu_reg_io_db); - bin.Write(ppu_reg_io_addr); - bin.Write(ppu_reg_access_happened); - bin.Write(ppu_reg_access_w); - bin.Write(ppu_reg_2000_vram_address_increament); - bin.Write(ppu_reg_2000_sprite_pattern_table_address_for_8x8_sprites); - bin.Write(ppu_reg_2000_background_pattern_table_address); - bin.Write(ppu_reg_2000_Sprite_size); - bin.Write(ppu_reg_2000_VBI); - bin.Write(ppu_reg_2001_show_background_in_leftmost_8_pixels_of_screen); - bin.Write(ppu_reg_2001_show_sprites_in_leftmost_8_pixels_of_screen); - bin.Write(ppu_reg_2001_show_background); - bin.Write(ppu_reg_2001_show_sprites); - bin.Write(ppu_reg_2001_grayscale); - bin.Write(ppu_reg_2001_emphasis); - bin.Write(ppu_reg_2002_SpriteOverflow); - bin.Write(ppu_reg_2002_Sprite0Hit); - bin.Write(ppu_reg_2002_VblankStartedFlag); - bin.Write(ppu_reg_2003_oam_addr); - bin.Write(ppu_vram_addr); - bin.Write(ppu_vram_data); - bin.Write(ppu_vram_addr_temp); - bin.Write(ppu_vram_addr_access_temp); - bin.Write(ppu_vram_flip_flop); - bin.Write(ppu_vram_finex); - bin.Write(ppu_bkgfetch_nt_addr); - bin.Write(ppu_bkgfetch_nt_data); - bin.Write(ppu_bkgfetch_at_addr); - bin.Write(ppu_bkgfetch_at_data); - bin.Write(ppu_bkgfetch_lb_addr); - bin.Write(ppu_bkgfetch_lb_data); - bin.Write(ppu_bkgfetch_hb_addr); - bin.Write(ppu_bkgfetch_hb_data); - bin.Write(ppu_sprfetch_slot); - bin.Write(ppu_sprfetch_y_data); - bin.Write(ppu_sprfetch_t_data); - bin.Write(ppu_sprfetch_at_data); - bin.Write(ppu_sprfetch_x_data); - bin.Write(ppu_sprfetch_lb_addr); - bin.Write(ppu_sprfetch_lb_data); - bin.Write(ppu_sprfetch_hb_addr); - bin.Write(ppu_sprfetch_hb_data); - bin.Write(ppu_bkg_render_i); - bin.Write(ppu_bkg_render_pos); - bin.Write(ppu_bkg_render_tmp_val); - bin.Write(ppu_bkg_current_pixel); - bin.Write(ppu_spr_current_pixel); - bin.Write(ppu_current_pixel); - bin.Write(ppu_render_x); - bin.Write(0); - bin.Write(ppu_oamev_n); - bin.Write(ppu_oamev_m); - bin.Write(ppu_oamev_compare); - bin.Write(ppu_oamev_slot); - bin.Write(ppu_fetch_data); - bin.Write(ppu_phase_index); - bin.Write(ppu_sprite0_should_hit); - } - - private static void PPUReadState(ref BinaryReader bin) - { - ppu_clock_h = bin.ReadInt32(); - ppu_clock_v = bin.ReadUInt16(); - ppu_clock_vblank_start = bin.ReadUInt16(); - ppu_clock_vblank_end = bin.ReadUInt16(); - ppu_use_odd_cycle = bin.ReadBoolean(); - ppu_use_odd_swap = bin.ReadBoolean(); - ppu_is_nmi_time = bin.ReadBoolean(); - ppu_frame_finished = bin.ReadBoolean(); - bin.Read(ppu_oam_bank, 0, ppu_oam_bank.Length); - bin.Read(ppu_oam_bank_secondary, 0, ppu_oam_bank_secondary.Length); - bin.Read(ppu_palette_bank, 0, ppu_palette_bank.Length); - ppu_reg_io_db = bin.ReadByte(); - ppu_reg_io_addr = bin.ReadByte(); - ppu_reg_access_happened = bin.ReadBoolean(); - ppu_reg_access_w = bin.ReadBoolean(); - ppu_reg_2000_vram_address_increament = bin.ReadByte(); - ppu_reg_2000_sprite_pattern_table_address_for_8x8_sprites = bin.ReadUInt16(); - ppu_reg_2000_background_pattern_table_address = bin.ReadUInt16(); - ppu_reg_2000_Sprite_size = bin.ReadByte(); - ppu_reg_2000_VBI = bin.ReadBoolean(); - ppu_reg_2001_show_background_in_leftmost_8_pixels_of_screen = bin.ReadBoolean(); - ppu_reg_2001_show_sprites_in_leftmost_8_pixels_of_screen = bin.ReadBoolean(); - ppu_reg_2001_show_background = bin.ReadBoolean(); - ppu_reg_2001_show_sprites = bin.ReadBoolean(); - ppu_reg_2001_grayscale = bin.ReadInt32(); - ppu_reg_2001_emphasis = bin.ReadInt32(); - ppu_reg_2002_SpriteOverflow = bin.ReadBoolean(); - ppu_reg_2002_Sprite0Hit = bin.ReadBoolean(); - ppu_reg_2002_VblankStartedFlag = bin.ReadBoolean(); - ppu_reg_2003_oam_addr = bin.ReadByte(); - ppu_vram_addr = bin.ReadUInt16(); - ppu_vram_data = bin.ReadByte(); - ppu_vram_addr_temp = bin.ReadUInt16(); - ppu_vram_addr_access_temp = bin.ReadUInt16(); - ppu_vram_flip_flop = bin.ReadBoolean(); - ppu_vram_finex = bin.ReadByte(); - ppu_bkgfetch_nt_addr = bin.ReadUInt16(); - ppu_bkgfetch_nt_data = bin.ReadByte(); - ppu_bkgfetch_at_addr = bin.ReadUInt16(); - ppu_bkgfetch_at_data = bin.ReadByte(); - ppu_bkgfetch_lb_addr = bin.ReadUInt16(); - ppu_bkgfetch_lb_data = bin.ReadByte(); - ppu_bkgfetch_hb_addr = bin.ReadUInt16(); - ppu_bkgfetch_hb_data = bin.ReadByte(); - ppu_sprfetch_slot = bin.ReadInt32(); - ppu_sprfetch_y_data = bin.ReadByte(); - ppu_sprfetch_t_data = bin.ReadByte(); - ppu_sprfetch_at_data = bin.ReadByte(); - ppu_sprfetch_x_data = bin.ReadByte(); - ppu_sprfetch_lb_addr = bin.ReadUInt16(); - ppu_sprfetch_lb_data = bin.ReadByte(); - ppu_sprfetch_hb_addr = bin.ReadUInt16(); - ppu_sprfetch_hb_data = bin.ReadByte(); - ppu_bkg_render_i = bin.ReadInt32(); - ppu_bkg_render_pos = bin.ReadInt32(); - ppu_bkg_render_tmp_val = bin.ReadInt32(); - ppu_bkg_current_pixel = bin.ReadInt32(); - ppu_spr_current_pixel = bin.ReadInt32(); - ppu_current_pixel = bin.ReadInt32(); - ppu_render_x = bin.ReadInt32(); - bin.ReadInt32(); - ppu_oamev_n = bin.ReadByte(); - ppu_oamev_m = bin.ReadByte(); - ppu_oamev_compare = bin.ReadBoolean(); - ppu_oamev_slot = bin.ReadByte(); - ppu_fetch_data = bin.ReadByte(); - ppu_phase_index = bin.ReadByte(); - ppu_sprite0_should_hit = bin.ReadBoolean(); - } - - internal static void CheckGame(string fileName, out bool valid) - { - string text = Path.GetExtension(fileName).ToLower(); - if (text != null && text == ".nes") - { - Tracer.WriteLine("Checking INES header ..."); - INes nes = new INes(); - nes.Load(fileName, loadDumps: false); - valid = nes.IsValid; - Tracer.WriteLine("INES header is valid."); - } - else - { - Tracer.WriteWarning("File format is not supported. Format: " + Path.GetExtension(fileName)); - valid = false; - } - } - - internal static void Initialize() - { - Tracer.WriteLine("Loading database file ..."); - NesCartDatabase.LoadDatabase(out bool success); - - if (success) - { - Tracer.WriteInformation("Nes Cart database file loaded successfully."); - } - else - { - Tracer.WriteError("Error loading Nes Cart database file."); - } - - FrameLimiterEnabled = true; - CPUInitialize(); - PPUInitialize(); - APUInitialize(); - PORTSInitialize(); - } - - internal static void SetupRenderingMethods(RenderVideoFrame renderVideo, RenderAudioSamples renderAudio, TogglePause renderTogglePause, GetIsPlaying renderGetIsPlaying) - { - render_initialized = false; - render_video = renderVideo; - render_audio = renderAudio; - render_audio_toggle_pause = renderTogglePause; - render_audio_get_is_playing = renderGetIsPlaying; - render_initialized = render_video != null && render_audio != null && render_audio_toggle_pause != null && render_audio_get_is_playing != null; - if (render_initialized) - { - Tracer.WriteInformation("Renderer methods initialized successfully."); - return; - } - Tracer.WriteError("ERROR RENDERER INITIALIZING !!"); - Tracer.WriteError("Faild to initialize the renderers methods. Please use the method 'SetupRenderingMethods' to initialize the renderers methods before you can run the emulation."); - } - - public static void LoadGame(string fileName, out bool success, bool useThread) - { - if (!render_initialized) - { - Tracer.WriteError("NO RENDERER INITIALIZED !! EMU CANNOT BE INTIALIZED WITHOUT A RENDERER !!"); - Tracer.WriteError("Please use the method 'SetupRenderingMethods' to initialize the renderers methods before you can run the emulation."); - success = false; - return; - } - Tracer.WriteLine("Checking INES header ..."); - INes nes = new INes(); - nes.Load(fileName, loadDumps: true); - if (nes.IsValid) - { - emu_request_mode = RequestMode.None; - CurrentFilePath = fileName; - if (ON) - { - ShutDown(); - } - Tracer.WriteLine("INES header is valid, loading game ..."); - ApplyRegionSetting(); - MEMInitialize(nes); - ApplyAudioSettings(); - ApplyFrameSkipSettings(); - ApplyPaletteSetting(); - PORTSInitialize(); - hardReset(); - Tracer.WriteLine("EMU is ready."); - success = true; - ON = true; - PAUSED = false; - if (useThread) - { - Tracer.WriteLine("Running in a thread ... using custom frame limiter."); - FrameLimiterEnabled = true; - currentFrame = 0; - mainThread = new Thread(EmuClock); - mainThread.Start(); - } - MyNesMain.VideoProvider.SignalToggle(started: true); - MyNesMain.AudioProvider.SignalToggle(started: true); - } - else - { - success = false; - } - } - - public static void HardReset() - { - PAUSED = true; - emu_request_mode = RequestMode.HardReset; - } - - private static void hardReset() - { - if (MyNesMain.WaveRecorder.IsRecording) - { - MyNesMain.WaveRecorder.Stop(); - } - render_audio_toggle_pause(paused: true); - switch (Region) - { - case EmuRegion.NTSC: - emu_time_target_fps = 60.0988; - break; - case EmuRegion.PALB: - case EmuRegion.DENDY: - emu_time_target_fps = 50.0; - break; - } - fps_time_period = 1.0 / emu_time_target_fps; - MEMHardReset(); - CPUHardReset(); - PPUHardReset(); - APUHardReset(); - DMAHardReset(); - render_audio_toggle_pause(paused: false); - MyNesMain.VideoProvider.WriteWarningNotification(MNInterfaceLanguage.Message_HardReset, instant: false); - } - - public static void SoftReset() - { - PAUSED = true; - emu_request_mode = RequestMode.SoftReset; - } - - private static void softReset() - { - CPUSoftReset(); - APUSoftReset(); - MyNesMain.VideoProvider.WriteWarningNotification(MNInterfaceLanguage.Message_SoftReset, instant: false); - } - - public static void SaveState() - { - PAUSED = true; - emu_request_mode = RequestMode.SaveState; - } - - public static void LoadState() - { - PAUSED = true; - emu_request_mode = RequestMode.LoadState; - } - - internal static void TakeSnapshot() - { - PAUSED = true; - emu_request_mode = RequestMode.TakeSnapshot; - } - - public static void ShutDown() - { - MyNesMain.VideoProvider.SignalToggle(started: false); - MyNesMain.AudioProvider.SignalToggle(started: false); - if (MyNesMain.WaveRecorder.IsRecording) - { - MyNesMain.WaveRecorder.Stop(); - } - render_audio_get_is_playing(out render_audio_is_playing); - if (render_audio_is_playing) - { - render_audio_toggle_pause(paused: true); - } - Tracer.WriteLine("Shutting down the emulation core..."); - ON = false; - if (mainThread != null) - { - Tracer.WriteLine("Aborting thread .."); - mainThread.Abort(); - mainThread = null; - } - SaveSRAM(); - Tracer.WriteInformation("Emulation core shutdown successfully."); - NesEmu.EmuShutdown?.Invoke(null, new EventArgs()); - } - - private static Stopwatch sw = new Stopwatch(); - private static double fixTime; - public static ulong currentFrame; - private static void EmuClock() - { - while (ON) - { - if (!PAUSED) - { - var waitTime = GetTime() + fps_time_period + fixTime; - - while (!ppu_frame_finished) - CPUClock(); - - FrameFinished(); - - fixTime = waitTime - GetTime(); - while (fixTime > 0) - { - fixTime = waitTime - GetTime(); - }; - - currentFrame++; - - continue; - } - render_audio_get_is_playing(out render_audio_is_playing); - if (render_audio_is_playing) - { - render_audio_toggle_pause(paused: true); - } - Thread.Sleep(100); - switch (emu_request_mode) - { - case RequestMode.HardReset: - hardReset(); - PAUSED = false; - emu_request_mode = RequestMode.None; - break; - case RequestMode.SoftReset: - softReset(); - PAUSED = false; - emu_request_mode = RequestMode.None; - break; - case RequestMode.SaveState: - StateHandler.SaveState(); - PAUSED = false; - emu_request_mode = RequestMode.None; - break; - case RequestMode.LoadState: - StateHandler.LoadState(); - PAUSED = false; - emu_request_mode = RequestMode.None; - break; - case RequestMode.TakeSnapshot: - MyNesMain.VideoProvider.TakeSnapshot(); - PAUSED = false; - emu_request_mode = RequestMode.None; - break; - } - isPaused = true; - } - } - - internal static void EmuClockComponents() - { - PPUClock(); - PollInterruptStatus(); - PPUClock(); - PPUClock(); - APUClock(); - DMAClock(); - mem_board.OnCPUClock(); - } - - internal static void ApplyFrameSkipSettings() - { - FrameSkipEnabled = MyNesMain.RendererSettings.FrameSkipEnabled; - FrameSkipInterval = MyNesMain.RendererSettings.FrameSkipInterval; - } - - private static void FrameFinished() - { - if (!FrameSkipEnabled) - { - render_video(ref ppu_screen_pixels); - } - else - { - FrameSkipCounter++; - if (FrameSkipCounter >= FrameSkipInterval) - { - render_video(ref ppu_screen_pixels); - FrameSkipCounter = 0; - } - } - isPaused = false; - ppu_frame_finished = false; - joypad1.Update(); - joypad2.Update(); - if (IsFourPlayers) - { - joypad3.Update(); - joypad4.Update(); - } - if (SoundEnabled) - { - render_audio_get_is_playing(out render_audio_is_playing); - if (!render_audio_is_playing) - { - render_audio_toggle_pause(paused: false); - } - render_audio(ref audio_samples, ref audio_samples_added); - audio_w_pos = 0; - audio_samples_added = 0; - audio_timer = 0.0; - } - } - - private static double GetTime() - { - return (double)Stopwatch.GetTimestamp() / (double)Stopwatch.Frequency; - } - - - public static void SetFramePeriod(ref double period) - { - fps_time_period = period; - } - - public static void RevertFramePeriod() - { - fps_time_period = 1 / emu_time_target_fps; - } - - public static void ApplyRegionSetting() - { - switch ((RegionSetting)MyNesMain.EmuSettings.RegionSetting) - { - case RegionSetting.AUTO: - Tracer.WriteLine("REGION = AUTO"); - Region = EmuRegion.NTSC; - if (CurrentFilePath.Contains("(E)")) - { - Region = EmuRegion.PALB; - } - Tracer.WriteLine("REGION SELECTED: " + Region); - break; - case RegionSetting.ForceNTSC: - Tracer.WriteLine("REGION: FORCE NTSC"); - Region = EmuRegion.NTSC; - break; - case RegionSetting.ForcePALB: - Tracer.WriteLine("REGION: FORCE PALB"); - Region = EmuRegion.PALB; - break; - case RegionSetting.ForceDENDY: - Tracer.WriteLine("REGION: FORCE DENDY"); - Region = EmuRegion.DENDY; - break; - } - SystemIndex = (int)Region; - } - - public static void ApplyPaletteSetting() - { - Tracer.WriteLine("Loading palette generators values from settings..."); - NTSCPaletteGenerator.brightness = MyNesMain.RendererSettings.Palette_NTSC_brightness; - NTSCPaletteGenerator.contrast = MyNesMain.RendererSettings.Palette_NTSC_contrast; - NTSCPaletteGenerator.gamma = MyNesMain.RendererSettings.Palette_NTSC_gamma; - NTSCPaletteGenerator.hue_tweak = MyNesMain.RendererSettings.Palette_NTSC_hue_tweak; - NTSCPaletteGenerator.saturation = MyNesMain.RendererSettings.Palette_NTSC_saturation; - PALBPaletteGenerator.brightness = MyNesMain.RendererSettings.Palette_PALB_brightness; - PALBPaletteGenerator.contrast = MyNesMain.RendererSettings.Palette_PALB_contrast; - PALBPaletteGenerator.gamma = MyNesMain.RendererSettings.Palette_PALB_gamma; - PALBPaletteGenerator.hue_tweak = MyNesMain.RendererSettings.Palette_PALB_hue_tweak; - PALBPaletteGenerator.saturation = MyNesMain.RendererSettings.Palette_PALB_saturation; - Tracer.WriteLine("Setting up palette ...."); - switch ((PaletteSelectSetting)MyNesMain.RendererSettings.Palette_PaletteSetting) - { - case PaletteSelectSetting.AUTO: - Tracer.WriteLine("Palette set to auto detect depending on region."); - switch (Region) - { - case EmuRegion.NTSC: - SetupPalette(NTSCPaletteGenerator.GeneratePalette()); - Tracer.WriteLine("Region is NTSC, Palette set from NTSC generator."); - break; - case EmuRegion.PALB: - case EmuRegion.DENDY: - SetupPalette(PALBPaletteGenerator.GeneratePalette()); - Tracer.WriteLine("Region is PALB/DENDY, Palette set from PALB generator."); - break; - } - break; - case PaletteSelectSetting.ForceNTSC: - Tracer.WriteLine("Palette set to always use NTSC palette generator."); - SetupPalette(NTSCPaletteGenerator.GeneratePalette()); - Tracer.WriteLine("Palette set from NTSC generator."); - break; - case PaletteSelectSetting.ForcePALB: - Tracer.WriteLine("Palette set to always use PALB palette generator."); - SetupPalette(NTSCPaletteGenerator.GeneratePalette()); - Tracer.WriteLine("Palette set from PALB generator."); - break; - case PaletteSelectSetting.File: - { - Tracer.WriteLine("Palette set to load from file."); - - var paletteFileStream = MyNesMain.Supporter.OpenPaletteFile(); - if (paletteFileStream != null) - { - PaletteFileWrapper.LoadFile(paletteFileStream, out var palette); - SetupPalette(palette); - Tracer.WriteLine("Palette set from file"); - break; - } - Tracer.WriteError("Palette from file is not exist is not exist. Setting up palette from generators."); - switch (Region) - { - case EmuRegion.NTSC: - SetupPalette(NTSCPaletteGenerator.GeneratePalette()); - Tracer.WriteLine("Region is NTSC, Palette set from NTSC generator."); - break; - case EmuRegion.PALB: - case EmuRegion.DENDY: - SetupPalette(PALBPaletteGenerator.GeneratePalette()); - Tracer.WriteLine("Region is PALB/DENDY, Palette set from PALB generator."); - break; - } - break; - } - } - } - - internal static void WriteStateData(ref BinaryWriter bin) - { - APUWriteState(ref bin); - CPUWriteState(ref bin); - DMAWriteState(ref bin); - InterruptsWriteState(ref bin); - MEMWriteState(ref bin); - PORTWriteState(ref bin); - PPUWriteState(ref bin); - } - - internal static void ReadStateData(ref BinaryReader bin) - { - APUReadState(ref bin); - CPUReadState(ref bin); - DMAReadState(ref bin); - InterruptsReadState(ref bin); - MEMReadState(ref bin); - PORTReadState(ref bin); - PPUReadState(ref bin); - } - - private static void SQ2HardReset() - { - sq2_duty_cycle = 0; - sq2_length_halt = false; - sq2_constant_volume_envelope = false; - sq2_volume_devider_period = 0; - sq2_sweep_enable = false; - sq2_sweep_devider_period = 0; - sq2_sweep_negate = false; - sq2_sweep_shift_count = 0; - sq2_timer = 0; - sq2_period_devider = 0; - sq2_seqencer = 0; - sq2_length_enabled = false; - sq2_length_counter = 0; - sq2_envelope_start_flag = false; - sq2_envelope_devider = 0; - sq2_envelope_decay_level_counter = 0; - sq2_envelope = 0; - sq2_sweep_counter = 0; - sq2_sweep_reload = false; - sq2_sweep_change = 0; - sq2_valid_freq = false; - sq2_output = 0; - sq2_ignore_reload = false; - } - - private static void SQ2SoftReset() - { - SQ2HardReset(); - } - - private static void SQ2Clock() - { - sq2_period_devider--; - if (sq2_period_devider > 0) - { - return; - } - sq2_period_devider = sq2_timer + 1; - sq2_seqencer = (byte)((uint)(sq2_seqencer + 1) & 7u); - if (sq2_length_counter > 0 && sq2_valid_freq) - { - if (audio_sq2_outputable) - { - sq2_output = sq_duty_cycle_sequences[sq2_duty_cycle][sq2_seqencer] * sq2_envelope; - } - } - else - { - sq2_output = 0; - } - audio_signal_outputed = true; - } - - private static void SQ2ClockLength() - { - if (sq2_length_counter > 0 && !sq2_length_halt) - { - sq2_length_counter--; - if (apu_reg_access_happened && apu_reg_io_addr == 7 && apu_reg_access_w) - { - sq2_ignore_reload = true; - } - } - sq2_sweep_counter--; - if (sq2_sweep_counter == 0) - { - sq2_sweep_counter = sq2_sweep_devider_period + 1; - if (sq2_sweep_enable && sq2_sweep_shift_count > 0 && sq2_valid_freq) - { - sq2_sweep_change = sq2_timer >> (int)sq2_sweep_shift_count; - sq2_timer += (sq2_sweep_negate ? (-sq2_sweep_change) : sq2_sweep_change); - SQ2CalculateValidFreq(); - } - } - else if (sq2_sweep_reload) - { - sq2_sweep_counter = sq2_sweep_devider_period + 1; - sq2_sweep_reload = false; - } - } - - private static void SQ2ClockEnvelope() - { - if (sq2_envelope_start_flag) - { - sq2_envelope_start_flag = false; - sq2_envelope_decay_level_counter = 15; - sq2_envelope_devider = (byte)(sq2_volume_devider_period + 1); - } - else if (sq2_envelope_devider > 0) - { - sq2_envelope_devider--; - } - else - { - sq2_envelope_devider = (byte)(sq2_volume_devider_period + 1); - if (sq2_envelope_decay_level_counter > 0) - { - sq2_envelope_decay_level_counter--; - } - else if (sq2_length_halt) - { - sq2_envelope_decay_level_counter = 15; - } - } - sq2_envelope = (sq2_constant_volume_envelope ? sq2_volume_devider_period : sq2_envelope_decay_level_counter); - } - - private static void APUOnRegister4004() - { - if (apu_reg_access_w) - { - sq2_duty_cycle = (byte)((apu_reg_io_db & 0xC0) >> 6); - sq2_volume_devider_period = (byte)(apu_reg_io_db & 0xFu); - sq2_length_halt = (apu_reg_io_db & 0x20) != 0; - sq2_constant_volume_envelope = (apu_reg_io_db & 0x10) != 0; - sq2_envelope = (sq2_constant_volume_envelope ? sq2_volume_devider_period : sq2_envelope_decay_level_counter); - } - } - - private static void APUOnRegister4005() - { - if (apu_reg_access_w) - { - sq2_sweep_enable = (apu_reg_io_db & 0x80) == 128; - sq2_sweep_devider_period = (byte)((uint)(apu_reg_io_db >> 4) & 7u); - sq2_sweep_negate = (apu_reg_io_db & 8) == 8; - sq2_sweep_shift_count = (byte)(apu_reg_io_db & 7u); - sq2_sweep_reload = true; - SQ2CalculateValidFreq(); - } - } - - private static void APUOnRegister4006() - { - if (apu_reg_access_w) - { - sq2_timer = (sq2_timer & 0xFF00) | apu_reg_io_db; - SQ2CalculateValidFreq(); - } - } - - private static void APUOnRegister4007() - { - if (apu_reg_access_w) - { - sq2_timer = (sq2_timer & 0xFF) | ((apu_reg_io_db & 7) << 8); - if (sq2_length_enabled && !sq2_ignore_reload) - { - sq2_length_counter = sq_duration_table[apu_reg_io_db >> 3]; - } - if (sq2_ignore_reload) - { - sq2_ignore_reload = false; - } - sq2_seqencer = 0; - sq2_envelope_start_flag = true; - SQ2CalculateValidFreq(); - } - } - - private static void SQ2On4015() - { - sq2_length_enabled = (apu_reg_io_db & 2) != 0; - if (!sq2_length_enabled) - { - sq2_length_counter = 0; - } - } - - private static void SQ2Read4015() - { - if (sq2_length_counter > 0) - { - apu_reg_io_db = (byte)((apu_reg_io_db & 0xFDu) | 2u); - } - } - - private static void SQ2CalculateValidFreq() - { - sq2_valid_freq = sq2_timer >= 8 && (sq2_sweep_negate || ((sq2_timer + (sq2_timer >> (int)sq2_sweep_shift_count)) & 0x800) == 0); - } - - private static void SQ2WriteState(ref BinaryWriter bin) - { - bin.Write(sq2_duty_cycle); - bin.Write(sq2_length_halt); - bin.Write(sq2_constant_volume_envelope); - bin.Write(sq2_volume_devider_period); - bin.Write(sq2_sweep_enable); - bin.Write(sq2_sweep_devider_period); - bin.Write(sq2_sweep_negate); - bin.Write(sq2_sweep_shift_count); - bin.Write(sq2_timer); - bin.Write(sq2_period_devider); - bin.Write(sq2_seqencer); - bin.Write(sq2_length_enabled); - bin.Write(sq2_length_counter); - bin.Write(sq2_envelope_start_flag); - bin.Write(sq2_envelope_devider); - bin.Write(sq2_envelope_decay_level_counter); - bin.Write(sq2_envelope); - bin.Write(sq2_sweep_counter); - bin.Write(sq2_sweep_reload); - bin.Write(sq2_sweep_change); - bin.Write(sq2_valid_freq); - bin.Write(sq2_output); - bin.Write(sq2_ignore_reload); - } - - private static void SQ2ReadState(ref BinaryReader bin) - { - sq2_duty_cycle = bin.ReadByte(); - sq2_length_halt = bin.ReadBoolean(); - sq2_constant_volume_envelope = bin.ReadBoolean(); - sq2_volume_devider_period = bin.ReadByte(); - sq2_sweep_enable = bin.ReadBoolean(); - sq2_sweep_devider_period = bin.ReadByte(); - sq2_sweep_negate = bin.ReadBoolean(); - sq2_sweep_shift_count = bin.ReadByte(); - sq2_timer = bin.ReadInt32(); - sq2_period_devider = bin.ReadInt32(); - sq2_seqencer = bin.ReadByte(); - sq2_length_enabled = bin.ReadBoolean(); - sq2_length_counter = bin.ReadInt32(); - sq2_envelope_start_flag = bin.ReadBoolean(); - sq2_envelope_devider = bin.ReadByte(); - sq2_envelope_decay_level_counter = bin.ReadByte(); - sq2_envelope = bin.ReadByte(); - sq2_sweep_counter = bin.ReadInt32(); - sq2_sweep_reload = bin.ReadBoolean(); - sq2_sweep_change = bin.ReadInt32(); - sq2_valid_freq = bin.ReadBoolean(); - sq2_output = bin.ReadInt32(); - sq2_ignore_reload = bin.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesEmu.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/NesEmu.cs.meta deleted file mode 100644 index 7482bdc..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/NesEmu.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0ec9e5a66367f0e47b07118c94860367 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/PALBPaletteGenerator.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/PALBPaletteGenerator.cs deleted file mode 100644 index 873a4bd..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/PALBPaletteGenerator.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class PALBPaletteGenerator - { - public const float default_saturation = 1.496f; - - public const float default_hue_tweak = 0f; - - public const float default_contrast = 1.016f; - - public const float default_brightness = 1.075f; - - public const float default_gamma = 1.975f; - - private const float black = 0.518f; - - private const float white = 1.962f; - - private const float attenuation = 0.746f; - - public static float saturation = 2f; - - public static float hue_tweak = 0f; - - public static float contrast = 1.4f; - - public static float brightness = 1.07f; - - public static float gamma = 2f; - - private static float[] levels = new float[8] { 0.35f, 0.518f, 0.962f, 1.55f, 1.094f, 1.506f, 1.962f, 1.962f }; - - private static int wave(int p, int color) - { - if ((color + p + 8) % 12 >= 6) - { - return 0; - } - return 1; - } - - private static float gammafix(float f, float gamma) - { - return (float)((f < 0f) ? 0.0 : Math.Pow(f, 2.2f / gamma)); - } - - private static int clamp(float v) - { - return (int)((v < 0f) ? 0f : ((v > 255f) ? 255f : v)); - } - - public static int MakeRGBcolor(int pixel) - { - int num = pixel & 0xF; - int num2 = ((num >= 14) ? 1 : ((pixel >> 4) & 3)); - float[] array = new float[2] - { - levels[num2 + ((num == 0) ? 4 : 0)], - levels[num2 + ((num <= 12) ? 4 : 0)] - }; - float num3 = 0f; - float num4 = 0f; - float num5 = 0f; - for (int i = 0; i < 12; i++) - { - float num6 = array[wave(i, num)]; - if ((((uint)pixel & 0x40u) != 0 && wave(i, 12) == 1) || (((uint)pixel & 0x80u) != 0 && wave(i, 4) == 1) || (((uint)pixel & 0x100u) != 0 && wave(i, 8) == 1)) - { - num6 *= 0.746f; - } - float num7 = (num6 - 0.518f) / 1.444f; - num7 = (num7 - 0.5f) * contrast + 0.5f; - num7 *= brightness / 12f; - num3 += num7; - num4 += (float)((double)num7 * Math.Cos(Math.PI / 6.0 * (double)((float)i + 0.5f + hue_tweak))); - num5 += (float)((double)num7 * Math.Sin(Math.PI / 6.0 * (double)((float)i + 0.5f + hue_tweak))); - } - num4 *= saturation; - num5 *= saturation; - return 65536 * clamp(255f * gammafix(num3 + 0.946882f * num4 + 0.623557f * num5, gamma)) + 256 * clamp(255f * gammafix(num3 - 245f / (328f * (float)Math.E) * num4 - 0.635691f * num5, gamma)) + clamp(255f * gammafix(num3 - 1.108545f * num4 + 1.709007f * num5, gamma)); - } - - public static int[] GeneratePalette() - { - int[] array = new int[512]; - for (int i = 0; i < 512; i++) - { - array[i] = MakeRGBcolor(i) | -16777216; - } - return array; - } - - public static int[] GeneratePaletteGBR() - { - int[] array = new int[512]; - for (int i = 0; i < 512; i++) - { - int num = MakeRGBcolor(i); - byte b = (byte)((num & 0xFF0000) >> 16); - byte b2 = (byte)((num & 0xFF00) >> 8); - byte b3 = (byte)((uint)num & 0xFFu); - array[i] = -16777216 | (b3 << 16) | (b2 << 8) | b; - } - return array; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/PALBPaletteGenerator.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/PALBPaletteGenerator.cs.meta deleted file mode 100644 index ff8e34b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/PALBPaletteGenerator.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 3a50696d24d84244db471bd77c8e8ace -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/PRGArea.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/PRGArea.cs deleted file mode 100644 index 38619bd..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/PRGArea.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace MyNes.Core -{ - internal enum PRGArea : byte - { - Area4000 = 4, - Area5000, - Area6000, - Area7000, - Area8000, - Area9000, - AreaA000, - AreaB000, - AreaC000, - AreaD000, - AreaE000, - AreaF000 - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/PRGArea.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/PRGArea.cs.meta deleted file mode 100644 index 32839e3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/PRGArea.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: dd5f1d06c4c4b974992327c971b3e73c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteFileWrapper.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteFileWrapper.cs deleted file mode 100644 index 7436c77..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteFileWrapper.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections.Generic; -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class PaletteFileWrapper - { - public static bool LoadFile(Stream fileStream, out int[] palette) - { - Stream stream = fileStream; - if (stream.Length == 192 || stream.Length == 1536) - { - int[] array = new int[512]; - byte[] array2 = new byte[stream.Length]; - stream.Read(array2, 0, array2.Length); - int num = 0; - for (int i = 0; i < 512; i++) - { - byte b = array2[num]; - num++; - if (num == array2.Length) - { - num = 0; - } - byte b2 = array2[num]; - num++; - if (num == array2.Length) - { - num = 0; - } - byte b3 = array2[num]; - num++; - if (num == array2.Length) - { - num = 0; - } - array[i] = -16777216 | (b << 16) | (b2 << 8) | b3; - } - stream.Close(); - palette = array; - return true; - } - palette = null; - return false; - } - - public static void SaveFile(string file, int[] palette) - { - Stream stream = new FileStream(file, FileMode.Create, FileAccess.Write); - List list = new List(); - foreach (int num in palette) - { - list.Add((byte)((uint)(num >> 16) & 0xFFu)); - list.Add((byte)((uint)(num >> 8) & 0xFFu)); - list.Add((byte)((uint)num & 0xFFu)); - } - stream.Write(list.ToArray(), 0, list.Count); - stream.Close(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteFileWrapper.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteFileWrapper.cs.meta deleted file mode 100644 index 5006743..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteFileWrapper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f15f9fdbee4f6704ebf4de045e49573c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteSelectSetting.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteSelectSetting.cs deleted file mode 100644 index 2deeba8..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteSelectSetting.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyNes.Core -{ - public enum PaletteSelectSetting - { - AUTO, - ForceNTSC, - ForcePALB, - File - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteSelectSetting.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteSelectSetting.cs.meta deleted file mode 100644 index 13d79b9..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/PaletteSelectSetting.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1288fd99cf9cd5b49a99b7de9ac5b778 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/RegionSetting.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/RegionSetting.cs deleted file mode 100644 index de9bedc..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/RegionSetting.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyNes.Core -{ - public enum RegionSetting - { - AUTO, - ForceNTSC, - ForcePALB, - ForceDENDY - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/RegionSetting.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/RegionSetting.cs.meta deleted file mode 100644 index 10a2dee..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/RegionSetting.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4e8c869e43765a14cb6c803a65bdf3fe -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderAudioSamples.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderAudioSamples.cs deleted file mode 100644 index 0cb619c..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderAudioSamples.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace MyNes.Core -{ - internal delegate void RenderAudioSamples(ref short[] buffer, ref int samples_added); -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderAudioSamples.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderAudioSamples.cs.meta deleted file mode 100644 index 6d259fd..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderAudioSamples.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 2c87ada4318a5b54eb32c459316a236c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderVideoFrame.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderVideoFrame.cs deleted file mode 100644 index 635f9e1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderVideoFrame.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace MyNes.Core -{ - internal delegate void RenderVideoFrame(ref int[] buffer); -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderVideoFrame.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderVideoFrame.cs.meta deleted file mode 100644 index a77008a..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/RenderVideoFrame.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 368bc7a67bdd3134781f923b3685629c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/RendererSettings.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/RendererSettings.cs deleted file mode 100644 index 086d0ec..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/RendererSettings.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class RendererSettings : ISettings - { - public string Video_ProviderID = ""; - - public bool Vid_AutoStretch = true; - - public int Vid_StretchMultiply = 3; - - public bool Vid_KeepAspectRatio; - - public bool Vid_ShowFPS; - - public bool Vid_HideLines = true; - - public bool Vid_Fullscreen; - - public bool Vid_HardwareVertexProcessing; - - public bool Vid_VSync; - - public bool Vid_ShowNotifications = true; - - public int Vid_Filter = 1; - - public bool FrameSkipEnabled; - - public int FrameSkipInterval = 2; - - public string Audio_ProviderID = ""; - - public bool Audio_EnableFilters = true; - - public int Audio_Volume = 100; - - public bool Audio_SoundEnabled = true; - - public int Audio_Frequency = 48000; - - public int Audio_InternalSamplesCount = 1024; - - public int Audio_InternalPeekLimit = 124; - - public int Audio_PlaybackAmplitude = 200; - - public int Audio_PlaybackBufferSizeInKB = 16; - - public bool Audio_UseDefaultMixer; - - public bool Audio_ChannelEnabled_SQ1 = true; - - public bool Audio_ChannelEnabled_SQ2 = true; - - public bool Audio_ChannelEnabled_NOZ = true; - - public bool Audio_ChannelEnabled_TRL = true; - - public bool Audio_ChannelEnabled_DMC = true; - - public bool Audio_ChannelEnabled_MMC5_SQ1 = true; - - public bool Audio_ChannelEnabled_MMC5_SQ2 = true; - - public bool Audio_ChannelEnabled_MMC5_PCM = true; - - public bool Audio_ChannelEnabled_VRC6_SQ1 = true; - - public bool Audio_ChannelEnabled_VRC6_SQ2 = true; - - public bool Audio_ChannelEnabled_VRC6_SAW = true; - - public bool Audio_ChannelEnabled_SUN1 = true; - - public bool Audio_ChannelEnabled_SUN2 = true; - - public bool Audio_ChannelEnabled_SUN3 = true; - - public bool Audio_ChannelEnabled_NMT1 = true; - - public bool Audio_ChannelEnabled_NMT2 = true; - - public bool Audio_ChannelEnabled_NMT3 = true; - - public bool Audio_ChannelEnabled_NMT4 = true; - - public bool Audio_ChannelEnabled_NMT5 = true; - - public bool Audio_ChannelEnabled_NMT6 = true; - - public bool Audio_ChannelEnabled_NMT7 = true; - - public bool Audio_ChannelEnabled_NMT8 = true; - - public int Palette_PaletteSetting; - - public float Palette_NTSC_brightness = 1.075f; - - public float Palette_NTSC_contrast = 1.016f; - - public float Palette_NTSC_gamma = 1.975f; - - public float Palette_NTSC_hue_tweak; - - public float Palette_NTSC_saturation = 1.496f; - - public float Palette_PALB_brightness = 1.075f; - - public float Palette_PALB_contrast = 1.016f; - - public float Palette_PALB_gamma = 1.975f; - - public float Palette_PALB_hue_tweak; - - public float Palette_PALB_saturation = 1.496f; - - public RendererSettings(string path) - : base(path) - { - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/RendererSettings.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/RendererSettings.cs.meta deleted file mode 100644 index f8ecf0f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/RendererSettings.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 65409a509e1cd8343b1a67971176f0df -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/SRAMBankInfo.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/SRAMBankInfo.cs deleted file mode 100644 index 68a1e70..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/SRAMBankInfo.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace MyNes.Core -{ - public struct SRAMBankInfo - { - public int id; - - public string SIZE; - - public bool BATTERY; - - public SRAMBankInfo(int id, string SIZE, bool BATTERY) - { - this.SIZE = SIZE; - if (SIZE == "0kb") - { - SIZE = "8kb"; - } - this.BATTERY = BATTERY; - this.id = id; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/SRAMBankInfo.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/SRAMBankInfo.cs.meta deleted file mode 100644 index e836822..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/SRAMBankInfo.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 712dc9b2310b1de45b4136197e974a90 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundDCBlockerFilter.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundDCBlockerFilter.cs deleted file mode 100644 index da849fe..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundDCBlockerFilter.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class SoundDCBlockerFilter - { - private double R; - - private double y; - - private double y_1; - - private double x; - - private double x_1; - - public SoundDCBlockerFilter(double R) - { - this.R = R; - } - - public void Reset() - { - y = (y_1 = (x = (x_1 = 0.0))); - } - - public void DoFiltering(double sample, out double filtered) - { - x = sample; - filtered = (y = x - x_1 + R * y_1); - x_1 = x; - y_1 = y; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundDCBlockerFilter.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundDCBlockerFilter.cs.meta deleted file mode 100644 index fe30c28..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundDCBlockerFilter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 45a36044c5210bb498dc54c616867e2a -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundHighPassFilter.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundHighPassFilter.cs deleted file mode 100644 index c83ced1..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundHighPassFilter.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class SoundHighPassFilter - { - private double K; - - private double y_1; - - private double x_1; - - public SoundHighPassFilter(double k) - { - K = k; - } - - public void Reset() - { - y_1 = (x_1 = 0.0); - } - - public void DoFiltering(double sample, out double filtered) - { - filtered = K * y_1 + K * (sample - x_1); - x_1 = sample; - y_1 = filtered; - } - - public static double GetK(double dt, double fc) - { - double num = Math.PI * 2.0 * dt * fc; - return num / (num + 1.0); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundHighPassFilter.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundHighPassFilter.cs.meta deleted file mode 100644 index 3edbcd6..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundHighPassFilter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 57d536cd18a24114691257432ce2b8b9 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundLowPassFilter.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundLowPassFilter.cs deleted file mode 100644 index 2d52392..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundLowPassFilter.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class SoundLowPassFilter - { - private double K; - - private double K_1; - - private double y; - - private double y_1; - - private double x; - - private double x_1; - - public SoundLowPassFilter(double k) - { - K = k; - K_1 = 1.0 - k; - } - - public void Reset(double k) - { - y = (y_1 = (x = (x_1 = 0.0))); - K = k; - K_1 = 1.0 - k; - } - - public void DoFiltering(double sample, out double filtered) - { - filtered = K * sample + K_1 * y_1; - x_1 = sample; - y_1 = filtered; - } - - public static double GetK(double dt, double fc) - { - double num = Math.PI * 2.0 * dt * fc; - return num / (num + 1.0); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundLowPassFilter.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundLowPassFilter.cs.meta deleted file mode 100644 index aeb419f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/SoundLowPassFilter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 0556466d0c6a1ef44a16c28d90524615 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/StateHandler.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/StateHandler.cs deleted file mode 100644 index fc02bac..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/StateHandler.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System; -using System.IO; -using System.Text; - -namespace MyNes.Core -{ - public class StateHandler - { - public static int Slot = 0; - - internal static string StateFolder = "States"; - - private const byte state_version = 7; - - private static bool IsSavingState = false; - - private static bool IsLoadingState = false; - - public static void SaveState(string fileName, bool saveImage) - { - if (!NesEmu.ON) - { - Tracer.WriteError("Can't save state, emu is off."); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error1, instant: false); - return; - } - if (!File.Exists(NesEmu.CurrentFilePath)) - { - Tracer.WriteError("Can't save state, no rom file is loaded."); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error2, instant: false); - return; - } - if (IsLoadingState) - { - Tracer.WriteError("Can't save state while loading a state !"); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error3, instant: false); - return; - } - if (IsSavingState) - { - Tracer.WriteError("Already saving state !!"); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error4, instant: false); - return; - } - IsSavingState = true; - BinaryWriter bin = new BinaryWriter(new MemoryStream()); - bin.Write(Encoding.ASCII.GetBytes("MNS")); - bin.Write((byte)7); - for (int i = 0; i < NesEmu.SHA1.Length; i += 2) - { - string value = NesEmu.SHA1.Substring(i, 2).ToUpper(); - bin.Write(Convert.ToByte(value, 16)); - } - NesEmu.WriteStateData(ref bin); - byte[] outData = new byte[0]; - ZlipWrapper.CompressData(((MemoryStream)bin.BaseStream).GetBuffer(), out outData); - FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write); - fileStream.Write(outData, 0, outData.Length); - MyNesMain.VideoProvider.TakeSnapshotAs(fileName.Replace(".mns", ".jpg"), ".jpg"); - bin.Flush(); - bin.Close(); - fileStream.Flush(); - fileStream.Close(); - IsSavingState = false; - Tracer.WriteInformation("State saved at slot " + Slot); - MyNesMain.VideoProvider.WriteInfoNotification(MNInterfaceLanguage.Message_Info1 + " " + Slot, instant: false); - } - - public static void SaveState(int Slot) - { - if (StateFolder == "States") - { - StateFolder = Path.Combine(MyNesMain.WorkingFolder, "States"); - } - Directory.CreateDirectory(StateFolder); - SaveState(Path.Combine(StateFolder, Path.GetFileNameWithoutExtension(NesEmu.CurrentFilePath)) + "_" + Slot + ".mns", saveImage: false); - } - - public static void SaveState() - { - SaveState(Slot); - } - - public static void LoadState() - { - LoadState(Slot); - } - - public static void LoadState(string fileName) - { - if (!NesEmu.ON) - { - Tracer.WriteError("Can't load state, emu is off."); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error5, instant: false); - return; - } - if (!File.Exists(NesEmu.CurrentFilePath)) - { - Tracer.WriteError("Can't load state, no rom file is loaded."); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error6, instant: false); - return; - } - if (IsSavingState) - { - Tracer.WriteError("Can't load state while saving a state !"); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error7, instant: false); - return; - } - if (IsLoadingState) - { - Tracer.WriteError("Already loading state !!"); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error8, instant: false); - return; - } - if (!File.Exists(fileName)) - { - Tracer.WriteError("No state found in slot " + Slot); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error9 + " " + Slot, instant: false); - return; - } - IsLoadingState = true; - FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); - byte[] array = new byte[fileStream.Length]; - byte[] outData = new byte[0]; - fileStream.Read(array, 0, array.Length); - fileStream.Close(); - ZlipWrapper.DecompressData(array, out outData); - BinaryReader bin = new BinaryReader(new MemoryStream(outData)); - byte[] array2 = new byte[3]; - bin.Read(array2, 0, array2.Length); - if (Encoding.ASCII.GetString(array2) != "MNS") - { - Tracer.WriteError("Unable load state at slot " + Slot + "; Not My Nes State File !"); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error10 + " " + Slot + "; " + MNInterfaceLanguage.Message_Error11, instant: false); - IsLoadingState = false; - return; - } - if (bin.ReadByte() != 7) - { - Tracer.WriteError("Unable load state at slot " + Slot + "; Not compatible state file version !"); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error10 + " " + Slot + "; " + MNInterfaceLanguage.Message_Error12, instant: false); - IsLoadingState = false; - return; - } - string text = ""; - for (int i = 0; i < NesEmu.SHA1.Length; i += 2) - { - text += bin.ReadByte().ToString("X2"); - } - if (text.ToLower() != NesEmu.SHA1.ToLower()) - { - Tracer.WriteError("Unable load state at slot " + Slot + "; This state file is not for this game; not same SHA1 !"); - MyNesMain.VideoProvider.WriteErrorNotification(MNInterfaceLanguage.Message_Error10 + " " + Slot + "; " + MNInterfaceLanguage.Message_Error13, instant: false); - IsLoadingState = false; - } - else - { - NesEmu.ReadStateData(ref bin); - bin.Close(); - IsLoadingState = false; - Tracer.WriteInformation("State loaded from slot " + Slot); - MyNesMain.VideoProvider.WriteInfoNotification(MNInterfaceLanguage.Message_Info2 + " " + Slot, instant: false); - } - } - - public static void LoadState(int Slot) - { - if (StateFolder == "States") - { - StateFolder = Path.Combine(MyNesMain.WorkingFolder, "States"); - } - Directory.CreateDirectory(StateFolder); - LoadState(Path.Combine(StateFolder, Path.GetFileNameWithoutExtension(NesEmu.CurrentFilePath)) + "_" + Slot + ".mns"); - } - - public static string GetStateFile(int slot) - { - if (File.Exists(NesEmu.CurrentFilePath)) - { - return Path.Combine(StateFolder, Path.GetFileNameWithoutExtension(NesEmu.CurrentFilePath)) + "_" + slot + ".mns"; - } - return ""; - } - - public static string GetStateImageFile(int slot) - { - if (File.Exists(NesEmu.CurrentFilePath)) - { - return Path.Combine(StateFolder, Path.GetFileNameWithoutExtension(NesEmu.CurrentFilePath)) + "_" + slot + ".jpg"; - } - return ""; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/StateHandler.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/StateHandler.cs.meta deleted file mode 100644 index 005d25d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/StateHandler.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: bfc53d94a1834ed4d9206ff9f45d7d74 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Sunsoft5BChnl.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Sunsoft5BChnl.cs deleted file mode 100644 index cebef8b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Sunsoft5BChnl.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class Sunsoft5BChnl - { - internal bool Enabled; - - internal byte Volume; - - private int dutyStep; - - private int freqTimer; - - private int frequency; - - private int cycles; - - internal int output; - - internal bool Outputable; - - internal void HardReset() - { - } - - internal void SoftReset() - { - } - - internal void Write0(ref byte data) - { - frequency = (frequency & 0xF00) | data; - freqTimer = (frequency + 1) * 2; - } - - internal void Write1(ref byte data) - { - frequency = (frequency & 0xFF) | ((data & 0xF) << 8); - freqTimer = (frequency + 1) * 2; - } - - internal void ClockSingle() - { - if (--cycles > 0) - { - return; - } - cycles = freqTimer; - dutyStep = (dutyStep + 1) & 0x1F; - if (dutyStep <= 15) - { - if (Enabled) - { - if (Outputable) - { - output = Volume; - } - else - { - output = 0; - } - } - else - { - output = 0; - } - } - else - { - output = 0; - } - } - - internal void SaveState(ref BinaryWriter stream) - { - stream.Write(Enabled); - stream.Write(Volume); - stream.Write(dutyStep); - stream.Write(freqTimer); - stream.Write(frequency); - stream.Write(cycles); - } - - internal void LoadState(ref BinaryReader stream) - { - Enabled = stream.ReadBoolean(); - Volume = stream.ReadByte(); - dutyStep = stream.ReadInt32(); - freqTimer = stream.ReadInt32(); - frequency = stream.ReadInt32(); - cycles = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Sunsoft5BChnl.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Sunsoft5BChnl.cs.meta deleted file mode 100644 index 885619b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Sunsoft5BChnl.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 539fe437ee1b9e14eadfb0477280528d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumJoyIndex.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumJoyIndex.cs deleted file mode 100644 index 69acb95..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumJoyIndex.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyNes.Core -{ - public enum EnumJoyIndex : byte - { - P1, P2, P3, P4 - } -} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumJoyIndex.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumJoyIndex.cs.meta deleted file mode 100644 index fdcbd8d..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumJoyIndex.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d0185abce4b430d478095a8d5621aef1 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumKeyKind.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumKeyKind.cs deleted file mode 100644 index 2a04034..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumKeyKind.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace MyNes.Core -{ - public enum EnumKeyKind - { - Up, Down, Left, Right, Select, Start, B, A, TurboB, TurboA - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumKeyKind.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumKeyKind.cs.meta deleted file mode 100644 index f7b10f7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/EnumKeyKind.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: b25aa577a22fb0046afd4f72cd99daff -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/IExternalSuppoter.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/IExternalSuppoter.cs deleted file mode 100644 index 1586928..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/IExternalSuppoter.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.IO; -namespace MyNes.Core -{ - - public interface IExternalSupporter - { - string GetWorkingFolderPath(); - public Stream OpenDatabaseFile(); - public Stream OpenPaletteFile(); - public Stream OpenRomFile(string path); - public bool IsKeyPressing(EnumJoyIndex index,EnumKeyKind key); - } -} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/IExternalSuppoter.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/IExternalSuppoter.cs.meta deleted file mode 100644 index e7bf3e5..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support/IExternalSuppoter.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c9fd20bbd0bd8ff46b6ddef7dfb345a3 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/TogglePause.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/TogglePause.cs deleted file mode 100644 index 2d74a30..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/TogglePause.cs +++ /dev/null @@ -1,4 +0,0 @@ -namespace MyNes.Core -{ - internal delegate void TogglePause(bool paused); -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/TogglePause.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/TogglePause.cs.meta deleted file mode 100644 index f8e8b65..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/TogglePause.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: c1371973a9935de4192a2d7b9556184c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Tracer.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/Tracer.cs deleted file mode 100644 index 2fc0264..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Tracer.cs +++ /dev/null @@ -1,80 +0,0 @@ -#define TRACE -using System; -using Unity.IL2CPP.CompilerServices; -using UnityEngine; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public sealed class Tracer - { - public static event EventHandler EventRaised; - - public static void WriteLine(string message) - { - Tracer.EventRaised?.Invoke(null, new TracerEventArgs(message, TracerStatus.Normal)); - //Debug.Log(message); - } - - public static void WriteLine(string message, string category) - { - Tracer.EventRaised?.Invoke(null, new TracerEventArgs($"{category}: {message}", TracerStatus.Normal)); - //Debug.Log(message); - } - - public static void WriteLine(string message, TracerStatus status) - { - Tracer.EventRaised?.Invoke(null, new TracerEventArgs(message, status)); - switch (status) - { - case TracerStatus.Error: Debug.LogError(message); break; - case TracerStatus.Infromation: - case TracerStatus.Normal: - Debug.Log(message); - break; - case TracerStatus.Warning: - Debug.LogWarning(message); - break; - } - - } - - public static void WriteLine(string message, string category, TracerStatus status) - { - Tracer.EventRaised?.Invoke(null, new TracerEventArgs($"{category}: {message}", status)); - WriteLine($"{category}:{message}", status); - } - - public static void WriteError(string message) - { - WriteLine(message, TracerStatus.Error); - } - - public static void WriteError(string message, string category) - { - WriteLine(message, category, TracerStatus.Error); - } - - public static void WriteWarning(string message) - { - WriteLine(message, TracerStatus.Warning); - } - - public static void WriteWarning(string message, string category) - { - WriteLine(message, category, TracerStatus.Warning); - } - - public static void WriteInformation(string message) - { - WriteLine(message, TracerStatus.Infromation); - } - - public static void WriteInformation(string message, string category) - { - WriteLine(message, category, TracerStatus.Infromation); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Tracer.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/Tracer.cs.meta deleted file mode 100644 index 92463c3..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Tracer.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 4a65f5b3f03ae904e99821cebd149964 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerEventArgs.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerEventArgs.cs deleted file mode 100644 index 0c8a68b..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerEventArgs.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class TracerEventArgs : EventArgs - { - public string Message { get; private set; } - - public TracerStatus Status { get; private set; } - - public TracerEventArgs(string message, TracerStatus status) - { - Message = message; - Status = status; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerEventArgs.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerEventArgs.cs.meta deleted file mode 100644 index 22ecc60..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerEventArgs.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 1aabf28e631b0dc42bf07ea3700eaa1c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerStatus.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerStatus.cs deleted file mode 100644 index c3ab5eb..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerStatus.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace MyNes.Core -{ - public enum TracerStatus - { - Normal, - Error, - Warning, - Infromation - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerStatus.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerStatus.cs.meta deleted file mode 100644 index e846c1e..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/TracerStatus.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 52a5cc3ce27c2a04cb04aa200cc3c798 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Pulse.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Pulse.cs deleted file mode 100644 index 07cd398..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Pulse.cs +++ /dev/null @@ -1,120 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class VRC6Pulse - { - private int dutyForm; - - private int dutyStep; - - private bool enabled = true; - - internal bool Outputable; - - private bool mode; - - private byte volume; - - private int freqTimer; - - private int frequency; - - private int cycles; - - internal int output; - - internal void HardReset() - { - dutyForm = 0; - dutyStep = 15; - enabled = true; - mode = false; - output = 0; - } - - internal void Write0(ref byte data) - { - mode = (data & 0x80) == 128; - dutyForm = (data & 0x70) >> 4; - volume = (byte)(data & 0xFu); - } - - internal void Write1(ref byte data) - { - frequency = (frequency & 0xF00) | data; - } - - internal void Write2(ref byte data) - { - frequency = (frequency & 0xFF) | ((data & 0xF) << 8); - enabled = (data & 0x80) == 128; - } - - internal void ClockSingle() - { - if (--cycles > 0) - { - return; - } - cycles = (frequency << 1) + 2; - if (!enabled) - { - return; - } - if (mode) - { - output = volume; - return; - } - dutyStep--; - if (dutyStep < 0) - { - dutyStep = 15; - } - if (dutyStep <= dutyForm) - { - if (Outputable) - { - output = volume; - } - else - { - output = 0; - } - } - else - { - output = 0; - } - } - - internal void SaveState(ref BinaryWriter stream) - { - stream.Write(dutyForm); - stream.Write(dutyStep); - stream.Write(enabled); - stream.Write(mode); - stream.Write(volume); - stream.Write(freqTimer); - stream.Write(frequency); - stream.Write(cycles); - } - - internal void LoadState(ref BinaryReader stream) - { - dutyForm = stream.ReadInt32(); - dutyStep = stream.ReadInt32(); - enabled = stream.ReadBoolean(); - mode = stream.ReadBoolean(); - volume = stream.ReadByte(); - freqTimer = stream.ReadInt32(); - frequency = stream.ReadInt32(); - cycles = stream.ReadInt32(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Pulse.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Pulse.cs.meta deleted file mode 100644 index 82f6312..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Pulse.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 74455848e758856438177d90dada5bd7 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Sawtooth.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Sawtooth.cs deleted file mode 100644 index 3d06632..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Sawtooth.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System.IO; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class VRC6Sawtooth - { - private byte AccumRate; - - private int accumClock; - - private byte accumulationRegister; - - private int frequency; - - private int freqTimer; - - private int cycles; - - private bool enabled; - - internal int output; - - internal bool Outputable; - - internal void HardReset() - { - } - - private void UpdateFrequency() - { - freqTimer = (frequency + 1) * 2; - } - - internal void Write0(ref byte data) - { - AccumRate = (byte)(data & 0x3Fu); - } - - internal void Write1(ref byte data) - { - frequency = (frequency & 0xF00) | data; - UpdateFrequency(); - } - - internal void Write2(ref byte data) - { - frequency = (frequency & 0xFF) | ((data & 0xF) << 8); - enabled = (data & 0x80) == 128; - UpdateFrequency(); - } - - internal void ClockSingle() - { - if (--cycles > 0) - { - return; - } - cycles = freqTimer; - if (enabled) - { - accumClock++; - switch (++accumClock) - { - case 2: - case 4: - case 6: - case 8: - case 10: - case 12: - accumulationRegister += AccumRate; - break; - case 14: - accumulationRegister = 0; - accumClock = 0; - break; - } - if (Outputable) - { - output = (accumulationRegister >> 3) & 0x1F; - } - else - { - output = 0; - } - } - else - { - output = 0; - } - } - - internal void SaveState(ref BinaryWriter stream) - { - stream.Write(AccumRate); - stream.Write(accumClock); - stream.Write(accumulationRegister); - stream.Write(frequency); - stream.Write(freqTimer); - stream.Write(cycles); - stream.Write(enabled); - } - - internal void LoadState(ref BinaryReader stream) - { - AccumRate = stream.ReadByte(); - accumClock = stream.ReadInt32(); - accumulationRegister = stream.ReadByte(); - frequency = stream.ReadInt32(); - freqTimer = stream.ReadInt32(); - cycles = stream.ReadInt32(); - enabled = stream.ReadBoolean(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Sawtooth.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Sawtooth.cs.meta deleted file mode 100644 index 1578d02..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/VRC6Sawtooth.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 382f7496025cd8846bf6459a0ad7f45f -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/WaveRecorder.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/WaveRecorder.cs deleted file mode 100644 index a117145..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/WaveRecorder.cs +++ /dev/null @@ -1,306 +0,0 @@ -using System; -using System.IO; -using System.Text; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - public class WaveRecorder - { - private string _fileName; - - private Stream STR; - - private bool _IsRecording; - - private int SIZE; - - private int NoOfSamples; - - private int _Time; - - private int TimeSamples; - - private short channels; - - private short bitsPerSample; - - private int Frequency; - - public int Time => _Time; - - public bool IsRecording => _IsRecording; - - public void Record(string FilePath, short channels, short bitsPerSample, int Frequency) - { - _fileName = FilePath; - this.channels = channels; - this.bitsPerSample = bitsPerSample; - this.Frequency = Frequency; - _Time = 0; - STR = new FileStream(FilePath, FileMode.Create); - ASCIIEncoding aSCIIEncoding = new ASCIIEncoding(); - STR.Write(aSCIIEncoding.GetBytes("RIFF"), 0, 4); - STR.WriteByte(0); - STR.WriteByte(0); - STR.WriteByte(0); - STR.WriteByte(0); - STR.Write(aSCIIEncoding.GetBytes("WAVE"), 0, 4); - STR.Write(aSCIIEncoding.GetBytes("fmt "), 0, 4); - STR.WriteByte(16); - STR.WriteByte(0); - STR.WriteByte(0); - STR.WriteByte(0); - STR.WriteByte(1); - STR.WriteByte(0); - STR.WriteByte((byte)((uint)channels & 0xFFu)); - STR.WriteByte((byte)((channels & 0xFF00) >> 8)); - STR.WriteByte((byte)((uint)Frequency & 0xFFu)); - STR.WriteByte((byte)((Frequency & 0xFF00) >> 8)); - STR.WriteByte((byte)((Frequency & 0xFF0000) >> 16)); - STR.WriteByte((byte)((Frequency & 0xFF000000u) >> 24)); - int num = Frequency * channels * (bitsPerSample / 8); - STR.WriteByte((byte)((uint)num & 0xFFu)); - STR.WriteByte((byte)((num & 0xFF00) >> 8)); - STR.WriteByte((byte)((num & 0xFF0000) >> 16)); - STR.WriteByte((byte)((num & 0xFF000000u) >> 24)); - short num2 = (short)(channels * (bitsPerSample / 8)); - STR.WriteByte((byte)((uint)num2 & 0xFFu)); - STR.WriteByte((byte)((num2 & 0xFF00) >> 8)); - STR.WriteByte((byte)((uint)bitsPerSample & 0xFFu)); - STR.WriteByte((byte)((bitsPerSample & 0xFF00) >> 8)); - STR.Write(aSCIIEncoding.GetBytes("data"), 0, 4); - STR.WriteByte(0); - STR.WriteByte(0); - STR.WriteByte(0); - STR.WriteByte(0); - _IsRecording = true; - } - - public void AddBuffer(ref byte[] buffer) - { - for (int i = 0; i < buffer.Length; i++) - { - switch (channels) - { - case 1: - switch (bitsPerSample) - { - case 8: - STR.WriteByte(buffer[i]); - NoOfSamples++; - TimeSamples++; - if (TimeSamples >= Frequency) - { - _Time++; - TimeSamples = 0; - } - break; - case 16: - STR.WriteByte(buffer[i]); - i++; - STR.WriteByte(buffer[i]); - NoOfSamples++; - TimeSamples++; - if (TimeSamples >= Frequency) - { - _Time++; - TimeSamples = 0; - } - break; - case 32: - STR.WriteByte(buffer[i]); - i++; - STR.WriteByte(buffer[i]); - i++; - STR.WriteByte(buffer[i]); - i++; - STR.WriteByte(buffer[i]); - NoOfSamples++; - TimeSamples++; - if (TimeSamples >= Frequency) - { - _Time++; - TimeSamples = 0; - } - break; - } - break; - case 2: - switch (bitsPerSample) - { - case 8: - STR.WriteByte(buffer[i]); - STR.WriteByte(buffer[i]); - NoOfSamples++; - TimeSamples++; - if (TimeSamples >= Frequency) - { - _Time++; - TimeSamples = 0; - } - break; - case 16: - STR.WriteByte(buffer[i]); - STR.WriteByte(buffer[i]); - i++; - STR.WriteByte(buffer[i]); - STR.WriteByte(buffer[i]); - NoOfSamples++; - TimeSamples++; - if (TimeSamples >= Frequency) - { - _Time++; - TimeSamples = 0; - } - break; - case 32: - STR.WriteByte(buffer[i]); - i++; - STR.WriteByte(buffer[i]); - STR.WriteByte(buffer[i]); - i++; - STR.WriteByte(buffer[i]); - STR.WriteByte(buffer[i]); - i++; - STR.WriteByte(buffer[i]); - STR.WriteByte(buffer[i]); - i++; - STR.WriteByte(buffer[i]); - NoOfSamples++; - TimeSamples++; - if (TimeSamples >= Frequency) - { - _Time++; - TimeSamples = 0; - } - break; - } - break; - } - } - } - - public void AddSample(int Sample) - { - if (!_IsRecording) - { - return; - } - switch (channels) - { - case 1: - switch (bitsPerSample) - { - case 8: - AddSample_mono_08(Sample); - break; - case 16: - AddSample_mono_16(Sample); - break; - case 32: - AddSample_mono_32(Sample); - break; - } - break; - case 2: - switch (bitsPerSample) - { - case 8: - AddSample_stereo_08(Sample); - break; - case 16: - AddSample_stereo_16(Sample); - break; - case 32: - AddSample_stereo_32(Sample); - break; - } - break; - } - NoOfSamples++; - TimeSamples++; - if (TimeSamples >= Frequency) - { - _Time++; - TimeSamples = 0; - } - } - - private void AddSample_mono_08(int Sample) - { - STR.WriteByte((byte)((uint)Sample & 0xFFu)); - } - - private void AddSample_mono_16(int Sample) - { - STR.WriteByte((byte)((Sample & 0xFF00) >> 8)); - STR.WriteByte((byte)((uint)Sample & 0xFFu)); - } - - private void AddSample_mono_32(int Sample) - { - STR.WriteByte((byte)((Sample & 0xFF000000u) >> 24)); - STR.WriteByte((byte)((Sample & 0xFF0000) >> 16)); - STR.WriteByte((byte)((Sample & 0xFF00) >> 8)); - STR.WriteByte((byte)((uint)Sample & 0xFFu)); - } - - private void AddSample_stereo_08(int Sample) - { - STR.WriteByte((byte)((uint)Sample & 0xFFu)); - STR.WriteByte((byte)((uint)Sample & 0xFFu)); - } - - private void AddSample_stereo_16(int Sample) - { - STR.WriteByte((byte)((Sample & 0xFF00) >> 8)); - STR.WriteByte((byte)((uint)Sample & 0xFFu)); - STR.WriteByte((byte)((Sample & 0xFF00) >> 8)); - STR.WriteByte((byte)((uint)Sample & 0xFFu)); - } - - private void AddSample_stereo_32(int Sample) - { - STR.WriteByte((byte)((Sample & 0xFF000000u) >> 24)); - STR.WriteByte((byte)((Sample & 0xFF0000) >> 16)); - STR.WriteByte((byte)((Sample & 0xFF00) >> 8)); - STR.WriteByte((byte)((uint)Sample & 0xFFu)); - STR.WriteByte((byte)((Sample & 0xFF000000u) >> 24)); - STR.WriteByte((byte)((Sample & 0xFF0000) >> 16)); - STR.WriteByte((byte)((Sample & 0xFF00) >> 8)); - STR.WriteByte((byte)((uint)Sample & 0xFFu)); - } - - public void Stop() - { - if (_IsRecording & (STR != null)) - { - NoOfSamples *= channels * (bitsPerSample / 8); - SIZE = NoOfSamples + 36; - byte[] array = new byte[4]; - byte[] array2 = new byte[4]; - array = BitConverter.GetBytes(SIZE); - if (!BitConverter.IsLittleEndian) - { - Array.Reverse(array); - } - array2 = BitConverter.GetBytes(NoOfSamples); - if (!BitConverter.IsLittleEndian) - { - Array.Reverse(array2); - } - _IsRecording = false; - STR.Position = 4L; - STR.Write(array, 0, 4); - STR.Position = 40L; - STR.Write(array2, 0, 4); - STR.Close(); - MyNesMain.VideoProvider.WriteInfoNotification("Sound file saved at " + Path.GetFileName(_fileName), instant: false); - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/WaveRecorder.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/WaveRecorder.cs.meta deleted file mode 100644 index 6ea774f..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/WaveRecorder.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 889c64e645ae5744e9af609edb7b2db8 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/WithExternalSoundAttribute.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/WithExternalSoundAttribute.cs deleted file mode 100644 index 0ed7069..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/WithExternalSoundAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; -using Unity.IL2CPP.CompilerServices; - -namespace MyNes.Core -{ - [Il2CppSetOption(Option.NullChecks, false)] - [Il2CppSetOption(Option.ArrayBoundsChecks, false)] - [Il2CppSetOption(Option.DivideByZeroChecks, false)] - internal class WithExternalSoundAttribute : Attribute - { - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/WithExternalSoundAttribute.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/WithExternalSoundAttribute.cs.meta deleted file mode 100644 index b6aed36..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/WithExternalSoundAttribute.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 8939062f5478c624088de22b10b3dda5 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ZlipWrapper.cs b/AxibugEmuOnline.Client/Assets/MyNes.Core/ZlipWrapper.cs deleted file mode 100644 index 29343f7..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ZlipWrapper.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.IO; -using ComponentAce.Compression.Libs.zlib; - -namespace MyNes.Core -{ - internal class ZlipWrapper - { - internal static void CompressData(byte[] inData, out byte[] outData) - { - using MemoryStream memoryStream = new MemoryStream(); - using ZOutputStream zOutputStream = new ZOutputStream(memoryStream, -1); - using Stream input = new MemoryStream(inData); - CopyStream(input, zOutputStream); - zOutputStream.finish(); - outData = memoryStream.ToArray(); - } - - internal static void DecompressData(byte[] inData, out byte[] outData) - { - using MemoryStream memoryStream = new MemoryStream(); - using ZOutputStream zOutputStream = new ZOutputStream(memoryStream); - using Stream input = new MemoryStream(inData); - CopyStream(input, zOutputStream); - zOutputStream.finish(); - outData = memoryStream.ToArray(); - } - - internal static void CopyStream(Stream input, Stream output) - { - byte[] buffer = new byte[2000]; - int count; - while ((count = input.Read(buffer, 0, 2000)) > 0) - { - output.Write(buffer, 0, count); - } - output.Flush(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ZlipWrapper.cs.meta b/AxibugEmuOnline.Client/Assets/MyNes.Core/ZlipWrapper.cs.meta deleted file mode 100644 index 107f3ee..0000000 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ZlipWrapper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: e1fde431f4bc3d548b77ff7467e14bc0 -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes.meta deleted file mode 100644 index 07ccdad..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8e5e5b73f8ff71745806799d6c3a97b6 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/ASQ_realityA.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/ASQ_realityA.pal.txt deleted file mode 100644 index 8c93587000a097dcb9dd0e175d877a5f4fc673e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmYdDNMKN`W?-0O$j}|hke|CeExzyk*B)~yo= zJ14F4KSANmN{0QX#6nIW+-fjCr|ID=i z*AxE#Pn!BaCHTt}gF|Z=CL9q7x}>3SY?8#TOFlk65G_FUi_iRDvgQB5ZT}x^|NsBM i(f@l^|GzN*&w~k%Ud=f5X~BY5j}|=owQburhXXiCWBE#3}PAQH zM20As4Psa@3a7XW|MWY@abS#rrNC4{bs-dBr%=v76o48aswlMqr2g}LKQAw$$i5Np zu|K6d=S91R#MvO(Hgy4}yDa$8}lO)IiWhncy%ODU7f i&+99rBjb?Vl3~na#Osa^@A+EmxAtGp&4WP@B>oHWKUhlu diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/ASQ_realityB.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/ASQ_realityB.pal.txt.meta deleted file mode 100644 index 069a07b..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/ASQ_realityB.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: e7c963ec91faede48bdbc4c837d184c1 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final2.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final2.pal.txt deleted file mode 100644 index 01fd7161385a8bd76c93a26503ccf1a9ae345b56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmWFv3SwYr;9%&|VW{(B@C#sIb75dm<6z)YU|`T=U@!u5xEN$S7+_$@k|hil=S;-j z#IfAzVc0N>!DoU5LxCBCPY45F4g*6814E7uLtG0?Im7?||9$5Cuc`RIEam^LsQ({A z4t&T8yVfSKYY9Wy0S31-QhF!SOb+d{va*6`0jl42>;H*U|8E`o|6$+%KYQN&I&|RE cnMKcTO*-?eZ^yeu>t5|!_u|op4I3cp0kwonUjP6A diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final2.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final2.pal.txt.meta deleted file mode 100644 index 38cbeda..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final2.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f90e9c85a73ad3649a73f6b5c66ee21c -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final3.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final3.pal.txt deleted file mode 100644 index d1560114d793161f7a42272b592372c0df3b1a18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmd1E$Y2nfDaElWkZD#OLuMa?OdT_0pag@wIRm2~149%8Lx2o}Lm~qV?A*DNC+2#9 z>4#3q2fKMTpW{h9pv^bcmoYJ)LB5-TaRv{=WN(JX*)Zh{|Ns9_-tvF;#Q&Ge|G&@r z|1;yj&)S@~vvv3G6|1==eoE~fA#GDx4ZuT*zo_~hBtrr fZvA0IB!5(s diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final3.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final3.pal.txt.meta deleted file mode 100644 index a7b699a..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/BMF_final3.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 79fd9783decf96349b1bbdf3cd49d01e -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-13-default_nitsuja.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-13-default_nitsuja.pal.txt deleted file mode 100644 index 9367073b717ccb7bb47548e9851b82114074f5a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmYdDNMK;75MgN0VaW4h@XKM4h+<|6lwdGXVPG&}U@!ub3Jf|G3=9lRU~uHf5r&9+ z2J(OEMINkR*l>U?=72WeG6#YDL-K87Z}v;O6i?QGdZ*`BqW3l4F3QBzwOrl6Q};)I`sd;zW;yr jy!(G)%l}&w-n^M~=i9s;{}-)$wQt`0_xtwk;{XEyDxy&{ diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-13-default_nitsuja.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-13-default_nitsuja.pal.txt.meta deleted file mode 100644 index 8cf7af1..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-13-default_nitsuja.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: cffbaa9e5c24d7b4aa3e27fcbe59a880 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-15-nitsuja_new.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-15-nitsuja_new.pal.txt deleted file mode 100644 index 4765e546ee52b95039b806aa4e1dd0489f874e1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmYdDNMK+n5MgN0VaW4h@XKM4h+<|6lwdGXVPG&}U@!ub3Jf|G3=9lRU~uHf5r&9+ z2J(OEMINkR*l>U?=72WeG6#YDL-K87Z}v;O6i?QGdZ*`BqW3l4F3QBzwOrl6Q};)I`sd;zW;yr jy!(G)%l}&w-n^M~=i9s;{}-)$wQt`0_xtwk;{XEyB+5}M diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-15-nitsuja_new.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-15-nitsuja_new.pal.txt.meta deleted file mode 100644 index 92e54ec..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEU-15-nitsuja_new.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 4a281e2c6edff1f4a8574e1429fef097 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEUX.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEUX.pal.txt deleted file mode 100644 index 2b8ea5d63eed04734189df388a053361ca4dc6ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmXwx5f_6{0EI6O2Eia43F4Z3BiM45C*{@2nNC6;b8diK`QA!~l*4~iADySZ@ z*`ke>MG92o4RH357qbqMzG6}_DEQ4tai=)4_N?;rrxU&Q@vp|mWLY*%Mql>S9lMs) WBZlfmBiT1^HqwseaiP^(PyQcXXH~5L diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEUX.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEUX.pal.txt.meta deleted file mode 100644 index 19fc3a3..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/FCEUX.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: acc05b5c291ed1c4fb812b7be20b8113 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/NTSC.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/NTSC.pal.txt deleted file mode 100644 index e958862fc6f7d4482915a02e7e1ac1bf2fbdd93e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmX|&krKl|00kF|#e6~_P%IXM#lypV!eOBh2nGX%LLpEn90U#m{eVIsPzVGIg@Xsp zOlJCKpY6KS83g?y?Q5!*wB1rA9CzTL00W2R>o#5JaiUa_YveUywP&(Pdjb!)g`Bd^ zvTO|$wGS#vHBMSEjhxXXm#2$~8H|Yy^JK04``1~W*XSj$Z+L&hL+^)%^BA3v?*18w IdWNw2KarJKod5s; diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/NTSC.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/NTSC.pal.txt.meta deleted file mode 100644 index 49ba5e8..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/NTSC.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: eae5c00585ff5ad4da5ff743aa7cb388 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/PAL.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/PAL.pal.txt deleted file mode 100644 index e958862fc6f7d4482915a02e7e1ac1bf2fbdd93e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmX|&krKl|00kF|#e6~_P%IXM#lypV!eOBh2nGX%LLpEn90U#m{eVIsPzVGIg@Xsp zOlJCKpY6KS83g?y?Q5!*wB1rA9CzTL00W2R>o#5JaiUa_YveUywP&(Pdjb!)g`Bd^ zvTO|$wGS#vHBMSEjhxXXm#2$~8H|Yy^JK04``1~W*XSj$Z+L&hL+^)%^BA3v?*18w IdWNw2KarJKod5s; diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/PAL.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/PAL.pal.txt.meta deleted file mode 100644 index ec6386f..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/PAL.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: dbea537bf3d26ef469d311366274b854 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/default_ntsc.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/default_ntsc.pal.txt deleted file mode 100644 index e16b0b172dd785873e5623617454bb695ce350f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmY+E3rv$&6vzJFaUPQimH z6|6$6tOhC=$Sz;TK?o7{liF%BBOxS}kc`LVJMm(R^X)?2Ped_EE?p&aBkzeuqtWt0&K8(NTOiX1-$o+( z5S)^LJtkn-W2Fn=0Z^;mdcB{4T#2=J1IOXcH)c}}h7CWM#SE=8Q+OkFJN)>tOa%DG zh=|nlWNIu)@>lIaGQE?02z^O*){`%JixQ(7Rj6n~qRMD{TR69(Zik1f&i~Zd9p(KO z_4A80^Q7uNsp%sPs4bx-`2;2~`1uOjx z;9(6*$~l{AJ`e)<(Di=A$^=B6v1SbhIP`wLDqCW``M4VrL%D`I6R_y1L$uik`vK_2cEa z6K4~Kn?pOhe9x)<FUfJ)e?)1Ds7>qCUykdZKcagCsa_<~@a*oV4 zez6Ocq&7)IQlP~0xq->0omCkGVU?vxaaWqJsaLf;J;qVBhECc3dz-oXRoV9=z z^(VS05S7z5USQfhj4_;%pzRcd#b$I79RV!ZQMa5LoZU7Eid)9Wx_^TJA>|{O`-U@s+V0wA-k%jRNkySt+-VxuGR7$>_Aw?!a)29Qk)UG33g1t5il_aoTy1!y29%>>ir0E zWMH>gxZdzJABkU4oMspyvM`Erh8Hz?)F~YT1nUtc)bp*kesn8%!%HPc_Yg(UBUMOc zXJmM_XjOVXLK@)I?PA#}wEn(ljk~S{#b4S2T&mVr_~4 E09Bs^3jhEB diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/default_ntsc.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/default_ntsc.pal.txt.meta deleted file mode 100644 index 2f58f29..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/default_ntsc.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: af0c6ae054b9b8b4eb1e950615e9666d -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10.pal.txt deleted file mode 100644 index d2d3d92386668134b52214993310ad9d21e1adc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmXwyff2wk2m%?#WgNz37{+B7hLWcBavHn`X9h(;(;{Z`3T#ZH8kh*6^ZRNyh|ngy zut6U)cw+)@1gq*AY|omsCUAtWQ#vtll9YA-C&I6+%?O#kRz|-uO;30#fw^?*0j(of AKL7v# diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10.pal.txt.meta deleted file mode 100644 index 8699e1a..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c87310fabe238424d8bc9b8cf5e06a1a -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10emph.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/pc10emph.pal.txt deleted file mode 100644 index 8c31437bb6377ca7a0354d40215d8bc93487b536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmdUuiE%_B3`1QE%}|V+p%|K>80QJ`kKLq!Fdmje$g;jSGoy`&m3@uKNwgR}vPbI? z$tI$+I%7^CD|(Hn8C5Y#k7Jky@MJSuYkp8wIctns37Ad!F~YmEgyMkW3ntSq%-V`l?7pi|SWoQ@Y*}c>=-&yv1DlE8z(tRaHuEYX>hu zTgj(>sg`hJ0eMoe=HM^=u0q!UNU@dfwClm5qlLF5}j``9=dOCO)0WxD#T(KX!S>}UJv@B(iR z_4aTZ0^Z;6-9EqiUmmQbHbjAS-yMpw&;EZt#$Czo|I-jE>&s)dkUH$8bJ#6d?1ZA*cEKD#IniU)*BzoB!PW4h!9D79_m7ICo*iYm6~p{}-$~3&zi1x&B|p(S BTsi;% diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001.pal.txt.meta deleted file mode 100644 index 48f7c3b..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 3e8bf825b3645ab47a1e3db5f98d65f0 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001emph.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001emph.pal.txt deleted file mode 100644 index cd08b4a08da446af21280909a3bbdc6c2558b57a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmdUtft3Uy2tz5xW-NwgEQV$*hWiOK^R|VXb2-Ei0@_tKyCcqNerw0x8?U=Fvnwj{ zMBW>@L&54>nTt@Ii{E`uY%JzR#E!W49?^BI6OnbhOFQymkIK>}4uq#`#nJXQSbro{ zQFc}D+$6_M^QvU5wNSy|NmQb+FyclsMd5t)(*XKAQtJ|zew1`&uTaFo(BIZi58`26 z#7KWHEV<6ozC}*DIx!(dq0(0RpL86lLg#Ml?=(1#dG#wO=^79DFww(eLQ>=TyD^Ap z6J@Td&{bpF0&*_(#Gv`hB88U30Ac9Hd@ON9n1Ui8-Jx#ArD2-p0}Z9YdH$*Z;T(y7 zwdXI1Buf87uYYEG^}D<2Q8(meto!=eN~*W2^*R&8k~<$qd<uV@~3S1ik;~;b@?wFn5CBCG9DSLfxycT+c^3c>fx=L8fNIf>Sykj83O88i)^m zW<$inWI4j}ePF2Ysf8Vw&xQOr@qrBn*rbdj=}wrU_&C_XbAmsBxAIqTG6sT$i6bNo z96LVF#KBOLk3<|S0FL0e;b;3{Xo%n>PEiOa5j*1tO!_c5^}m`w5UOq= diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001emph.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001emph.pal.txt.meta deleted file mode 100644 index 229e4a0..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_001emph.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ac166adb93cefee48bf472799c28f078 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_002.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_002.pal.txt deleted file mode 100644 index c1226cf1d57ff19b8d42121f484502e883feb512..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmWlS0Sy2#3<42TGZTXu#9#(7Jl`c2tyghWgLcO9L8lBhQ5$HZ-&x-p2iR&KM~P4PR8whI{AxpZgoeT=;nM_ zyZ9}xB6j5MyP~S%W)=V$z4z`QDR)=hPEZ}{M0TA<>vm-2ihFNFUBoLgbHOAPs8p|R zuC-9A1mCd^RTp)M?z35tLLwvAq44a@A*Wcj|n+LcAi8bY)${AfL(IW z8Z~J66jv?adA!Za2B-g$1tb88kN?@TnCZ>f{2}r`d~m`{b3Xp34d8fx9Q0l2DT7S^ zg`+9|U$rNTf@utv^iE1tzBT_n^RJJl5c=l7Y4^;(x=bsX2=z$wuOez0WX-?!tP;U2 zBAS0SSL4GF4bJ#1m_ycQn_R|6mpB2Rr)Y=}N5)N>Ply_Ih59who@W6f1Dn zFu%F%1xRN+th9DmtPO1O-mB+-6lOHivkON0aC}2{arf$KTan=I{x@X#as}6Pw7VbA C*IYUP diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003.pal.txt.meta deleted file mode 100644 index 53a0ef0..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: ae891fd90c634b64aa8d3bed26c9a130 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003emph.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003emph.pal.txt deleted file mode 100644 index aac10048a1a97d9bec02c75d4f5afedf3d4bf968..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmdUtfsq9v2tz4mo3R+0u^5`6815zfy?-s7v+F2^Bq9|vId`(E;n{?-%n1~j!v_Afjyv5`sUuwJ4he5ro% zBIgKde*KGF4DvsJ{G+a*{c{;}Itv4&+rJXY0*TLj6t{nQwtwOZ$P|^JG&&$+DCXE+ z>c`A&n~Mv{{+4_T#!YM&_k8k%9*{DXACnb9*Pjf<`Ph?7iiXQ1If9%~Q`KKuY{h?E zP_GHghU%|V!8~BvTI?1YJN?e!R}BD1ukyzaTRw5VvrL+knKh@(U;l5=C?&4kW-+fZ z7W=W?T<|NsT8E+&Aer`|A`JIG&FWfEbW$l04?ur?`rl8b{@3%U!+8%LfWo=f;0ra8 z`qXilX&)8IDry;C#WkbuYDu<;Vtw00{jV+3YIDDh`(KH=o*zbtz0k|7V*Flr*J80W zGwOVj@q%1Fa+!To9r3;Xzj0mQ>tBSx>|dDW1i&E9;7Bel%>vBgi7de0KrzT(Ce|#V z0kSCa7-0W;U+{WdBfwT+vzB%ff2r1;`97AH9KhON2Fz~y25s}>hc$!v-fXp&@Sn~< D3mR@A diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003emph.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003emph.pal.txt.meta deleted file mode 100644 index b2f17f7..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_003emph.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 9a6da4c0ffb86d749b681f8a9d4403fd -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004.pal.txt deleted file mode 100644 index 23d44ac1eb1e485ddf8f16b17805c86184060fb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmWlSK>+|T2m%db8N*P9Fq9z-W4;tPAqM9m?de3Cr7@DQy{jQ+x^R>Wa@8*3_wG(R z;aFurX4xQWF@U1(SboOr`>BdFa_3gUbF;fi*?vrv4(>OnX55qhU4@OvDP;ZZ-aI!? BTsi;% diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004.pal.txt.meta deleted file mode 100644 index 40b51a0..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: f1d9aa9ac67469d49b197ce086e00b86 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004emph.pal.txt b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004emph.pal.txt deleted file mode 100644 index edb82efcd11dfdce7a395d95059fb15ec3a2a83d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1536 zcmdUtftA1@2tyslWgLcO9L8lFhWkm{-mP%HJ{yrhKz5Bbo1T$LZD83)|}6x?5|VIeL$K;MCqdH;%>C?yA!VTyu+aH{l1?YFyU3q^vvEm~(c+ zC1Uq!RxM?2F8gxaSGgeH>T?^?J@TEn)#!B_?lt8c6v!xm3&ux3BHQ{E+4>EZ+@y@q zMNz^~@S#-1fNN574@4*)1)#qd(j-M!)-Mg*TEG3JzpY=J^%GJU`|Ab=eJD_g<_FU` zi@*rS{crbQHAox_|JBQ#KpZs}epBMW?!V-K=?E0PB5A3|Mbb6$@{I{eT<)JmYM1)< z-?`Y(?g#>SkjsBgQs|HSU_dO7ejn*O3wss-%jbqCiz6UAM=A~J{7aoWOGX;a01|;1U)vz2D-4%qW;jUy&cD-X{@osnc{+haJ*MBuVShVE ze3rAn^Y8XsziQ*dCo<9@EC49c1J02h3%$=(68+Kt_`ny8QsC C&2Aw8 diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004emph.pal.txt.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004emph.pal.txt.meta deleted file mode 100644 index 101d9c0..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/Palettes/vs_004emph.pal.txt.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 1dc183e92926f564a90573e275d7b470 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/database.xml b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/database.xml deleted file mode 100644 index 39c4861d5733529e07d81041402f2e7023bd2841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3968168 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%0D)g?fOEbjlz#)9D%@xLRwD!2#>ScRe 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 XOicX2%$r>3KTe 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

kuXB^3 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%0AW<&k$P@Dkomatmg%#uTkQHzg|mJh&7z=Nw1#* zi4$>@JamdsjX~Ik#I@3RZ)aMQQO$ZBp1bPB4wb{U#z;KeFXtnYhO-gE&w1Wk_yn`< zdvHqpw%IncG!r8hg+QyI4nH&`<&j}MMj;jb=zSRNs(5dyQqYeT%9dzh&GeLpX^WOx znot%OH?L@96r7^kP?IsGgn^{cU_VapBI+fmz8Rx-6e;qwNpN z84iE4M1%gFg1Ud{>eouPko=*4|LTuky>a#9Uw2;F{i|Oo?{wF_@zI@Md(FKz`S7y3 zK=2~i{Cqe1ZERK=Vbq<@iPDY;4IP|2sS$ zGi*Ox;qhSNME z;ko=%_ESh_Oz=c|D@>#EPz3QpHjQi>vy66tg{JDkGAy39sg1>RZK4>{j_m*yWWmZw>EF7S7w?0My!8)JeYA*Yg|9oh_t)irYZkTe&@8p?x}N#Dm&ed z$)E4?H@{eL6&kMs-o z{_UUq!hiC=-d&ojIc33h{oE;)=`PE29g4J1mli(Q$ici<+WzhGN+R@+g|^ros~*~7 zBz0XMj<)VXbVZ9p;I}im8U40Ymd#vH>wgI?9|LQ7xDe5Y+%gSHTq-NXhH&oFLNo*e4g9q1_b zi12sb02qw1v$L>gJBJq8|KYCt^D9uG=hfw#hPL+$hRALIQo&LPlM@}~XwJv!|E0oH z|J>E@{QAH5%8z~HvV8UsCQ83@k3;bh|8!Ob*7{c288C16Jr*v;2g3q}Q^&+bmXetU z*UTSJJ;X))#Qq-TE0~96W{!qw#>0unV4E0%zt(1aSnx7AN?~xP!bNDjrb=C1(Zfnh z+CNnWhF8F|%$l(#;MKZg&1(XcwV8YSV55j9{=h^JjK>S_w;!=t>e*rJ>O=;x!4s*E z&l#WWhQ{Ac#`1E2Aah)*k;qL zGQ3uEjO`Py(5`sx-G8hMg!{c;#(r42a=y~Y^>EQ`=%|v2v2WY-JwpDrh4ntB9I_wN zeA7+G$m*ks*SBAZDn-Z{wf8yEQsww}3&!;;^$$GM7ert=X?QpXXhv08uvh8xVH91j zztqv9U(jA?HcrpO+kLc!zP6~Ro5S>1igx5X!pIIq^vuCImA7q&v$BmB zs{`vBj};t-#`GRKJe-To&eP_esqT>&d|WVgPVVTgb`0Z8aaziDhpRuk)EY!*A7SaZ zgKr+U$=+iQ;j3^TpNHyn1HC{`u~*?2u3)=i`s}dma1?Jl9F1kJO>=D5y*$%!7q}io zf3M6nCswHGlwN7$_rKlgu7_jyorm9Yv$0!bWnJg-l2>d#90^lL9kWQZ@@47yA;0B4 z;C&XqV@6WvtSd7Pw#7H%Cu<0+;`@SxSOu$#7uqZAek#`~kWlP_eGMLZu6}o0;{Cc? zVohQnVso({5Uylw^hmvkD$FEq+tTXF6 z*%Ww}PuV{c^WsfII>y;%+pKab{N}e_Kf*@M+J>JhB(e9O&da2QkNC-Eg7kHJ}G z<{C?&6-kP}!NOP%!AHLZW0R|qD4FO$iD8n18!i`h$?O*UeJU(H%$B`ZVu-h6X?_1# zSgMz{VQKjBn898DSe*iQj>Q5Wl@EJpW&Tv>ul~xz{e`dPnTPR=ySyyng8y3Kh(3M) z>R*22aDU64vU^;XXSnHTmOYm@!5-Q3p2L|T&CI;W`U$oVnPGGf43N@8p{M##GMCI!RtQcg{}h|WDm}aS3Cf6_6U)>O_D)(KCcrP92&XYe)27oiL$Pkd zec{y1Pz<>2tTqvM@qE(6 z;S@ioc}kx)k6F;>Ijl^)w75O%GOPXg$QhfuXM_FTvP{W)w#ftUmUifODuI3(qvgD3 zdYBbyC65^$%U2&It30DV>~&Tn^#lTlpNg-+&xtIsd+{Z~H(n?2+s*7=v{&dS)M)LiG_&aiI6M=y7mOJeRo}Ngg0>a^PE=cCh;7?%us(c=R_h*Sg0XF{{jr8OZBd)4wOaJ}p;-`c zO%z{!E`=DrLZ$DS&la&&Fu|IoL zPb;SfVV<7qSPU*P7kSF#X1v&A*;HcJR6Ft1!yTHA=Y7@#4vDMLp0g5hG&?*F;Z-{_ zPFJH2!}TBm%^Qz%|Kl^bp1bWAmD0x3(=j-RNa?f(VZ`HJ*I#-|Y)^Vz?~1m-f$U@M zV1M(+$ly+4Yp_;SGIr;>x!P9oZ|q`l(AfSMmNlIpUdPVZqf}<>F@7;K0*KD(fe;x~!G-7o0$Mw!L0cIX7PJ}T=xxqZfQA0(=~63_hZYJ@Tg z<+^M;iQ(CTt1ox+YK%eKxE!`-eWtcltu>ArjWwlXa5?CaJUM&$G$PL4ZY3nEG;z$L zVXX_%VdlMm&7|0kR#kGkl6l|?PtRUDl^3CMIT$TcrRTd#xZGU+N1YM<`*x^9bhmoP z%&~cotaUrhwu3dX((te;?}iaZ1*0}nuC>xr$vEuISh_oQ&5uqyje2T_!Ny%J+HtNj z!yKFI+tg-r?KXJ=bBR4bIWzZ%d!MId3qV!~s9)e0+ZfW>`QR&m7Cy@2rVsm+`ItWA zfo6@YwN9s=ikrvgPLGARi)xnH*5+l0Vd3+g9m_VlUu;_Azx-^%L{laA%eq|WUF}!n z)7>dNu{3)-7c(%Y%r<+zXB*BEisP47C*bZ`6b&kIv58lq#fZ0M z5ykewFWJ`^i3mQ{Oc;!aRQ8_xpF+`#*E%eFsCjNjJ*B10a( znJqkIfjHdQCySej|7Pj28Qp!@>tcIrT{cY7GsM^GdY|U6qMgy(_+G`NP}cm0yVJ+8 zM(<~ZQ4CpE^=6=SoHpOjyfDoM4K#fzhgWn$5??X?o0W%r7w_oQrH*XkKR$5N*9 zEm!o!dVatBNvz7WeK)64*citSQ~bVOX5>(lYhl&Pok!%&GNa@K`+lR=_T=tDtl@Vp z^W{=$6Ir$|pKJSa&6e0jtf1+dfm2ivv)9gH7?tV47d1uV~zK^ycRpo1QNHu)_sfXTP_lMRHEV#QIzgk}1JGacec_pxg za})<7LcjNuKHbE*)JCM{@dHo=A(p*DzJKsB84!H$M$vorDu@Dof=ke6PBWX=0c(re zwr;CM=1tT`_Isd>Mgn4nIA3Wo_aWT z;bE)lER|6vh*+xYMbM}aJh(WO3Wv@DF*iOgf7M?3PRF6^yneh8VV~1CSi+kXvyO!a ziT$v0gPCU(7@wYWMu9U5V4{zf7o=t$3&y^2d|uGwKzvtc95~~^uujgI4V=b4*oO^V z2MQ#9?Ti9v6u22EAeQv)qF0E9jNkVU{OI>-#jfM4DlD{EsO{K+W2!38c2QvO{Yaac z#u3aZ!G~46sPI;>kZ_9m~vM z)usv*Jx~lbTVFN`U-f0DOYPQJ_K71%G{I>!mg8`#Itu$JEA#@2sfZ%=bM@pAtwXXNYW}OVSY{(FOgX^TqD)eA;!wev_;F6mBg5cjA&8hE{Vq4hN5CU$F|mS;tp;qitZnGAfjwdEY=d8`i!Aw+cXmEjGXLTlS{g z-F|+0487ZV2%VlLhwAlGJ+GdYd1j>VcOD35WLyqdYR!^e%Sib|d35YJn{fm4r#@7+ zen!(XBOTi4`}q1EKQyiNbq|S`_!`J(z2F=+{al~}GHGg=;wB4xWjKlX!54W(4 zP2bWO)?}mKT6j|zAr^LBuj5s_4%wme?O{)Hi;_=CNN|r>eu4RRNO>o?>$NwdP-DIb+&Slv-u)6^-hH zqE=NKfX`Tr`(_+z^&YSBC#%WvpgZsBqMWAb^ulkHe-k-B%{=;*t6#tRpRfMW)!!~B z8Gd~A<-K!{o-H}VuN2D$lgTdLisyf}ux2M}f2+Hu9mjvSJpZ@LUlm3!${F2Hm%r|~ zHUlYk;|;<`aI0c zg43PrI-GI1`CN^*cJ8{d(w}-(o`p$ z;p+Ues%sc6btzjG;nZU?ZByIp+-{Q^RGwGGA^zoYn^KdM2U-3JkFy*mQTyht=hP1V zc)oQOMb2UrNg>LCo>HU!&C7P1rj~I%MVsw2ME_IQTpJ=`t+V!^tGf1TS;hPWaQJ&= zbG{iU4E|kH1&VXBV)hTm!Vi5bM`TKD}{CL6gtvy;=88Y(3 z;IK}ov(-$5c;=@W%eu8LbH0f)*WjQ$LGezqpD1`%c49q+H+M+FPRV4`Vz#feK&VD;Pm~fKundrO_ZKf_U@FO^j_(Y zSIhqw#WTlFsi=8TTJcorQGb83yqY|-T9f;oa*li*MZG!B0)?Rz2etH!(Pg>A5KYD7 z*cG7+HNqZg^nA)sc0uX|T&3A26EoSD`WF^weC1$zsv(YOZ`=ReYHtvA++KNh$y)K` zyV@%|)DCV=nsMXy+5_mL$%s<##7?euQu6tz)H1+QzfRlro=P@ihcaK~#=>K-w%a?0 zw5>A*(??ScGIlyvviTjS$7Z#9pDL{j+Y^5Um7P-harv2D`&JoMUfg%P{%vvB-?;i` zSO3e^e^;{R|IyXOtzWb+-S1JeC|9#TlAzoKoa1Of(PHRuH-*`5boA=G-O)RYY%M@>Sd5Sh8B(rkA z+wq2R9O~)uHf!ahhwEe?RIH5TPGPi9mDRAlLY>p7-!14{d1xC6U+i!*Hnn*=M#IBB zH_722uJ&b!*tfP_sZItz=7}lUt3Ca2m04ZpAR983ED}M^g{Gf8>x)B9da2zt=0FeCv9pYV%yrs zj-kAMjl!@w|0r?vinN%`WVR;u!Mu{0FJB)%%8|$}oKKjGu20N;Y8p)2wC(hqR{N*; zS(Sly4Er2gHIAE4vmQNz>0`ZB54Q96>--!0Z*M9Jq`o%w^Jlx+UUksQtA_TgHcRrix#kS3RzMS}|a(4rYa(5(A*d@;p777Hb28x+vKB z`mN7&E30Lf{$@E{>rY+%nR3F`e|Ys<7M{EMpxpTzBWv~Zg%7=1RwXXQGnD#q{6xGX z@0KTeyJM3t7A~g3*Q;d*u^S}ct!=fA8P|TiY?qZ<^|n}JeMR+T{hgxzo9LM6L^Q$a z9?vRGO)tB){f(y2;;bqm`$3cq3&fr)1CX-FMzYt+*TUvl3)u%Mnr^dF*G37_;A+O- zrnNYa#TkERvb|6~{aQB<*ai-s9Yd%}>r_I1(KQCionJZ%so{{HCkgv?<;6whP8zpn(;?_6ItM?09 zeOM5Y@?{02cJxJg>ZxyN+Z{7cx8D(-j9bKGo=D89b@`T4de`~U+4Sbnz0&e}-pzCm z_!~uuRMGR7OFhqjxVH|;`wiFmlJt5T(Rs}8muKPyvWvK~jq0r{#}@Y?$lf!_oDPs9Rdq@Q#s8_CrH7smC+bCu1>}p9JAK814 zI+krd4`*#35waOoT-C+7%o(rSFCdC>A7lDFq7U)9rMbZ;UJ7i2dgks!eS?h%tL42zR%X9&hQ{WT=DXw7 zwu7+V?fh^z83n9&`+Q{xo;CO@iYXpOC*wt5oFY-hq0O;drw+2aE=t~7xYFi#oEp`5 zj6W*)alg!^Z+FOkQS3%I_n>>KDZc&S>W^RDE`MJse}DRu&wTQepL~8H&z-W@FBcW* zPB)9Qx3p1C9MCg`-^4TD#<#DP`@GaWu{a})xqaQ2%e$~UJRX$W$twh>AV`BxGFNtn4KX~zcD!5KF+(fAK=<8*+Tog_Q z!yYA`eNgx*@9~G_X}(z2`uB>hoVXahGDR~??QdTF*H^!I_1C%@?7vZ>A^-cmS=+r5 zg~NONeCb=?*T%DZ9dG`2_go@1-z)3vL3wJQXrtEC<=UY>iG%Wueq8?bskQhO-d&Z! z>^tVp&;mU!eo@U?&#*^qkEb54C9Bu|%$mX?Sa$UKSXgGEwGtmCd=e+A&MeE&YD@H8 zvSKii%dRg^gI_(L>k)nle%&ok+47lGrq{oZ*JY0xqnTHG_Bcedq0eME58bQA`skG* zmbCo~RysVyx!I%nRBzoHL2-hy&s~QpK{)l0FesxezQoQVKENocs|0bvwc!XvgfLS) zskpbjO>MojjpXJ}&Nzl{;})^!>%K_gvByGcyjEMxL|D!yr%PysJ=2WTTi&-j`xdQl zw`k4_(u&$SHSbGZb&-0oLx1e{3%7JiF^KNqqgK?c)58yvT{?rFF5R#A0B0V!5nb%nk>{OxP_^mdt;#LThpX4~vLgZ|i1`yz=lI z&)%a{5z_l2rTe-&ZIs-!vFA|oXNqFv8ASw|H@lJX`p0R^2ybSN^JcWmqvU_7y#7J4 z0}SdU}Qc$-)Vs5sx%>7j{MiVkz52@jP)@ zI3GR-&+M#_jje)HKsWb4g*7TpKlZv&?fYmOn-jhHQu+I8d9GJWtN32*Xe_25FV9?~ z)Oz%SS}&F>=052zua)~~<&^KuGrl2S>CLe^h8MF*jRl3w{fE1XjE_{x%+3*&fK7a)E$!RA z(rykWEN$IurL|wWwXAhd5{|GzVcPZL$C}6(`~CfnVST5}JQ@|OSL5J8hxok1=Hw>x zdT9~ss{G?l(Z}Q#^AosNn{ho|zJotn?LT`>{pL2?dZF88-!9kPFYJ%?*eir%wzaFu z!W`ooS|IBX`A+FcCo{*Z*JsVq%k8zvBcA%Y?2b8u-o9sdwC{@}5VtC#RTM~KL)``6 zk^@TbU@P*P`kZ~zj(%BsdkN=SQ&|DaqDSTAFubwXvgY;wIv3`w!|D6*-pZNsso}UR zi8(g=*6U~2JyK&{ax<;O!>UXlmnZFybI%pDc)RFL@@`v}9r8dUrKK5b@yL_W^4VKEJ$|8*yFp+f~?Hc{0?@FWw< zzDC6o_ruc&o2#FPlIqo{alGH=E@e*3v^QR)F^;xXuEz-*#i@zwh^Oxm%kqVyp6srx ze7my^@hKHz5^d4OM>Py!pHV#?1|FMtnKkUgtg6_Uo9l{_3?0L|5;aMO5DnndH2KU! z%*x7gN71uzke5H_w?n}2y3=AHrMllImhi57x4ycSclGaw+ZoX*@6zhw_xfhu-nYxu zLv5>KM&{dE92Bn#~)7eiDxcHN^Shy<%JKPI49ORcwC@S$wNl8*w%? zehLA^@cKF&?Az4F!IoEoHwtfu?w)PjB2mF+QO*5GodU{**FA0K7tfL3>HNlmWuO;e zd}8bD!!7;nc-FDrZTHw*tOwPl^@*FrKaY*EB7%YhZT0Rr7`yvCx_P$Quj6&L?VMJZ zEb7cuQ5fSnZe{*d=@T=VUn^EE28l@qfBD1k7)&!+3sw#!u-n_;t#K?h{?{ca`^ASl zlQ>8bo1Uw(@A~=8{9qmw>-DMfEfj*v$8R3a*0Ja@DOpMB`&}7bi9N)=uz0I_lW#&{ zK5QOE-feMU@J9q2y8!<1SW{{Fv1tNk0fZ7i#y${5n>>Ox2268=r+dd4XQ>=fI<~Rd z?3GjgJH^@Xmt#~GSfeTOI2@PBiY-kH!6{Mpxq=|PKH_FB%Nm*17(Aowx;iX1nmDm2 z_{te$&lvl7aM^b5-jj>5yDDEDhsiFfe04_IGs?DA#xs+B(iDTXD)Z!`?5=2^R%66>eb#ae>Ibq4hH7Q!?=W1rO$jdbi6+te?HKCxjANUN3$FOIBX-YlB9 zZyS0hO84qYyO%Hypao}9`d!!yt8=)8``r;0r(dr)6hg#WVNrMLMIm+e8* ztHJ}O@f!2{(lAz|-VgV|DQa$2=H}3cIE|9MIs4c47PUQy=Y0+%$2d0gBtI?tTy~@6 zwXfOd+NS{2byVNAmJ+3~e4pDsi|2g%=XH7JpHIrZ8QU%Vb7`(zzw+)iV;raNTbqeh zU%oae7=5L;B`fu*V#|zo(dnMUMvfiF!mFR?>q@Ym+0CK{MM<+4MNG->PacsdMls)F zqu77qbwu=}W))kVJ&1iL0()v(C4#fIFj-N{T3Dkqd!8_DAxk3BnZLI@U9v2PR<3#q z$u$rSrrwXZN71^f{)l!L2d+j#B8|l4vYEAt73@>u+Ec}9X`E4=6+Q1cvxMJTqKppF z<_?KX&p60_NJh?~5j{&ZxM#Y!9#Mg>cPn)o*%QU5#tZgU1Cs+MMlgB9l|L*~5^9WF zJ5TVYV)@UPb1}t1B?_wcNmcNsF_iFT+&|mwpT1XWt*e#>H+L0G4{|NX^d%T~*)ilE z-)^>!x4lJ=55mpoO=AVq9qeY*Vin;y^i>>=hr2QuTPWAg)oEQh_DKxCZJaAThlG7* zp53`uI-X=CTq~I`mm3-p<(4GXOF~X>9cX2ud_!27wPvx=Z?jH)K^crsXSus z>Iv6M{gkDvr|+44xx`t!d6KzAt#oj`Tms%N@ig|c_eoyY`|OH+&+NOd*ZLl}uY$8C z`{-f*ysxcLvmT>8vSEfb@bIFj zs67+PnR(()#5GOhSCS>3N=s^wXkS8P3UdOwQzG z(G03C;(6vGo7Tni*BI0Imf=`cownH#j}|fOSoJFFa>SGaEY?YmsovJBL*1An?iy#3 zQ_1C{rb2Gi@8k?8YE53UYFQ%IQtKuabB&%1*ik6%UDAg|OTl6HTD$`t0bLz=O z%;RM>EkVpB*-dB6JOyUfh%-A+>SJCHX0G)v4q4_IGy9$U(d#@dmN}O{|72t4@p6=w zVCJq|r8ZuQNW(5`40z9x)>+&lw%o1 zZ~n;g@#<7j%O1b4O@2{orF~SaO6TgZIksgS{o>VsbM?b=j-u;!d;40aiG99nk2AuO zEA?^ro!aE2R%hzG-NhY!rC2Gv=~*l7=m)*I4kX1d1eLE6TWGdqyu@V$HAhYuKa0PnYK@eWg6% zOQp@u)p4SnIiUjUW$A-HPigb@aXf@*vVLEjub}*LiKcVH1yl7bQnTo2W3ByPT*^w20C^ ztu8ffQ`>q^IJs?z*d| zK<{l49c|<`UomL=OtqDlVRmh8JF3mB7PFZ;(aGQ&;sKOMRZe&&b1)|}TlMP7}|7h1}lH4v_O@>8va?7$}Arn=!6!>~XTrkQdka zmDMCuX$^K$i#?f4Wf`gCHknE04PQ#;ko^lYFtg;R@&iPPHU}{Zd9HQ?@2X&#&-;eu z*!_4_qOQ?x$4AGfZ^5d|GOE|dZJ+K=Ay=OOZ+@rzo9`dTzRe?Lzy8-@WYrhOo+`5x zCxpW0n&%m=yzp9eP|Z|p&Gr0HPR>f+HCAM%o9i;i%}b2gOm(WEHK;O$zwW;TC2^Ch za^>r{e)i#K*e7CsbKdx7^sl&RXuw{%xfof;pvRLn{5Ciuo(~Vrelr{?76rc{&L}^F zwPGj327QJHR5b(@aUqY9%*ih>m+#Sty1#R}&4eZ1scDG&9j`hY<}9w%{RSZ2k^h#6t%gvuid68=Uk7GQE2t#=69T0MPOwQ zPr$t_za7FHzff$h-OTZeWfiKA;v6Ja+6Tq1XW6$c{C0eB&b@Y~ofB8yD%Ib=QSSJ0 zxrdWiYSjPx<-RJqwD0kyawXNo_4RZ*{jo%6*v3@nwB9h){UZt5OclE^YpqiXfH54d z0<%ialKi7std-+f5#d8VtI~;86UMQsxi=q?4uBxvcuC) zUC5Y-?O-ubdf5B^hve8>MhvsdDb03K^K1zQSDxCpsExs`7D3Zw`q{y!%scyp83;qQ z-yGF0){mcY#}2~6?LqpBz0_{e6oGrKz@F6l)U-BVjm2W2O+T?|^JkSE z>qOvn$}jeZ%RIRCnev>6;q}iH7P}j-zgCbntn;FrhvuYo-|oBHxaxdSK2a*Jf8n#M zx1;gCr?X@%#)@t{Yv#_roVSg()I3}W6%!#Uj+JVnwP# zkG&)|3u6`Oqn1^V)5{s}TC|NW5YD?6ZSR(|(zl^)|30)$8^&mB)Osyq7usf?&ZBKx z|J3(vU$JqJbv#x%@t)caU!W^w#r+@-7EB3-2hf`BOe<9#3>L9x#M3!zU?05g+tkL} zcALzrJSUrK%6Z|d9mHP3%8$zAcUS8NmKA1SwQQP*)|-d0*f(IzzQ3h)e6Or&7+~J_ zd4^R{XL09rOXuRXJY&YXt?;hr&GVRjYUccdF1wUY1?7UoEzjGZzxw-EfBEWHug&9z z+nMKws1i??5q_iGeH6zE`6ldQ4cRPi*(QS+TKdtrfj8 zL~8Mt@sMCvaKgL~9%q$d!SZKQ3y=;$5rhr#xLH#;GNmrPUiF1-QM7B3nj%``!ZtbT z{8@r6zgs=YY3z6NdUTyBMq_kslpe1AHd3)2Fju}yxOzG2|5(`dc>)+|noiaGz(EV?M|hlX=CP=EF6 z*ROu*>L0ACgL-&0f^jno55Y#CKQ8utzN~Nat6yn{W1l%prL(7-r{lFpF~D9@4;AyV z+%*$(<{MoMs^)wwub&$GvPT%Z9*b@^_Q5JBK zeTofCJ*A@4DRYV#J%_!V8n($8VEG$gnCjla^*Kv_H}?6~cqQ#)Q$}fD#CAOe4cLr; z)qI;~5xyDUnRmlFp-)anvqSPVxdT2vRygO`;NypV9~Oq>eD}+O5r?R#cNSUYcZ-U8 zzc8A_METCPHU3I@mbVHT=ef4q;M04Kv2L60*|x;(MHmbes_S471?^KSM*b~vRfb(&Z}5De!tJIzh@9R{E_WzOE@=Wtzo!>lUzKLx)_?5|xQ6=7;0 zSsA!uA_y;vRrPV%x!&q*s@gN_JoMP(RQFtGiDz!EwZthPI2^4Kns|=kSn)DpN6-%Q zi;YXw#KftfcC4VFv7^2C>yG?X?n(hS7vM&lU(I{ysbFh8^r8;T9rMXKrkA5OiAlh$ z{b4znePOXI2HerBiR8o7@*5sW`SrUy=mF}!v1?)cRQs$}bQ@{sb$zgEJaM6Y z4SgfMS+TRu-r>52GrRI46Xj^%v!bW0hW%hyG6P~6U_f>&do7*Dr(gkGpvxs{$M}Tz zMEQxrm(_BL6(8*_tY*`~y16UOjB}K1tm-gy7ulQCzP*u&&D;~>+y=zxI7RB2Aps0XmcJ)3~wAhR< ziDxq`XsLozG4fIE@aOe@S?0x)wZr2dn>e|CkN1hU%gpBk3{(9BKl*(${_#$?LO$*| z?DxwW!F2B4dZFyXR?Ji@zxw3&eDax3e(xujpZvrpKl91oDJSIog`%AQ;sMI}*NV-9 zSBNxuy|56g(sxfIpTE|{4?K0N&t*!)Wm_q_drQ6B4+ZoZm;d;SdVspQLGgWoFcOoZTrAK6=&S*%0+PmIgZn)qfnp6`@?`nc%(Z-d~Cs+3z)lAv`RLiWu`i-)La{fZR%B<~SD`I{2xwwffNNx{(OG}0} z2Wx_YLVt-Gme_>o;dX@NZ-hCr6sf#y6cK0a4%!Z@B%U?*ulT=B|JTFcEl-XiKX^EU z=A#qY&GDkLp_gi4bsn>oUM_3yrCVPgt-sz2&|eE5VyP#RW9$zY&bZAyoLY-HKGxxU zsVu$s6l%pdG6qj{QoH?_uR~uB$BOL~KW?&8^t{nC#%v}2&AdX*G9n^P@IsuDEl-=u zDeqGhv^vbGx68NImgE_REvZkny(MM_`%N4V`*qwB)*x-n(_+4MnE3vwV^Pb@Go-vio@)H$Vkl#wdyYhpC!0x& z_%*bcTIfCV)^#lRMDiFXW6b*EY1`b1j6vJ8T;r$?@hn#@(KAiI_ol@5yjQRpI(%5> z;m;LJ{;15!kIFjuedYJBl%GB-|G!fHb&Xx+enG&CvU9y&SZFdRr@QLkzxp4_F8bH5 z{`}RSDJRbT@Tx>i-u;CKZ@hZ{>Re zwN=dP$pVcQ2XT+>k%2l^Gex51k+Bm6wZsKkPgYQTo?>WnLY*tv$21{0<5d>4l?(UW zIhsd$GSTkacB8f4==2ba21@h{#QN=7!zRBl3vL$_c)ILFPZi|)!mS@Ktz(7$#E<@u zhm&vajdCAP>{A!F{&DdXYRh;p$}T+o{vnDFv2Xb87v-6My4=l-jGp1%LtNDBQ*5+5 z;RxyZsgHy{5uFmN;G3a8dCjNrh9EusGjdc-N~io#Se_U$BOgs_icu|8Z?)`;rDfuY zmbJ?q%Kk%lq@rx@yW%#@DAAgUmCz5gORs8+-b#j4yjGN3y8?FPo_s@;9xb2KWv3cu z#p}$Hc5fW}Q&S)NX{{r^qIXMwC-PnNVC03= zim&yl!)-NeD6yz8dW@R;T0leA7G8`~wxa(ruv#?$%JAbRJ}~Nr=ff`JZNN%hZO5^O z@jaXlo5gHXy5#&%|7w4u-^O{x5;kc`DBQ($UK|*<~P1ovnyHFENZPtoK<3M;|pU) zh)>bVX`9+sL*2sY~`uOh)yIKDf+p8iC+jr*-hy!_{n+-Pyz1PPsPz|EK z^ysh*vuke+eVjdNi>!tK7$P1uUNz=D?n5KMBh7u*xA;N)-g|8H_{EZ+g<-lXwMOV5 zv9x(j-T(NgogJ-WH$3YRblw`MJu`>e)AwmoQI_^Y?Rv+|-1*prHfoD0pkY8OUd!=V zL9%F0byQgZYyekd)%F~*`0@wX7w%)9HM`g&zL!4}a<>q!h1%0LtwC){O;o4UMi{pV zK6_qv3v7qklq=5*54A4wt}ISS9v?b2m0hPL*^5}bVrRxX(dkjUr7&&thE8?C)8qWd z9n-xmt8>cK@$>(?uyOD1gV$f~#*O;&N;hZQtb5*1(Z=l;JC4leh+4CqSI^&lEwhe} zT>Y%{0c!^0!DqZN+FnJVWhg!ME%X>I&eePlx2g(if6^iAH#(ns>=haozgNbnJntvi zR9dEffM^RrO{nYcLxv2uut!)aJBwwaU*VJ8GFpU;gGA0kU^s_Ovp>D>H{&|Zw#WJ_ z)()Sva>;&f(7GX=T>*a`KPU7|U5muay2^YqQ`uB@Y(2_*l)5c;d@}{gQVOGY`}joW*F>&j#8a+M1^~+*7>I8e>t3 zLiPuGNBN?a!E9QK|HJihV=6v&kQxp4ce~1|6tZv}mc(KEc>Eh?RKJgFTeae1iyjY? z62HyQ!FMvRL+{3dq!FqE;Sv1~`@ z3GtMP3!Xlw{*QgeqG7-Je%^9k?RfFAL99aNfS+>(J6xPMrs57>ZPn)3+|gt2rozNn z$y;xi9Aig+Qr1y0Cc2KEtrmkmn)6^zcl2HBC_cjTI=UR~?dNs$B(0;mA8lHEhpwaP zYNLXhNz2#MFan_74-eYrwV|qxeKt2||JvT7w)!`Gix3D7JJ^GXAi$^T>o=UD@z{2Fotv)yRPjV`ZDnTUHMwoj~N9yTG5bsW7`xT zt6Pp6ZbaRodZdODjTr-{;_!`z8&X8Vyzp-t3~m<PHFu=N>*e?h#%)V)W<{5`i-w_s0yrONVT4Ivd120#9VvU zZ+b2fj>B3;+f49O=1|ClPhzIylmEC99!k znOt^$z;*i3nIlz2@2zrXg?y0*Wv+_dn$O}+q%3cyNUH0@%CklJY2ZhnCaioMPW2XT zSff%mYx;d!t;uz#diT6?GYk8)w&WQr&sZt0{J4tye!Q~Qc6he<5asjcoU8YWS20od zbCH7gum0cv=uiBoU-@GX4vraowq){#9iHBoxxNBYV*lfj%h{%Up4I+bhO*nDm*I|@ zo2jP|m1*b$;};XRElN#JrW_toV4~6z|1X+NMu42HM2aU;U0gS>S^QwBQyK1m3eP33 zE=KOD@)Sc=a~qOY8~JYYjF<7d$Fj)HH}{&aGCB2B@-*@bs|loXj`=zqC7w)Yp4fxs zp&B2V13n?vLkzyr;d|zJ_BVN2sn;N8pFcB^eC>Rq>6zWNhx!&Rjm?l}<&WpCwd#lM z5h%tdedQmg(a163chwK9e!ke7Y+*aKPjs}32p450 zs(7Qy&9}QMICnc+OJ$lrT&_?H=PTv^)WtCiTKM?SOBI~IQR*A~n}6)T{3E~g?O(e6 z3%CF2ZP)G-`C%0&vij96DEVx8vUhHMzq_Ix>G4d74;feS<~2~yKrI6M(Z1-IDziaH z@utT^N2??e(=wo@dF(P-%s_L|{FFf@+r=yt1#JHL$;=dAC6d6pqwQI*qI>;Gm9HAj za{O90L!ZSkDrN~f_WETjGpb_1_^KB>j7y95^Yad8-Zs31ZR1!r)g8oS$eV(NX8#ah zM6`R|jsYKFYj7nQRLOEpUT7lV;ioJn2nkbis-N*!w|a^%H5PlwG^Z_EikDPp@h7Sx z*@LI;5h(=wy`Su9*e{dUC+*RYR34uF(T**`+&y8anl-s|c8+O#HvJIc3CB7W&@7aN z4+*zb)858oo|KiEnC(<29A<}{ex=^+X4QGE=G=kvS{<*)?5gXmyziAAUS;wxc6Ev{ z1IV=x52=2#pT2dk>@35W(3aJ9ub|009k23zZANnYN6bovU)PQK$naano`WD@Rl;kQ zcCCLj)V-HsTW#Mk^0d#wWplBkU^%AmX@~onlXBF@W0NHg1&-VMQt=2!#+g}e?qDb3 zjkNoTV8lyOzs=`QS4AUCEvG{-MYq~B_eyQoZD(=z@6TImn-Oj>wN^tN?$h-fGuO6R zYI<+XJ?y)fhv?5lKy8jydL9d8bE_Gr#zYtg=ExRH6{JLurXDYA#%?X*lzr{fyeut6 zyv04HZEACm_^8Ki!dB&h;i+u;%gOwc7skd{=|dE(+AJ8Z>V@pkFfwy842q&)R?2e6 zn^~)=zJ;qy`G+=5>)_4REefNUKLKPKnFiPToT%P{_=yHHxk*UKqxyU|9&L~6aggx& z4##l=)#{A?`yHao=l!4{QSi^}Q$(!!XJdchI$Ye0J?W8=Wo3R@Ik3w!43W{?GGk>` zLPj$fKgOu3Dyfbj#y)2#sZkLO^uKj1avRS#kC&f~w8jrmGg6@=4W_qXx3RvuqI=xa z_CD8j`u?G~SjS*LTr^60(Vinm)YEQ`R5TkEL}W3i;x!Cq#X%5b#qOe4MvIht>RdRz z1`Um;an1e5u~cVVoWn)y!HzZFO&(WNyjy0)HdX&PsCc*A8&q_r%)Q=a3B7(s$D;G8 z(`rwkVp``_@vreDYh!McrI45s?4a(?XM8;4<8|=Hn}d%RWp}fp4zZ!{l>PB0+t7)# z9mct?$k z$?p>7+z8U?aeB5NpJ@C8u4!AF^C#+AJ@a{)Z3~*UtH!*iOI4K3*_Uc>>Y}MpgV8z# z#b>BCsYz)Ds;TEL(Sm9XWR+O-RhTeayWOUF3%cbaU66d6dusj0OZA|hN*H0tLaVF1A9)4ihEkUsc#5(tDq=OblAFQPj_J+#!$aVG~Q+ z|J0OJr!-1bXSMX{lQ29rMS@^@aEV3UwTz3bmWb`4sx{6#;m$K{gqpHl+ZpRc`>)9UWax1s1t!cJq&9L9D3uo_i@fx1- zqRi-2aNLce^VQVvlwRJ=I-f4KBP)@1OKt2=6#QPXCO;_lVSpSskClw;h&kamuo}!^ z971dqzC(M1IH#+?+ed?ASVPpBuas1K=K6HZ`i+^9YuPD83@WCc@p!CoFkYPae|YX# z9Er=LvB6Z9gS$j?Y&#v(wB_XUlxK_y+QH{Yid_;TijP%&F+8 zEZr&N4ibtlPNe*T@i1*P67 ze_)utpJS*0V>zqtzgx^rr>OdTVHbA`o<3Lp_dRnAGjW7C1x)-_c{(Tl-0wcq_KUmQ z*b}~sV`itG`hLPOS*zwwj|a;za~sFBV$3lXUaQ)s7$=oY`6Wd#t2B+NSd};#AGklP zdDxn0Q5?n^m^&JG%OmdfaQjqem@>+KBsNbs9dfN!T%A=; z^GIYt`08+j)E1H$z@(-^J$C8mxJp?z)Zx#h90oX|at_mJ6z z**hKWqO4SwOy=FOYNKL~OY1d5fUIY%>#{u26v=+ISlEB{>X#2dF&@R(%`bJ|(MGX5 z<-461`cz?|_shSp6?O=_auR48#a=AYBCkC30j))|SP)}06QN;MMSD9gnu)%#Z<_OF znEoEFt3(hdZqwXkqgYjRA^UJJ0S}?vu7G##wzwy<`8QGT4S=* zO8Y14Bb-Fe9a!Dm;Ln|!ySm##@=NgLbycl@t9%H_MP~>j9Yvd z*1sLf-ea8Li&4w2wYi=l^|t7ozD;XTjjl%@@vZp$xJ`A|MX&VylxOn^swJ`rOH&yU zp22W9XD@|$d@#@~zCu>>n9XfRHFLi8nfbWI!*MV@J&x@*)*qL@Y{Tz#2vcX%r(tDJ z8J%A0qd_;%_^v(EuUzwL8h6*fZ#9NlAr9g zy*^F?a$9?ld5I-b*IB=Em#l0m#d*)>bxGz_?ZqCgKHYovF;@0k<%T*&7r9?{^jcx# z?!(_-FG|Ws-JESJI)AZfI{&0(kl(-h{vZ1j-!QlLv3{Pv^>p!gKh<$QYcQ*%t?zuf zC^h$P{j;m6m2Exe>CzV3bxs-ZRL4F`$7*aV9OIne@0L{&|MyTIPmbF7`_|efr`BA=(DR#Jly&~i z^6#DUv)m$eG0g0JP^jOFmYn2HS5`?ibvB;wda|#1*wSHM?l6gJ^H!(c95a(NQLsY` zVHqOTHn%M|{w+~itZ+)p7?UV66c+vuD3h4USo^6S0IPCBHhY;>ocaO&O>_d4z$d+X z8cedEzzfJ^J+I?;Uz_op)t>9$pU0$4bsO_;#bnhxQfJ+34wKrJ+x3st7$XkHlU@F< zHVV~G(UR6FBvZDPu^D>RGV703y<#0VJ3Y$ns z4oAnN^YJOWr}#&aFF0EC#Tvi4gn?aGJ>4G3jPX>X>fcZGG*^w;*D|EbtaAeIK1g@{ zStDc*SD0l7~nqr$!{XOltq~$ig*0 z;ds0_bkbOr(2zxxm~KBOa;nB5Ea!FWGCiwehuw*G==TG&dzT{LqnXy98ttAh&$u7j zUH@2}(e9MhJw&UY+IGEL*6Fs4_EVtUG4k6_i+ag264#04MFAV4Uh*}>&BHv=2oMIw zVQr}!A}UIpidX|IF)__JqfhbhQsMlxTwz;>dWo3ovG1m$US-+)q2Be6)fx33chuW; z2Eu7jPpwOc9u~1Ih6-cq*X?nvS9-r}3w9^f-}4O7O|}osTxBr0#Ww)AMB-8LRH3EO ziH{cnBWjd}CpRVaxJ1AtP87d$|0UMzn%YLbmxXU1IIU7A`cw<{vtKjQ_GNU}KT>CG zyB=(NP*&VU@lL+i%`26d^6jp`WWt(I)L>&=EU+&v2f^3+RXfE z)xXUAoA+9@J*n3}R>#M}8h5@vLUZbWIJMstBHb-&hddq89$zj$$(DKRVWq}H5a@1M z4Z9IYcHq0^``#$uJdZnSBHS%&tH-GCmCwN(pIL)F&;?V;DRlCr3$mxj77N^(R$5f*+}N0TuVN!oE5|C&sJ}@X+B50 zoz*iR%l>GP@@G4w5$XPJ$K&4a*7G44dFR&8F2Km!-M1z88avD?pW|oN4L0Xo6`z6Z zu}MXkc+KYz$4s*%)>*$M*V(RZ%rwu~rmRi4>}iMVFBPoBwWT7gNC$SRd54uH3I#W_ zQZtK_6AU$F%ZV_d+F7s5b-A^eS$n5?N7rEH5^uy)1IE@y%psHB&Db&**P`Y1kJcD1 zAD=jrcwZAsFmA<7I3uO*o5OVpCx&^27*lvmA1RTFO?Zh_8HP1nu`*%prF3%f4ytxx zFUe(MR;$=A{Iq8vr&z7+ES=47-DQhpcRjDx=~_B= z6zB9C&a3tKt930K9>!b`>z|xry`~1)d3WtAx2?(IsPWTcS=kliz3=f}uj?YN>7%Ez z`Y9^4s%xvN$8}i!&ldmB2Srh+k=)ahdBWz$dTF)&Q{@($t=8>21)xTSjAO6)n&pGA z?Nv&^_=gq+-ARs!N;j@kkDE;|6HaVSYBtcNqRffIb_Ng2KkA&i4aqX0YAv-W*2d<< ze=Qq_hSvAeDNrvpQuaf=Iu8430M|cSV@!H{Y>Gz}fo;ag+1PbXYSjShj5x2%k2`dv zd(^(UPHVr8!+B+%nvXoHm3ea*$*%0L>tH0iv%$`c#0gpaIxy)bWrGbp5@$A|lKj4z z^w(vBoiT4$l<;+6o(P<6QNw4%8zSDC2;x+gO?Cv!@c0&3A2rvmKe9|EKC`?t;?){h zcREGp;?~y-CVacZ;eAy8TokQBZI*XRVNys|Ai0# z=GA|7^?zRdMya&@!%}biFJAr0tABV6r&`@Eii{dg&y{CY!C!oBV(i-)x3|0YZI1%n zyk;E1vfnuavhd?W8pmlYvzP0*c=8&x{Xwy`aWj!B^2Agep;8&Ap^BBWgRV+Xsg3L! z@mDg=d`4^v-?vOM>Xko<`V&DQ4p99jaaeRNdAOJ5{-=ok6Uh<`^-W7L)c8NsRp&DP zA|a#W^|`g;c9P>a7r&C)UsYS&jA0paD_-sKxg?^~#OUcCHL>;1u=i<%iT3txD$!6C zMZ%?qgW6i+5mK8*C09|JqQAv1h#J)baematwo@(d@t3>vUUd zMB9#A^Ej<#Yq%9_d|tcPw}t0?IkaVe=4{J$ip-xye8*$ zC^Pu1DZN?LtG6CTDXx#WSgyri6l_r$_r0R}{r+NcCl+~Loxix%(&zv6i{J6dZ~w$T zvOBx_N677I}YLFO+nBK}01r+llg5bsMW zT=59BRIr+Hzl+`Yezjk6O6Am}lWKpWkokSgkW|0t&EeC5#OfQE31$jkf~U_(9a>{X z$#Kk?aZ@Xy9eqD!H;=PY|KzR1RI{jR%J#VL-C9BKF*^mjIj_U>I*jM~Nm+-d((L+m zI2Y%*&1*K?Wm?w$c^#hD;gh%yvX&Ki)FXQ z19nqcZsJg;ocN|I=TFLR+FO^$Wwpm&#qkzp-Y@rp-JE^*)3Tmf=;!tPsMMlUvE%c4 z7O9$y+a=K{=l%J&cKwxDl>Vfi$`ZFls9dL(53ANj+Eem>$F(c@>JCs4Z)(iF=c9b8 zi!iJPbGVXEQ>6&wTznbf@!u+bkk557`Sf4XeI>$*=x@}oZQMSji?(vjR#nqIJ zdNS1donNh128LOy*7Cf_g%Ix^zsgUS@lscr7l2ysYCowX$W!1qvF`ky<2akD^>1%a zDzofTYQ)8>(42a|)7GS}Zk~+FZ+6L{$ox}jUCk2n)s@NiP_YCPl~a%tCG|$?&$nAM zjog>5@i@j9omcN>#>{#3ep*-W<7gK>d8_v@FZy`(CPL7@c3F7jy4`oU6W#Qkb@;3; z-SnpJnnN%8;~XRSq^!eZ=@a91_)=Fn{rR#Eoyeeu{dq;+OddO2k&h~_-qUK5Lp^{M)hj>Rv#Vy^ zw%lKN+EzK+P^_4pcW7@qgT;H*^7j){W0SExMQ_Qqrv*4c!uepSW$!0vDEj}@ zk$v%?>c!ea+aij-Tt@tvGV*sz<+{`<(fVEsn7$7S+tqV7ztgwAU&iI_a=)P+J)CRq zbx~&BtL1F5^m^}2ZJ+*i{bMz@F1}aVB#&@2XFt_*FG`fHm7FtGKJL^cy)wSX;k791 z31VaQ0ur589d&o@d!zj8OfciNI|6x%Iki%vQ-_`^t7m(q+ZW4sWfr~DePbJY##fE8 zXWv@3RMK9JWOvoIwM>nyZLKwY#uYPZQi=X_^2Jmm607Q*3u_00h#RFviZNz?P#{H; zx=&QeXh?K2==EIrmr_LYq!$^pC5q(!wQO@jVC|)C2vqxKNyW_LR#M8$n@6Cw4R!rv zb$s+VS5n%nq;wigQ!6w3TANRe(P}?Td%j@t2c1%I|6vZt(hA-6G}YAIA9@g;Y*brQ z9S+yQQep!RdFL6^4%vUsn0DPf?c&x8<2Hx&<$kAa^r_`wIvUS$1g{m{0=+Ialf zi_X@R+vA)}K4=ln-jx}|yUB~_%mW!{&y_2^!q@B?-{7^&a{uEqyHs`)uZ{%|z41#> z(Aljm+p;ph{(VRr`+KZ>ZzAuUZCUws=G$6kCks|>H@(@)hvkuV-XtC^a-fbD925`h z-Bf-P1K=8CCj(6uH3rU0%@ZxIV6Mj6xKhouP3`&?ZMJIOiCb{ys%O6(%|Fi}FHU?B z4>hm3*(cA@S$urTdV_soPHKfd(hFvVIcIJ*>38}zCL!-uUoUK*Nke<_3xk8^)$w>&Z{1)o}_hcwTwC58%5K8 zqs$b!=Bm@He|o%iy+(uos4yS6^i*LaAC>3%%tMv^5FP8Qor3}r3(K5~wdU2T)$*z43+^(QBv zi^{?x62Im1_D=gsa^^(Sh0%y|Qq`0`FWza*$*ydAO6A+--#5Fbs(n%U(Oczpb1=2L zqMM613tDWnQdzsj(uGu*|X&tcrnIfWseVE z!3a{%0C&MK`9|d68@rs7#m|AW@`2DJwM<66=sL<|E4r*5S*ODOQ@8pytwF+^+QswY zB=7X?kYT5uZ6X83)nUxMIT#Igqet|H=sMOu4o8c|*t~{gV|Jt0sAPtzhxQU$W8O}{X!WXxC6I=M!R=`?UPLc3_83TTaH_JFgw|=|)Tq|x* zHLFYzzn{TB66QZIy+yvU~jVJyWLGzket` z)-mX@r0rd7TT3u2E1fr{Wi15<)o1ysGFobps0D6^W9z{}qs0C*hOSVT#E99$ybD9! z`=`45x3FYv0ZuXhNy5jciaM}~c(Kr?7#XezjW@4eKhnd~vEQ z)?Vs4@RP(BH?eIyS9}y$_)h2F6O-|K3Ub{mD&t!nh8?0U{yU4b#g|Id@a^uq+AQ&l zTa-z?Vh_c{wO&o{=y{j^2?!TmX6TVZsL6KD3|IG*jIQ|MWu1FYHj6LR)kPQA18qi@N+r>=`o7N-K4psrO!U;n9cm-L`BD&Oxo z-m%a&QH`_f`7?Z}&4*YT8%6FwE(HPN&Jn>P*+nB4ozmSP%Sc`^ph?OfEmHm_~F}73kS7V#iQ>5L+ zY>EFEM{_1Y&P&L=gJ!$^>aa=$Tp3rYO4La_@>y@2W5JrUo*|7WBdZcp<EWzXcH4(T7-wyruex5#3Q_h-EL1(Um;q7F-bi?>Y5QVj$)u{ zwt{^QAClETb%UKyYI6-&JerHN$;#29HoI%J$m|gRQ)3{_jbV#uA9i9Egnc6%?epcy z!{tOTM!VK>JkNEwAWhY$=!BwV;rJMpYKx|Eh&{q$m92i5V&xiJ`ANdcT@g8(IJgg1 z9vX%7g$@(!d3AlR)BNUq&KRRv$9}N$k7sWxre@V8-;8!0dj`7{m4!8=S|tu(UMEwk zMu1btt@mh_%UI=pQ8=G3y_8ts+Dq2QF0XTsj9Ncrl!?;m-#-*N>nQX%(~eSX;S7ur zW9ToG8;=y50J9fgD30FM#sTK=u!uzD731|X(qa9^t0I>uaoC9mo{{tWr8k!&C&sLQ zTYAEi%Q1Il_8yL#OR5~$-Jr@iqC4@6pEl%tt9bbD7bWAtMz2&$elz!_x5Z_x_It}2 zHP5Jd9end~K+TVfh5YT#FY|g?S8AH^1b?Zso-b~_TvpmU#VZ^udg`_L@ajLlx_kBW zSAYEK{?+gN`v3Qz{o_9ht9D!Whn(DdxA?Vh7bbM)*4ImhN2>j^QG9b-BfVSv)wI?` z2L(-AHU4_f&ZcMEZy%L=%eIN%Xsi|VpUhJ%RZ%fI78G7L)a#b9-)%l2iX2-J7n;w` zq13SsC;(I8chubc^NLTB@gJhTJVN z5YH9W`>FEp%jGGb>R8{90oNH6?J)c7SVv{24tEZFN2~r{y;qy@wtYeDiTFTbH|xWp zZOz7)tEcbf;uuMs4SM?=P24LOZz7Ip2hm=|;1P;`DVhv^Wpxf$2c0c7N?CSh9-jx_kGW{RrQV0R&(liJPqrHWg%i!$ z`u;$=zl4Q^a$1Jq>Nz^Zox1; zu1cvj@wwu0%u4M0+)CqP5VgQlaXIR9x&emK$CE&P{hwJw(W22M+EgzaBm0_>FjI_= zoxt8;ZYK@1G^iK5>DZBc3*ojB+Y*9^;GNPCB?Mq^fbDx1ga2Zg~9lT2*{=ST3Y1v z_ZP~it6zeD$oOBB`&fOd6y}v=bl-doIE_yj{~fZJtnMk^JX3n}nbLcAyLe(d{PRyZ3 zd8<6DRr7v%%@eo%B;)F*YnWB?3dTyG9hLPnjEGxiAJ)DZqI!?p*byX#tvHjm4fk}s zDg21N2Wv1gJ0T2!>3)VKq9tN!Vp=fU{cw1%rlLbtF^_K{4kMz6ePneU!#DEO!zzCj zgN#LDEXO#$sWJNgmZexnB{O!Ne_0%6|WLWL_PYON+Osfo6+1% zThn@eWqT530t=0Oiodm6bp8J2tcS$nSbIZ+UT>Wq!t$SJ} z+!+VXI3U`}p1HZQvnRY>xWh$JWMWZWmY1Iu$VzFHW~_si2QQR}y{u0ObdbuICe z-Y%@_yB*t-gN9pqw!_&I#$r!05;bb#80;xlE&V&HlBXTACn|%u5c{fK8yAZDNzGzi zCF+X?W#^@x(&E|Bl-@*v*|(BI>i(xtr^241va{N1A1%Skxzlwj!|C6j=S;(K*&UPj z)e`L*hOtIxzy7fr?&f-O+vz&vYY)#otEcE-_f!07)hnHkj9bq|)?m;_Wv#QN*nsp5 zO7*wPPj}1zIgjWY#r6soOudi4c=g|2{qw6|E`R^`k~#K^S3fL&fBov8T>Y)9f3$ZN znHn9>l{xm+@(dTZepliC*7s}Ozch&7-QiMOiN90u%V`yK49Ys+>b6|k+vTd9kH!wQ z!pC^G%dfc2VuU%z_baj-XrS>$O%+y|-|&ovl-Pgz5&oX|Ph6hG0Rw3~iQ&T2#b!~N z{m;h1>%*^3fqOx`>E5sn_olgI#;jNRrtib5D3)VeaT)FnXXAR@6SYerRN=jqYo@R1 zcKmJZcFKNqd3d0*1iuJN%J{Ln>}XVccV>s{mOsYlZFQ|EB4fGzsg3Z;J+&_z4Io|BMHcdg0mloZuo382?gGPTVU*?N#|xpq+d)IN;xG$-@7~zH^vB~U)`h6=Fm}aPV=#%yt-#hH}_zA6KnG%VHz?rdSUP_#w zS4yT=@@yfMRm~0%N9?olWLWj{xV7s^c?Ee*pp1Dqep2|zqsY_c+2AL%@w@B~ErDk7 zMtib6eexpA8nei5nR-6$Cta^z-4y*F|D&&`{>YL#D09&ht%$OhOVk#<|D7^V*|5Ez zVVZ0EQt=01ePJ|heuvdzY9Ew4x}VW*Bi%EF`FY2hNPUzK%Kxq(GrWBwEyC-D41&^} z=X$@3^uV3pE#Ek_=JKST{H^jF!_x{}%jSNwv@3jd=yiO0<6W_VYQ|vc&z7tC)}1=w z+lRB$uDAV}mZ5XCCEGp>z6h4IKNzJR9wLRDjBp$)NZx=bHyF%r$7_7fdchy3$ zC5ZB7$@{l59~8T>)>NVpewtQ*8M-_-bh-ktF8eTl(&j42oE0sc{MPddXrJ{wUM+2F zXS1KDpE*1x;k?#Pr+v_TqYiCG6|CEBHs`=_$2sL%Bc4Y})mQg*0zOhdX(4%1wVu7)3dFk{B+Lb64Hiq8W&7iM; z%*Ols8V3Do$29f#6E7J1|2i-&7GHc==G4tlGuW3_|2U8NtY+BtSbBUEP)U5AO3}fC zK6`=2$Q!A;U*ZNtZnCH$EUhE4nfy7lQyKH9vWzO80l|A-xe#W!Egxc>h9wDXavo)-)2$y@=SMm9pzr}jg%mVfw9mx!6aa`mSc zdWc(omd_XM|ILD%cgp?wSn^%8%@4b8tQAewwtTt6S6SIKb^Oryq+=@AA-hHT)i4ihHFG)wbIheQ7oX2q+k+LV0LT*)#P z$thkYxfp!Uyd|t-W6Jj=ouZeT;zvmaffN#nbaz6@z%+5r3nW1#dF>7h#u(@qqmtCztzhC~ub2a|VDY?#a zh3nOlFZ;#v_l2%fulPn4pTE(e;=5hHZ`y3{Ps-M!mXce)uc+rmralB?rb&jZpl6IJv~xZ4`Khl zJ!{U>n>vNNJ-zj=nPu~NY9czvUS3!sDkd>ci5wf^rm+d`iJP)J$xTlDI}bfXgf$Q} zF)|Pm&blY`O2lYtJiz7g`iC%cbx`{jwNbMblax3wQT?8K8h02qk8KSt^@(Tn%(6ht zNHGP_5i%wY!R{c^5DL>*wK2Pm`?p#&jr2(^h1S(mA6(djnLWPuDbeycer{2p#>FhL z{x3&6F-|1gf>I58jDwjZp3~SwskU2N{obXB*q`*hPf)haC-{*WTURh`=J@CLEcdZ0r-_Lxn}YA$+Us#4u6J8dG{+4QPEB&TCerCMfRjjuY~!b-e(-MNopVPQkj zkkpJw{LzrL(`YbQyD)9QRXk31eO@V_VN=e_5tKTFtfcl|tjnWd1wU31r zRq8M_ttZO#mR4n0-WfBjM2;VhrkQnkJ%)wBnSWF({WWAKiDVwzUa75y`?90*RKrnZ zZP9lqk0LuLIB8dOA*zmy1Qv0!yD+TeeEFZPCi+7kB%5T+99p(l#nxf#e)31HV~1Ui zTG!%|c%i>oApV!n3_YaUl%B&@Sp_Oh`coAzPoM`dQawwrGPBustOB+Ji_P^@R@7Fm zdM1SvPy1tPi}jy)d~r4!$>BIlw+YVXj%{zi7(tWI@K(`Y-YZ&&`~!RV_^M;ztT8<% z&eAmGCb9hKQsY@{u8N!T9xpyCBpH|(sTr-B8_kN%6Xn4=mT8;VEOQs;(oRlS*)maA z{QQX~sC~3e`ET>qM}xGPcbiE2`4vc;2#bsfkIQ%*so*lZl0{-P=o3bdIthWIREqd8 zZmFm2L~wR+{0eqfm^Y6`W0k8S?XYzfY2o)Wq%}9;Vz6{DlqC!qcm}tKa>6@gnHS^m6U3%91yI3CZeBoYhjMTUGtL zW&LgQCG_t@_gGY8Zadr;xA|am&QN9}M%(tlwzM|6vqpetLj;yy9CBISoFGc-o3db1 zk%wv+6<8Ep&HrV8KwxZ^7AZg1c=8lQ&zy3%sdiZVFfCeF?+)7G(EP6E%(z7qZb~$U zj+x`KW)$tzZ|0wQWpCkI#bWgw#t>vpH9TyVKVd1Z)|xTa$+Qoq{I&WL#@Dmr`>Kom zTK({>cxveNT zydw6#ej4MT*7e`(n_HQ)^;>(?XyahZ?!Ere8e_oWG5TjY;-DFA?$ud~^EL-Iy7`IqyZg25sIsGx8%aHQsU+DZ}4iFzwwJjvwEvU%+|U{o@=)flPm#DXlM=W=0HOm!#7P? z(C~^wt&lnvJ!@EQgo#|q(pr7Rw)u%o3&Bz82Z_fvSAnBToG?n=M-Bm*EdI^J?aRnK7Js>g4dO z_`?qqACj@=pW>auHgQt^7%hq~koU!qitRCw(ix>W*(w-qI zYt1kRludSL;A6iiv&@sd-*KrAHs+Uo?ew)+t#)`o1(rkOiH9o)a;Ls=vNm9LP=TKb zBFp)J;MQ5*leZ^>%3Z~oiZ4wr?egf+wR*OwrphpfHZRoaJ)4^qbgRbobjfJm=2h?C zXUAp#8Kd_yc3HnMt7ASpuU)s~`p4>YmfSwRp_`x}9TOezmR)FDjL)&q(YY+5Q&K7V z^)AXLR@)G(67MsIme^7C7Y!}ACmS;>HyK;yiGbrJ7Yh|X`4BY|ql_8VY7Y1Ybi_Dh zL;8bnz)!qHOg;_;M{#6cc>RrqBt~%w<9)HS4Mf&D{rR%nOH;Y4etH^zV10^pS|~5>sinH zywCgYPnOwtxA2@7yE!=RU-Qf7|8UFBHLXe?>O1Foo;%vs;BOT!cBe3z*H1pPmQ_yQ zH}*(w>Oo`O^h$HjFYA*m@sgp(Wji0xx*jxm0H1Lxf1-8`(FYTQEh4z6=vW+&qra)@ zB5Y`so*_`jtBK)s1i|$<)`MfYzRfPkrJU{lc$yRMd!29gz&R&myRL_Gk@t^3h&$E2 z9FA400@My*(ZMN50vh(rP=T3+Y_}84jN(g@2bc*1zOb-BiE2RM=86#@jcQhY$ zA2-wJ`FEZH!2O-)c|fh--~GgM@V=}3>yh&JQ|0&TCm-nIz1Pbu_~!Eath}~goW0Ex z)UTBo2o}CpP?2iyTia3g6P-`)<&HlDbPh?pog-G$x3dXKh=VsDjf?Ybzoe;tbD9*v{eRSr0(LDsQQP$sE(^j9L)H2+{UnX!6a*8cMpN7J7^kae7Tl5Rt|q+ih=c zIo_c=7ds6y-gj5#ovFlC?O{$*x9N;#q>9NrsY(Y8Na)Hl&)e5@2pzKeFfTgR4u%?) zr#i%WrTpvD1+ngwE=6yj{K4|So`>m+@^*=F%$zB={MGVg(H|+l|CjThJ^!Dd{crx_ z>B)b2{!8aSU-~8fjq<$FFKo#>_vx5;z3545(QlUXb&vlh|=3_^>Zu`w&%orUS? zI%6&z1CfV)5{J6SIz-O+>zesQxwFr9^FZfJ=h*v1IP_Cx*T&-25t*;l>1Wx;%kiFh z4^R84_rPeoWx)w;E9F1D=`l-IY96G0FNDm_Ti^1a2`O_YspJN48t2R2W!um}oIyp@D zt9>m~^v%c{_qwi(Vs=%mN^U?@^?b*(@Q7&3pD91}bT-exgMeO%-v`H>-ph4I%&c2~ z#MU0E@+Z0e{@gEuMc*x}CW;l5H-@j3U$qzFocg+bpO8-!Waer!)2z>Ay4u*Rax%}z ztLJpqp^Q4kaRqz(y@z1Tsn@2zilO?sw4d@S@0M%B0c%V!%vDXV$g{p*Df_Ybq32Y` z%u~64mij1K2o9R+!^Eo}EU#upY}Q6@mHT$LRMuMS`OLg7>n!TN3~Bo@U$^V@GaIU@ z6MgFBTIsA1^|;@6ZkFrSjWhYOe3S2(R!E7D+}|Dnf;4waJh++~mzj~LN{;u> z<@=;{HLbL@W;Q=nvW1Z!>Co|m-Jhx48)77U!@D6LmXp=l^Cc@Y?;@+x^P`=u7`!jg=Bti=y8u$Z@UwsfOl-E~?l!7x-ww zjA2%;Rf#}Hr>LxdLeK4@Vc#kkcUu08hvM_)bGRnF+h5lZx$owTsF|8}CNS!-EV@{9 zns1kh5&Mhlp*^mPr|QHLcZ6<|_5*!>uvf|;*97mpr`x1IrTsy6#@#pu`VUo~rGC~v z)938^$iLpX{&hP{G?INYfo9&kH-eV^kuS~g`s7494P7NQqERY`S`B5|J}X~KwTa(= z4r8a$4NA7ar#X@B)Z!G_=2!eJsuI$3X&j{`=9<)9jgU&9)WaV_@T^nyo~GQ>TPl0jpEIILsj|Qwpkga_nF==dvngq^BBy z`HKrD-&~cEJiP%Q=8OnRLRmEg{!O2 zt#sIzNTo*Ly;=h^WazvnnK0^1vT)GCXz=uLQuw!TF@Ev9RA-iID4LIX(n6GRrtZN; zNjrV(K1^{EE>qFQxVl^eT*e?@EIWIjp|QI5bCGd49&-TRJ0 z7~FB#vthq%*oO*-d%3V;PkQsLw>LYy8fL@b@FV3eKQ?+-zgCRj@$0qVG5$&>tb1 z$S+h8M4`ZhAhl725Hec0E5_kp=?zcYO+GxDEzc&r;nai}j=v4R-K_)a_Svn9H@C_N ztarK9*X^F!clPDB*2X-yZTl-Oew_N5IL>AbRhVyVX0Hy*8CQ|>eni4eG4%F*MK>Yg z@SC>nEt(F(m_W_UUZLODclp|Tg?>wYzIpC$tq|$QQ8c!xTJ;J6=XRB1Q)-z7l$N5Gu)phhDm4U+!s+Un~s0!s+ zCFbR#9m=%GxljX!Y6Cq{-4gXs6)Jr})`LS#P9r~~R#20vj?@c!nb_QKzkEuC)Ank^ zuDw2^sjIiBk(05yJdC@J19$pz&Eeul>v$Yutf$VQ;^Fkye8c!@C-WZ6I#&0~npu)r z(RbJUs~)6du9tmyL>+^x^|C#WINXZ4_Zf>D#idf~8(LnM!|8O7m3{nfR~vt)c(Uz- z)80wRqE0ip(RrfUVS9D&dGJ)bx*qQrOx&ekQtdKlwChM7o<&@t;^#W9c~Q~TgM^Bk zTrP)0#ZBIpHX?G0U>EVY4cYh=B0g85CJxhHt{UFK zVaq9!p4eO>>4`1Zrc*+G!UN5@s=|+RjFQ8N5@l!`pUBeOPp@ZlYxnnP8^(3J>%H-G zse=w*f1xNnu(f(g`qzy>#%HW&ujZS4YpW}JJ!0nCyjP@E=f`1g7V!DG+vAbq|K*<6 z14)+)&n;G)M42-RoR)fQ(1ra^J(E|{O-L;i&!65{=jGp+`B=5#{+RRk^;gt(LAS1m zdZ2ff8Y|~Ez9L?Fenmbc6;$yvr8AO>C(da{Fay&ARc#iZbX-gv;Ht0qpH!Ysuc)u& z-p~6o=ZBp70Pme&x>x7po7O8yw>iDuzN=H8Zun@`qWk%CY>;?b`?HXkbYOr1kT#XcH@X_+;>-yzQ!;XqeO zf$OY}l}=KQr6xoN5O+K~n;eF2R7RN#8d~!8skMMG_EGz!JrYhEN4T~PlCEA?P*gW4 z?u=+xLyT%&ml;TlHD@6F_`2-%>XppExW#2&vP-CQ@>%oDP7OO%k;uEa8fTGSd2xio zvG#S%cbgEa%-xN3pPH+bo}%l+WmY^~M)Ow5r0I<`J;T-7zO18kXTVK{<8-ea2A35{ zmOV?fs+i;2y>)!-VsYdHW#@aV^j3{a__WM(3^uhDA1E$wuVn?@k7#nJtGmLKdy6Sc z0{;lzHu%8!|Glr=T@IW(CV4C`krwt-S_)+rrT#*YG*45 zHDo&5vB7mcEpZV&zf=a-n0Lqp^@vcL>F-pn>Z5}>h+Z&3)y6(6&d&ZHCW3E>#qk!^ zbawi5g*<#r-RCdH9p%jiSJ$)TpY}XcV7gG=CnPXK>=zE8Z zsa-Ya?oui6a1|~2R9`hG=1vz;eTK!y7!t3GdyhMbH}R>ArqK~$>j%$ljn6SaqRH|r4d;o?nrvivq5RQ~D*e5=e1QP1x!=kBb}%Khm3Gw9xP zy}V=YlaBIiIgU?_qim=?7iAC8vZdDrD`6T`n8ugsR16_h1=`uT0maP5fb!_G#>h|A z&iWQrhw8!|)%)OU_Qll|UNONc7@lb>5{7(1X6T+A`EWkzlVC2Ty8_W7@rKmXSG>B;|e{#Uo`z&?HQ&*NnTagdwk`_9U@wo&!*a(*wC znUu4w-D|wRjj5k3SE0wSrxtnI#mj|BzxCenVe?xvpPT=lF%oZLvdL|ZeM9sfyeAz4 zSA9d<^om@^WUUAan5=?X@9qrOQFue1*g~JgAau~S(wz}B#vds1y0lO*A$7XA`x{b( z8R52P-Q7QystK3nqK5c4@9M2g^+uUTazo+-`;K$$u~La}I&BMDNB{}baP*9J@8UpK1XLRhQ?r)yDi;a4}Ib+X-=(rS~=qXuK zJW9rAc&3%b^?GVpq8tcxpYlzLqx)`zndD>{1pCe4$1ZC zeq;Q`=Xn`az4yyHvI^kMDv#KA9Zgpo{4nFUUr)n64E1>SfOS#fHd!6mgq7+UH^yKXWzSQyBJRKy!yn-s42HQ?+pz$YoR$LqLQx1_D0}&8MKAx3C}(>8mmz|w_q(mpUajnh zitc)~vaeS5bY)jp=f$q;rP}PBu7dsZ1(lvC(UC4nu=Uh1m1^{SPvl$2Y{YP574_oBYRql+cbQ{l-&KC$ZgU=jb=fBOd3;ta zhEj11cbk4rbE#T8?S6X`pC5_HAi z;{@OgfSmE@p7TsWBfKP;1G(MTJC-|){OzV3WA%w9R0mF`)RRo}>Rd~*xZF)~ zfbyotqepeY74v)<*<9?B|BzDV-L!0e8kz>BBRlmr7?_>&W_LdyE&FDk;!_<5^$6~^ zU7s7SW&?wRu4Ee=toN>e!i@Vf<&gdBuq%7T7zbCg8N>YgP#wEj?v4tikCt5iC(Czb z)aJaR$@Gtzr0g`+s5*C@^H5b14H(t*QBUTl_e|N9Waa5>MpX0qslNGg1mQ2wDj!- zH;woDRUWr|GXK`$Va#Xq%*&zfrY(GuP1R)L@FgO*Pg?!Vd9akGmX-z?D^W)x1;@^joS z?|ZI9E6JdE-xvwkWhxR2PEjzceW=1O!@_pfR{SR$Ay*-Wbhg8o1wXe2`Oo~~Bi3`9 zlFoe_SAZOP+{N+mic`ER@uv5R3pl$Szs89W{`L3t`1&(7Uw*!{FGYI5i87t#GAx`^ z+bUM}ufy9zWGXV>mh#VwAFCmcva4K9wQb)_MONIQx;!jnkDu#ix>YgFEXXCuD|mGm zbhGoO&Sjm-_DuO^PmO-4VBnqd=d%S<3#80|LY7}|)(tC^Y#tBxnA#+2LP z-ntxvJONFDdxs+94i8a}qYPeATl|ZnlfF?hvM_)bE9j;=j7#^tdq3YU1%uY6vzeSk zy}rZOt;DsPEDUU|cW500oaPYD%GLMU+VpkzKN{p%TU-53-&$)|hT7V29y-=CRqf)( z>i$5z)f~g+z_49Vs_wEk3-WB{VAl#(OL)7bS^D&r% zNx={3NQ8L8f}=ye>zcsyjNm_w9yF^_ZD`OR?$VN9+E;rge;Ls?#46$?QqnRJqo9 zFkF>*%%=JuwIJ!9nVgN8I9#t7fQ*A^DAkny%_GdGu0}-0$m-OcfWJDGL?SFzByd1x zPj&^HbNp@A>#}ZKiJnp+eE+Q0b+tb&r`N@g)zxYh$5TsQ{1P`6A5B+enCsHm3390B zvnuxE9?xvSJsv6FM*BG}E7%jh-+FH~wltvjd&iN{I^I#W65sjKdoDUVHr_!i?b-hB z2-hp(TwKrwCh?lOqeC2%uZ^aIWxz1?`l21Y0#;!fiItok4kNY_LFKt$c@6H>3X*Mb zY&RXqQ`X~a*d`*X*w1^n&av9Rj`@Xgk6FhsPTj__YThkn9qE}Ovu*^Y9MN8*Cec`O zipZ;fq`c4EasSm;8D-;=PA9tf@q*aH(g`Q|d-Kil$2ivV8PvOYvv?vuhV@%f3>UAb4%SKO8B9h6yWHp&LIu4v9* z(5}c?$8o0qSjcvKER>mZ@7h|@&lfG}r*~G9u9y3mzC+Oh+K$xg1@9C4ztWvaJ37;` zFTG#l?OLBz93OLxqMP)kHj>8sPc0tT@NI{u>-8nI;ASjtSGx}P{(q>*-($|>e*R?* zhVN0E(gTJ1Bw7>GC8CR-q#ikF>oXaTW1wjixa#fbcbr4(OVxumM$_RgH;<;nnYkQI z?P?c0R%7hBoT~b2RCX`j{GThTVtiJxZ6BVef_1aT1W!}|ys%aSUxr~am2Y(#1>Pvj z^=5~UV=PC!OAE|6-I|Qpc_AusMWrQ>$89sWrdp~4^vW4=7;SDO2xccCg454_n z_J+ba^vR6kZne?&(-qU%<14xgZ5P=tWrV5JmOTx#sP||chSfWByEu2(Gs6115ol}V z%NSv1=u$?A)5%X5lX@?QW94V^66&of4wx1NQ659ZnOb@yXzV;=0LRC+urBP;XK|`{ zIOR*m7`BcP_Se*Agl*@CjIu~1b=cD1v#}U#a$1kDf?I zd}7XWOjA}`*EG)w+bnYGIGwMVx>!!QKW=V%O6I-9&265mImZKsEMpmR%53rWkNsu( zm+4uNJ~R2=;d+Ftc%PM*XV8dn(!(M>XVQhu>Vurtx0p^Z8f(=$_B$Pix5v(9SI z=GlgwSnTD*&N>P`&Ma}5Q3|OU^1Yb&*=V1`w2h^EUu!7nu|ZJUF5Om)X*}VKNL0ir z8Wl~O2l2_k*f!3LJ3QANsK2HM2|L?pJH^gu=NIoUd$TY=jPva>7u3Rkwy?KX%D?Xv zMtEBG3jcqtXqujb^eyFGFO`4IN8UeD;_fe=|N7_u+>JZuKXLv`rAqXR=RbD-H_!jt z`HyZLkH1;I<@pi!{ZOZ?K2-FUu;X{SxjXH5>X|$GQ$AeI^`SBw?VREB?HK+>Io{_s zu;119j9Kiah`c%?#@c58JkM1}>vpKTE+Xep!(q%QI6GeD)-a64C9HR<8Gi?@$?DbP zMK70NFKtP#20Fuxvx8^zAbK^2^Z69q3&j!=Fy0 z@YN0p^O1OFTE59_gTuMg{WDV9Y)^#Yw|yokxf*S_%aB;-Ue&!(`s}0hWOv*cxH6S) z$)0%)C&qnggWi>%{7}Bd_NFM@-#OOCF&jX#2RP z-wWo}Vbq|<$|z%5G@&q!WjpF{mS3&N3dino1cQMHmB|5=5rg^~H`$pH(^h&K=5xjpNjp%x(ggj9=X6gm8;u7i^&KAfIB)?IjL)N#4CjZ$k3iG@hN2#A3M<7p>c+Ax&Cffd~ zUqiKayQrf^>Q#jp*LTw;@jCoX&fb*{wIKaYzvb^9+$Z| zucFUA>+7ONYP|nnL?&=fWjRDogk^~487X`KuDlg2vDdmTThDYzsowD6a%Oi5ra(?-(nhSOI>ZXT zzEp5XzR$bI7`3ZPl2u3vNE}~P+3oOZU7UrlaEa4H)7N;6RpQP($0gn(E-?BW#FA%8 zd@9=ZGr12QX&wksYdmJ+cdnf6-K(DCN{+Qpb ze&;+|^>fm(=IUbFXm#;pb$GO@{ag0$#H3?}A2^Gu%A+*0PF+IsX=Cx?NPKZ&`ykPjtS5 zaH^NO^UL$J&dOPjF=zN)XhRWq?Eyyxc#6xHJ0x$NE63=)LUrgZfwJgmSRn^V{wrUyM(R7ntEq0-d~Uz zH;*;#cr$J@swG}JRnP4T(B5d!U+Ek?2f97wcb1)wVfTx zlct7sh4n7>*R&)@#(_c^=KZ3JnjgdYhfQO=W>DVa9C;F4pU+TbJQ}gLEc}_96mkNV>u46%G8MJR~!LeFU(Q@p-8tIK z?!cRjNI&bMO7ID#cXx z_N!GXHai5f8Lza9&{Ef}Wlodn?zfD=M>)c)JMZ&&xGES32Jt@2UV-Tp0HAPY#%_g}vO}-zu)*LtJOH5jnHV@BqK{tpj^ zE{$dSXm!twE2-?B@z>jRrdcBDC_R*hN=fDT#%$=Ga?p0Ec)sbQ_9Oq#llkmaaqG)P z+q<^UNH43Ts?Hg{eS6X|`A}OQT}A3SK2%4cN0=p*R2=M;i|Sf!9u4`Bno`xmcmTCn z?!>=&`OP44pb<2ho&$m*$feM@JxeA}7seyFpXOZeQxAVM-~O83pM1!ym$AC&T)U{S zIu|$j79YK5zQs*XO1LQB;-+ULSjRm>iy~k>3_W>=LSDzczkQ2%g54>8pryFm`x4#r zX&l5iQ=D{%LYXeZS22^)g3?zMPf^ zhzok#-gBSq{7Emq$KgCfFY|ZZlUr_;yj2?ntL4otHRM!aQq4 z40jLv(a^ZxjTFX+CmOABK44vklKzU?+^}^; zVh1zByz=ky6=A^6C^cW^6{VJP<`;JnkB`WMt15md86nJ`pl= z&yRnrdtY09o4#+%toEx0iT`*Q;cUmT)>VVpp)jlTD2g&S+_UXta#waJ5h!LQKV#3+ z*8tbjOUyg$)bu%Q%$`lR{fUxXi~4 z3)|^YeU4oX=i54V)plrK{8)|o)&72qn&TUz(eixVGJN^Yf-O|Thf8M9Q@KwIr&i}> zRp%Ka`^0yTbWf`o#!apGZt7ZYOxQ{H*!CUOhUFmx0oYy;o*$1r6~7 z2j-L)8*t9c8pki6$^lq{H^T{PFO0!#F;w>E z6{O0PGu!54vo?Cjj3hfE>T30?kw@nT;7LerAf4XG;Fuy7?=TADFc}!}xtxkULFJz# zXFrhF9izuOcGh20J34D$lekvYC!@F}yNT0u z&a|VrYCl)qVm8iQ(=eou|!k;<+ zhv)xE>00=Aw|*AoKHUnhmu?Yxz8A!;s%1O+8b2AJ&6&pU8Z)L{Bd>J$sXg+0j=z88 zl}tKqyS;bW&uH4on5T-7KFX2BU1wLauZiC5R({F2TeEg88mVXnn-Z7V8@FLjOA&V1 zXK5IlS`m)LQD-I&S5d}auO-i9zVV*E%{P(SvZ2m}1B&bN+f|HXFSV*Yt`B3c)hT zb;?>+mEu$f$D!`74LQznBe{88+b4dr&K@eGD6VpE+eoAb>uY61YQ(r35?w25l1{RB zyQ95Q{>(RyL|~rTcpCQ@27y3AM6(8zfrhzq00NDyh|ncl9o~Slsaa}1 zx-yYlo^Fs%zwQ9FL6qCB)t^RY$(~L7CS{iyR_#2Pn7HYA0EfZEZ94nU<6*z*hq<-g zuyO27y{y={q_bN^#?fX1PUt#1GMqXiLs=jFux(V}{%9*Mb#LrvLAxR}hBAQK(`@^uu zUH$ZVre5O3E9O`u@?j+?hpfFLe_k=itC;$5G4=hy9B+2sFJ17GJy}&5KT*)|wXJaR zcIh}P;}M_lLq+kvxrRG(fDE6V+*TUL?;7Vk*11I5(KMC0XFkg!=(c}X-iwM(g>Ln_ zpcGQ5^dpEnAy0Fp0?``dTAqZ%O ze?C;s)7Ym5(%#uSd55p?B|TbtR-cw@_pY(7C>zp`(7ab9_oL1>nIS5GqkDGy&2m*t)h4zISbHwXy9UamMb7tcX8zNBSo?al&wb@Vn3@Wp-4xQd7<7`1zxjVv6bT zZ_kt`@;`1!&+YLo<2*@KP^az@*XN$4W@DIJng2}fF1CF~qWN#Rhz!n0JCE<`bCOrF zbs67$wv5c?3M-w9#L{Z~JxwE3Q`@2I`sdewv>Z#XX?>>S6aIYpKSVaG_D5!QO?D5n zs79uTz-P5ODr&gwta4{NT;Vc_^2k=Mt~Oj!W{wO3r?2yZ+|>K{t8{yY*0Kr75y>pc zIV|z-EzLq>@y-%H54pS*Gna*~S)IPukgM-;dHTBVNG5%Z%foS*N9B6N%+_`J9#`>d zHyV8w*nSA9V61&}JXUfdaz1f%Lp2#;CG^le{c{A!$Ka!^ilF&_zQ*Qt7WrYk-03x$eCz9+ilOwPt8uR z&+RZ%46Z)q`?(j{|Y>_Bs9;?t|2|bH|8$ zMYY&e+c(f6#Q9w?=LRk|h4@qw~W@o>y3UTGSgV%WAL8et&qdB2N+iGy=aoSo(aY zrk$22mw8s&izj-9KU1_W8kh)%&Z+R~_PMf!j zD)~n7X6utF4|+T`4+D!Pd{{M)$GSRxr!}7VDGx1eS+7hgiHc9k5HBqa8>5kBp)lb) z6n^RoS1mS+O{rOtwKywxsOF7%1P;|NDOG#vq`BH%Z5w{tezs$c(EDdULhNLW_EYmR zBj?pTcWdh3md(1@u^MB^;i~z!=Y5B)hf6kOw~pP`H!od%ih zs7+$86pr*VCkpJ`hNj znr?A6!Yz3^I#%j`Aae3|RCay~JG=9ep|{$oAFxWkTsA3M6%7oNpviB?0+y*%c^-Ym zt<~;@hh_o$o18$|N>f+U(dx=_`>IE(awGLHJ5XA#x92&i- z;`{>12uJf6vMyXR&x6)&hTlb8BDX7|!Lh_KJPYwGVP|Sqxp$)ZMqL-vQ00$>Uf9-!G<_t}O%XcLTDV!#ZBfsOj}>gvn^IipHH4WpWR9yA zz70pZH&3r#ALBvysc-Y*N9*u-Q~l*w`Swos`l;<*>GS%qIkDP>$a$O=71xZkR}HUv zxsPBUHM#fbUi?_!pDQy@w7|y_fsHdTt7wq1zgs%lwKKrk59YO(t97~Bf9-x+mrHf& zW3i1*&u2U|+t~GKjogXW)v?rN6$Uhx^pKkBGpa~Z9YssVE}|RLY-q_|RUbuB=DYKo z-i)v4XPD3XTfImyejDzwo4QPi=TkmB_c#o~RefeRguD2$8t%bRd;c7B#j0a7k2y{H z*t}yozCB!Gl{Y%>vri25aLKQ3j-i%3lkAw!7lUSY@qV2iB95~1<9d;ipZaAe$o$)S zu!@h=7O8d(PT{IzD_syB374VdP^7sAs5$X`tE@U^57tz_rN7tG8W~-#zrMuNPnT}2 zXN6x)>)(d&s0!M&GI`Zmu!*r{_AO;>Mv1Fiq)H`ozC)!gwQ+j?@ojS~@g#GCQ~v31 z_8OlR`O0Hb-|_@n`Al96$4v#C%QRtaLyOyb)mo@@)X6|O4tK7@sSkXT@ z0^MufNceat%|<8LGm3Sd;o@KRG2KKwfr?h0u~Mt1YvY_EIM?T^zorL4<*cZp6b^==?wLo{j#M?|R2B*&($-o`?#sdt?maP8qH~-D3Qb0hcX^n^%3P{ErN`s%fv$?P=~h1@ZEF zuRKzGcbvV}pu4;cQZB3dlp9DyXe@_!XkA>`Kk@v@W=3fGy67De9W#TXO|ig>@iQa))~n6z}J?B zIqgq7y{08dX%@*v$~LC1di9!Qw^R^wY}%1kQK@4w$~+XZNam;O#3%gHtx6`$-^o#` zh_Q#v^(~sq?X-IQTs-#ef^4<^AF>@b@4X)3mUrRq(QPTN)oX0KhRqFZ4L+q~)#}VL zU(yj-w%Q7SUozbO#Pnp#p_gv4@dnE^s%cMWES?@*M8*5|l~v1-4a7X%W%IlD= z-kD{+UgK^WbHMG8t$t(X+frnMs#dR@ue*LWLN*9y-NQ6^0UyH)Ay}Swp8lWKyw~tV zui@%>wrpkjkZ?O>n_km{jcjJr3nkC}Lb?0HSo*SLskZ52!2`z8fSc5(Zw~iJ5urWD zuBb=9$j&eOhM&gOlK##5SeQ)^079g{xqZi+i(AG_Jv^VWhlgwM0ojR{M1J>b)z5da zX!99t1pk1i7^8bR9jiohdG@F3Fi|&b#%)xWVViJTT^SFhYBGPT;ulZql@XS3wdz}Z z=4#a+Z`Ci;z_aF~iLLIsn{!)P^Xq(V!*_&HSZ{~e?XT9oik$l`j=6|+zpv`Ef8?|2 zDd(%vOj`|Kea~3a+4l+O!O^g)m_J(yl@o}GJhzxGTv9YDX|^h@a(5F8*z+Y zcoZBFH9uwIYx}636-yF_&}pdz>FVrrj=v2DT2`}Q--lD_+kAOBP#uNcA|KClz-BN_ z%FB4HjE3i2aKhrDR2n0jnt3B+_wqCKCeiR{Ln2af4?nj%iR+49x8p$5Yg!Wd(4TN= z&Rw%;d`)=NxjaT__xxk?9_MJ@Yta=bvwwz3Ay=qK$wX&~R4*l_>Sl>_ z%PPPU_lfszb}MO^e|oz(f<3R6rl=p3&KcXV99`XCFP}Z!(+tCKhP8^zxJ^65rEX7b z#s?$M=?)I{Q!E+}r-`R`pbV?nF8#LrDT+(Z1(Qy_I>l7XLFJB zW6I8m(Z%kfCRuKGak{5ZbNBTw_Sdu|&ht$=waLF%U&L_!;dAtO+P>&C+0t~hcD~M5 z%$w*}U8;yqpGrAE>V&(%yAbDH`oWcHKMGavZ_s1;NdNS9ehjqpC%CT=GAq@ZK!B>4(x5@%cL zUN4<|rnqhE(?GWANGRtor`6vfoOx4y%f(?~9f2M zw{d60XJHH}Sv(hB5AwiH`Vh6u&+T4D*ZX)TuCUPl-?|UeZ2#fnyyZwpb^2V_oAAwU zb*=KjPn1=J&w1L;ox*hV^0Wp$-TJN0A^LjhnT6$=r2?OF7hAMus6J)U^z zYvnf|@FQI>M3qlDi?$ZF?i1r2!H|`{R?hUDa_)D_(Vc6>5!a9>J@HaH{7k$V*#^>S2J!17>JF~jv-|H5snc*s3S$^wR2l-ym~(2_{U<4zE#w` zZ3W=Nh4(*Me&6io1(x+xH#4Zuzqec!-P!r}-9YqPyk5Rz?vppmRXM*CX z`h09pVEOL%#+hqz{2bZz)inlkF4M{d7{_%hvqRN)4Et4_Y&ua<|1mP^KNpO=LOfFN z@DG&#;gEikrzOl`|+9KZHQd0cpBC`+ugmha{t;$dA+=znY;uS z^CXYTmV%VQ#j#R$2z0cHtQp*)l`}QdQ$J!RLmn8Eeo2X3l1b$*!z|5Mh-m#;r)IIZ zEX?KDJ!Zwyu)5ztw&9Pr%Nee7ko2z`f$XMZ>|56P;AUCzjpJV{YF&??yLz>*MFN=Z5Dky*gur&5DvT!8%B?EEpFIDY=f8OV z>*scXUHA^<)f@8W$)~!VWG+6$xLzon>vP?^+Dzx+j+gcC8uOjq>i@)JHAlD_^K8d_ z*46*fjIne3pa{`j9PT_~rTD{m#ISVFeT4HAGY)ytMe1T`Vl-ayg=6t6iD6QUkv-e- z4<8j)uUI-h**~|*qSpGpx!(HI*Q*MjquIY02 zx4m4kSeldi^%d*PwRKpReBf9IyZEs>Jk}+8YSr8yA6ur)m1SQOGsyrp^rK z+VUMa^%tT&TK3d!mW&Pk)LC+*(OBj9Wph&JQET*#Tl^N{MNSKvE>}gO#Pjm{s?L!8 zZ|Y#0UQ=6jovT2mBYS=UXUJ4Z&eL4%;OcDBeZZ6D{Ew2)NoStXSSkOiaAeh@{YP_^ z)zXQ;eQ96QyzV;Io-YzPKinbbM@!W5cF9-1S)zqRE}m_O=WTA1?W(vr8Gf$oW*ACM&fv^ZjENx(g?gJg>Z|J22E~_+(@d8TX33AxxAtx5v@cxGmGg$ZXK*&Yq@baLnCW`KgMO{WZ0bvK@~( zUuR+N$v&AM!};fRzJ$0yWZ3M^{2+b`8Ql*vF_nw%0IcLNmX#Bkd)@5yj`lUpBjvaX z@FJ1&BOOxSDlYR^PQIgX$+yeB3A2>Fex>{`$a%Z`k5B2K;fpf?iJi7{OIrqx}Va0`{c1^hQH^U^>wHRpQlRq zP?KBrHnr3rb8Q`h${Boc;)1&Pu^J=j{z`Yvo!<*&da2;dX&Gru?d8sEXe4)0jH?^y zgPn@E$qjV9eAnl?ESc|{%aOfO&dU3qJNbP1El1|v{7iStdAC2cdgO6lZFpYW`zy`M z-Rq6pegpd+wq;+dC@|b7?ZRRqf5zp^bCi4urV9S_n%cTl`jBMz9ES0+P6WYGNPX@|Kf#uyW~ALXFh*( z$$b8;m%jb{JI=rV{O|wZZ-4m^dCzaS#CgxKPONH|oWwehoyd&li%*KV;r@`z*zxIj zDt+P_5e3@eMM2moHe|m|2P>S#eoqC&0dO7v69w`uIQ}-gb7_~bck zYWA-p)$wNkMLRcN>{Jf(^Dos&;*?etS`|)b^>pUXWXh+5Eqh)@r>o&6b zp80)w^}FpE)hRISVANKRFMd1@k2vPQca>jZdE2Tk^;49d)@P=^fjQkJcl^0BOHNBR zKYe=4p6~4bO_3j7^KxJ2wk)8|t*VlZ^;fzDCm$8dnsScAwWn4=PD4JU&x4pDls<}6 zssy47%6<5mW6`_hKJ3iV$FfInxArbhW0s2ho0RXXmTYzi~AO|5S;Xo+)dRPe*UZ=R5YWZ6C8Y z%O3Uoi1&P`?7J_Pz5bbUB+kNjx-~!T7Fp+iysASlVT<`ZdGhi1a#`&>l}yyzw6prD@KR3#-@+q?Sed71 zCIf|U$SauXbOKo`KS>`}K1DzCf1V_`DZ8(JRnElcw&y8JH3RXI+>AfB%~d(mhf4yw&-)^l5tO{hhvZ>gdiU`x;IuJB1O- zA=;zTnGVmChf;r%o|3ggyv&tfc76O(M*}+1wsm>aYij4J+RjY+6J06U&^RWB^DjAk z+52xS?@8v(S;oyqxssJjZBu$k%1)(!irMKk>K4Vz=TN8rS;-D*h^6)t)YWlt0n!N^S4Y zcE0S}5tkXz96auTq~Ie>F#B z<|O{ak;b9z81bcuWjQlwS@tttmH32?Rek38^$u;%sLX^LZhYGX$)^Ze`;rKa! zUpari(b`Y8XIDD7Un})$PnXY{;apWumVbR~IYwgpF(zXw{g}G#L&kq&D;aqgAIlOHvhI%95Zn{`h55jP)?5pu8276$TeHhO2IONfj_YkZj9N%qd)kfnoO^+boB8X!)(7)8SL$p+vBO~BP;nf4)!VoS zZ>$opF5{?GmuYJQ)IMDef>%@Cl1?QwFa97k%4QnAYM(Zb{Eyz0=Qkxo;{A4DtH=sU zHITVzR#$vG9OlI*VFlyy!!8o*w1IkO<}h#idQ}yt>cDoGSC5#vxD@lSB)?LjGv!*T z;j!A?1GpCVxBD;3$e(ZzE3+4=Fo%pr#&0~!Z?Vu)-LJo`psz0Je;)!P?%nMqZ zab}QAxD{aL#ib@Yo|&gAiC@i(6M4C&FjG6OUsz-t#pfLA_eYI&i$CsSqgL%~2j2kg0ShD_^w<}fpkg}6V4D|A`Lq~SKg`IU2dYoy; z=WV{|&fBfrRXlt=R>l#gxYt}Z@X?-!jir+nWR&lMQ;ucd%rWsT+K5ONr^LtFNHdPl zr`NPScJkyxJzfQx!}yA#H|Vql39}#DzbQ(h9Gs9s6Kw$}wrgOG(W~4o%7a~e7rqGF zTX$iqtj1^Jp0B?D;ut0lhS{Zqj;9UY?e6Dh9NkAR?b(2=<&YD$ve1ury6^3BZhF0) zmYMinU0lUC$M^Jlmti*x+8kAHpcgv~y;F|hTKCOR$LluDPzP^^NU{uX+e}qFhD*}S zAg?PO#z)owW@H`4*PhtW&&1@^Hb`yFis9j``d~-2f>QC8_xLk+GCsJ&Gu3$8FMo#m zX1P;!ZZ3<^qf)~T40AeO!BuRH5^mhYA}Yxt7Ck(QBJ2`hBwDAA8XZTM)1{@_SC_NZ z;dQl9x4o0dh}*YCL$1s`8O}rKZ-zly@qAolW~cKN*{72nKEQ2Z4*I4<{XA)K9oNMf zL}WuXvMLWP&U!C1)w^k)FBeRbWqh-{i<{AQKDz%zxqo$@8j&_@{X}7rVUwpt>m7b~ z8#AwWsOo*`AT-u6hnPK%<12!U{X4a{_F?0AaUo8klVL@#;jH9@z-dHIHQ(gl(Y{i{ zi|3e?^nAVwd=wipJ2U5f3)Ky_A3u&C=Hs^EqI0?Zy3h8n&&TnrRh+)HrCrt|X4Wl_ z;~@dWi}TyP9FCQaOo?-`N@x&#&+A?6S#OP5Ctj2?0goVWz$A04p&~xM(Jtb@l*JQLxdBbWM(twl%A>zQH;1I z3gmFLMOTkjlpHnQXlK?D&AhFizhrg7IC#nAqM)N$FOMl}8JGDsQToNXzvqO* zcgFtpeQ~jl!EU$+vFuS8P}~@+xJWmNkCDm;1u^@I5$WKYYAdbf{SJgg~*wxdOsUsy<8zT8-W8WK`tsrKQtQ8hSR6InFBIsx*l-U@vlVve=oyGSHIxf{P6Hohd zdv9oEJU#wdoxLAv`uY_O=Qk*j=cBNIj?nf6*tQnK2&xt zdvJzWTiH^)ECj*KXiQ*l98y33ETNF2_2+kea)?36= ziETXHjla)@h4)DNWal}0teiLH%oyYfrhd;=O<)+GZ&Uk=Gs<{i_R~m!;+PDH(We(D zes)gov#cC#8LxB=V%GS&()~Y0%_hNi?h*u5e=Iylmv0N z{9rQwqLi>ktWYGa$BS6S9OQr!u{gSG@Fx|beXi4Z`U9PU_RZbsf2h>+y<8CNn@69% zx0ttzWuGW`D03|1p#o8Do_je}5F>ZNAe-Ac#2E1CSn+lA1adw%^WlP;Z88gJgpsqlG~0RM2ix)EQyYn;u1BV zP6<1PnWuHS;q7w%H_E8{^PzG@P$%kC#=XYL!&hVoA1!sOy2N|e7@=~Fb)TPiq|+3# z51MQEy>*$p|4MmI^h@v6)nl_$r=T<9?n$58eCo4h*ZlhKQ;Ce-^YoCANr;YNZ%B5* zC{ozOrO+$!9qcg5RAic>n04;SOyfAYbwwX6cgQ+g!U!pUkclb?dB<1hn&qthmSchF z=|xGqw)d$(rLM}v2Mzrn%27@I8)iaHvvgbJbA2#A-MU)HK1EC4s#62Sv-Lf#T=?9# zEJsyyf66kg?{~^?eLg-zQWqe4!4T}V^1js*cZ`@3Hxt=~=k)hz9XG2Zeyc={t$LK{>%JolYK*wU zoYFiat4GWno6qTTYJ6nE$u54Z#th{1Mf2fQIPLT#j-|xV!&tL&NwsEgbqqjFm-o6y zn~ykUs5#>JllynmsZ}T2y9lk7a zidiy_e6I94-WX94l=S{w+i_fgiC0(mjcqXT(UVWE#l-&gc}!fbk@2nTd@h+~OEJ-U z6rG9B=#}o}>R5@;QjI3EGGhLhQL;PHr)Y6;11A3|rsWdkp0nGzi{jexs!#MY%~!0h z9M{y2PTM$d$K(<)$3&OoYf5)Gx|_(Idh6e?$v$iDnptwuB1v~A(Q2xq&E6=9=C0^* z9V!ozU4$8(U^{H*A)dyoLEUzp%rsWL_lR37LRxu_Uo82J|Kj|Iw#;u#5%zXruh`~e z<<1)AIUP{d?mLBX@>74d{7qwgbuIh6QC{^<-P7d^UMo>Lew=Sv*D>|s?tPpiYR0{P z%wBiRd{h-m{rhqryDsw)J;|RuV!4+?6rdx<)kTqs+W~|1UT#?mH6_aokG?~7r>|4u zqg~N;qW(m|JO+z(hr(jF&oK8@)AcFKXWdMy%Hs5O-;sN?8;c#zTE|-E*}nL(Iv#Ue zMb2Y$z~o(P4~IWk?mI2o8s|u`$Ixfv@k`#oOxPzDzFAnn=2-Ztf)z5tZ+1$cj=sLP z%>mo*9V5(;YmPn7QER7MFuMGZbKo1Y)b=2{K`Q*-{F3+2?wzwt?uNebPWKtn%4f=* z)oF3)F?3zS{sQ97XUZL~PXeRZJ2PDxlOONrp4qYfd=8P*i@^H02!9I}1Y5$w!nUTPa5TsvmH+Eo(j%A(Uc6IIycZFncC=&7f+6Sykzw86idQ&xL-;kTP4~RQcM}}cj ze)}kVn_Xcy2WA{ps|Y>cb*N%=kNPmF_XSN~-*;E2qtGMhl3ZG{;!uxID|31{R(62+ z%k9C`NJyDFMtih%e7>KvzUmTS=K+!?lalIi=#amB96g}Tr9<3;Dg-DDf@!#d>xkHNip{%|2z zH(c#-)@qM41h1>!ji`5cVO)ZoEPN-aUB|-Ux!>{|IQ}vDdXx+IDc+TyJI^C?W`gY7 z$2!;MjrUl4`YT1t?QzSQ$$SDg~C0XFMu) zyL7NfPa)$6x7Cl^5yRZQgW^nCN=0GzU?XkxXuI?Me}cioGo7++o>4P{j|z_-pC=vL zzHC;g+@WNdWnv2ZK%xZu1Q(X~@rz-;;yyk*I}Ei5D>w7UY}<2R`)9Od73Uc(W3Bwy z>c~4Cx}|IJ>jf*~!JH!AubuzZ^Z&i{xBP|D>+&bhe`aUx_Ig+I_)y8OeWJVXZS2}F zE4B%*5?@WVkiOb6HEwk^Zl^G;!z=M+at>zsG`^EhNM8ZbEyhW4Ft<23X$|IB_^5o1 zXi&EdOw(#JUolJXsqy1BOmdl*Q`QJl`BNO(Bf6;AvD8hN*F#09Dyfea9BSzc)7SGI zXANu`>Qt-PG}M=dbIh^kl-710N!ACC6j@UcoX2o)p*%n>_nW%FtpO#BnsJ0F_9vqU zD@5%6mHsHWBz1z;w5~32?BSeVQ=3V)ugN^JpFt#NJ-sGp1hsNK&Nzq$&$u(A`CAue zVX}IVE^bv-2@wuEXwT*TXv9!OR$<>~V2Z@3YUYJTphe=vtZgp0oSH zmpmvmPCbAqqs#nMH_OpBYshdiGe2E0+6-^}t}(w`ryIAi5*}Gu%UNBG8{3XnbIlBv zL$XTFMr*I;c+;m1i-Uw>JJDQxQ}8w27V_*H>s2&oe#1v|+}~E>SvmgUaS}7Ao_8!` zJDjX{rhoF6v+J4M@b&ca_e7kG!IZ_VqBDG6=OV~#n@7sFYI*UaHC*AYX@56U^?_rd zE!=8jPW==Xyox)~hv(v2u8HaUSJ|MmxOY$Nd$8AK@+09dL;uq{{xV#5E&eimeYh@z zF5~FxYF&=k@cI>Y>~&e4G8ellv6I?2AyLL3`qKYbbEP+nigPhs1Ivp?V?HL^pKCnY zDQmBHIo<4UeI7VGX^wI9Pu))TaanX$S7}w5$6CLBO{t9IKFm1`SwB`m2M~AhDB}BJ z8u%`DjR}kTapf?3oS9q7c@nG(TaCIDZV;&bj zT4U6@-I&Uzgmi5FHkU87-yJiqTEgJo>A2n9Za!_!5>EZjmAl+L`E)^up<2_bC`ljc&lP3J z{B0xH>U);xL5WVs+IiK3hKyr7)x2I?JMN@b(sgLD6jfI=WMzC!Iv}JTf!j_FCXS8d zZ_-yj-iy?n)0d)DQkigG&MG>3ts&f8Q}RZ+yLju}(hneaIdzAX(dlJD^HW#Abp=l< zy7#z#3{FOo+ZDCySY)0pRf8^mtnPPCc7LfsP~tm_D_Cxo>TG^zMfMqBtF=Ctpp^j@ z|J1Ajvb1C zj1{j|G#+DrjSFozjk2O@`0&+gy;`l@@X3+9pLW+FAI7zx-536n)Ns{N>$UB)^iEvNX6Vk4US)1 z&kwmz-pP2TxvXS8`RY|sI)a#9L{BN=#nMm1yZN|eKd5}i%Zz$DeN;G#!r@Wu(3t}f z!cqYTKkLfRWUi7dS_Oar>eym%+ZHLGH7`9El=@p87u5-WK?G)4{*-x&LiuB1( z9-4_=VVD^7%G;6Jiov8v5`TxVE|IzbZ=b}61&$r6YUnoBvRs*Rh zf2q7Xo#giMfPAbx;b5}|IGrF#?)bxEzydZNvwp0o7zgK>;ED{}NvHILH zZ9~0To|TgC9>$@`4y(P@0f!?+2AQjaw?hqhy5ERQMWdotKbKurJt@K$m2!-TWzWhO zRzHVaw{C*NpXpTP=Sy={)HKJ>pZz`BM*Y53s>s&WAoQ=}iR}u6)!5g!uB!~nd|Mia zy1VYODndOo+_&La85egsT}X4s{Y<46FSXk5JRyhI`dT+~)B?4W^499DQ+vogKr;^HUu^nd>d;D(-aa#uL)tdhe{-s-H6%qw1y#_4OQ6|2)pJ9y_+f*L4-@W~-hV z@y;d3Fsprw)zMr$-1vMss(|6Fz8PG3R{f=}5sTN-~0U8mQy1YOmQXGc({o1JSo|8&iQ{^ACm znII~snd*8o&w9{*F?~JkAZD|!j?`-^vzeOObv5~`xMvq^I}g%#dD_+P_(=I!K}7vQ z^W=cX%HPgVm(27hzEv>NbJKK-*3%SvKHR;I_XS_`p4#(x+SLPU{&4rS$$xTwdh)~P zKXLv`=l{6;{{zo|@l#*EGy zH?a{uN$>Wz>iE7hxixJS;8OV$g6q!^=8G*^(^j|R9|Lo1F93IFIp(hK3ZiRruS#ZL z+zoSw^Kd!l>a~Ka;dSo*c&zfg0+^#e3r+`%u-9}8lHt;oAl?7$lsX+iFgvSRW}o!_ z^cia7)0ojtuW1S9`exZVdp~YHzNX~rpsQ-fR6goA;3_%ooxT65$4mzXn5^#>4j}6X ztL;9xFTOHnw8!oWlHGCmt;=ycd&BsNz*g$&v)b0Ns|RJJ53z6<->-{Zd-haUvU%3` zwV1wcbtb;QTIqH)D#O)Ezuy_!hdPG#XyGaE6b|!tSp)m9v#%=b?Em_A|K6WJ1T*{4 z+N|)W%emrLua@6dZad1oU1IrL1?OE=I!=DRydMYinWbE8PFajM*Vv(cqlP=o1k*n`oX z@|IToTM@dyrX^fV|A;(=z#MtBTQ#e(0M;p%6#-BVDJeKsI$D{FsbNfaOxzRm%yXOY zHJ_t#(|PROLsn$}K0X&4cZR<=TAljWqevf@9-fQI)b6TuO;^Q|uHIKG{r$Sq zVZ(MEl9E?grj~s}$Hi_GcJlc$vv0rm{2JVamhZ`%X8ba}>^B!i_Os{zN9hOtcT2C_ zFP#5q$wvIf`LC4UjHwrlTR@Uyx6gv@Wc4^c9DOxmBH$uD>^JbsnVMypy` zYWsBw(A8Ovg8G}Txp)BW*v{yuxSISht`}FcuF{lnSzwGVTF9}rvg7izL!h>qw~n8+ zyUj-Zk&nkZ@Tc)u>2VxIDe5L&UZxmFF(UYKIwCuUzTdc+BPLs#eSxwmV>;zB>-brJ zO>KVGz9#uuF#uhat~I_U`WYn+XQbx2J{gyfl>eEPn42tbaxU`XvcrCOo<_C{p8uAD=gBCap8WOF z_x$wa|2+TM^Pekt{v#zLa(eQ2N}l8=3f>9FR~6J0DvV^7yTIZwy6=6r|yeJq3*H#`g}dF(Nr>WLECY( zx(?y{Yic8W`{5C&^*QApVRY%UloD+Ndw^=2(?0o43vLQ83hpXiIL7Wlx z0_;TQ2Rj;H)A12r4siIb%Omjp5&o4CVBE4V=Za zOBW^Pp^~k9tju-qXk&StL$dnovfPJNQ|H)v+}P^k%+emI_GjyuHhm46TOsbpa4kid z!wsXwCFcn*e99V=J>`|N`r!qp4!f}?6@z%X{AHf)n zidVgV^H0PX&ew;Eqx%XWj)4%vXMnXC-__cFt7BC!7LN7Omv)w2cYitFaeu%MmWr8F zQuK8k(4EH=*G?99l^bL)z@g(Z5GAMX?H;n@5yq|E%nB z$KnQw^Hy`w>*BoKR{kT!0e7un_tRw;=Y+pjFyqPcuW#+H?V_2&X{kVZw4Bk`mJxAp zhwH4(8mOywz3li?)`0a;$EdOxhTY$9bqbj&c3@6P&k0OESH82>gXA+X#CRL=;r@2T z8r~^9GcKZg$r|o$zx2gVSrwb} zJ%@@lvkEVNv>8RLI(Yg>X4n0u-%;|EO^#a%VLBiWqfNO5ujF}Q+&O;bZ_2yaOxzM( zN_=MTfJL+&4iE?>8cmkztc>q5c9i3B$vQ_~DC!0`;rx#BP{CN&H{DfM{hm;@RX2FO ze0CULikz3lm{2_Ifa5x6GaSuS*V%K8I8`{Y1a*<)1rx|Ti5RgB(X=a~oZvCKaGF0)nl zOwXZy5V2vGtG+^xA=WI{pzbxBjGOzBF2}4|Io%efjPkS~w`w(Lzd3Vpaz4#meAT-r z=im13?|Ax$zc1|am!AE$cOC8G7-k~2%fm2(XX9s(P*c-W0q1beRV&}0VTLtOwAIt) z`-gisPJ%Jg=y{B&6!<14AYZ|0MAs0}rW>N4Ia+G4@{|L7#3#aFkHIh>ggs`;#6DD3 z!;&mU++oSY;!0N2a5OPA`D@(LXx5RXILK@yw@uM7UjE0m!&jCHL1S(kbT$X3u{90P-G zUDuQ^-b;qLbf3_FA{{5xvAkWh0v#S8d@|Oz3yR}3FP(f%nKjqS>neGoBlP*}b$I_j z6bI3-mEZs1d%pX%4?KT*@|Dm0;qxzh_pkraJLmuXpZ%q0&&ts@BYQjhoW2$7oJ33d zRyz2-JgUlJTopMb?ScQum_G&!Ab_Cums7vzqyx&n)$oJncR~)7N=_vcHcb z{?%;OT)dC_)_J$wN8~Q1Vj3Pz5zAOb@rP|308|)pupKoRCKq5NVUitGR#}{FAC)nn z+Qdt=B%i!`O>GozXO+wm@j8vkOtWf+yNfe}yRLv%;T+{G(qAagiFL-5Y%VDC685@w z?{uB;9lOXAd$&X3d)LY0dO^!qPQIi3)}!L1-ILQ)5#H_YO`8?}>o>pu#xI=zYVq;> z_|^{keH7K(-5hzSQ~+ErXZTPV8*`Idsh@%|Z1Z3H!7E+WfcLa(BX1O+#r1=tXF9Ca zj@E}{x@ISD0t}?Wjc0Gvwai=&26HoA5je4}(YPh(uvUT<=~#3*tC@h2%$l`w(B;ci8COhwa6|g40%)J=V*aLt(6{p=!#ED^)Q$RGMm= z<&8U0^w*Icar1SU2kxMChGmYg!`!0d8bzAC^Ry@D>TqvN)V0~CDZe=mrBn_vojUx_ zzR~JF!Amq{tK*S>zN~N^%iz^JoqCSb3^Dik>cy>c4tGkHUJpWi^P}ZYV~(MomRxMr zAK=eA?)ib||HZSPdG%lZBmc%tF3F#MBfI>{)O-S(}jx~ ziTyZecD*)YF5#fgOz(U+5bKDHJKEqwA zZjkH~cFNbDelo{X2ZoqA^n>Dl*sHARi)BQ3U~5LXXOtJ!-J@rmwDP5$DbowgPLzrw zGi->S_AHps1J1n-P33FsYw@%i6Q50$nW!1|7$fn9`fLd0??=l2SCL{a_McwU62=Mb z#n^C<*ZypDO_*ltAk5RCp)8T}<*cM3Ikoh;{6FalB8j>G;ldvBAY* z?(J?>VyjP-+3`|AU2cI-mK6Yh{iJsfe7gM9>Ug`m?=3d_4e$P2rO(>w$#?(2|N3Ws z{*Qk3XYQQ;{U7}8FB_#@Q1*Hm^TygAbh5G)8i$%)*;s#id>m06PtJSO)4MJH@khUt*3r$uS-r}v{tJYuCJ?oaf zg?ovyM2@-7hu33!ehSBid(t+DD^h9o0mfoBd$0&?)7#= z0adUyV+wVQgS@_R)^+C*}}$dQD3Z7jt&jaqUkX zZFcCb(FrIPd?unz|99ndT3SL&X+1XL(kI5;|F}H&lV!wj zcM8F{zxpQ&KGnXLZb4g+?<)7#|^f2?5Ct%C1o<*02uyQ7z?Ba!2< zi(@z54^!b}`dwf#B1?J|1^@}Mp>*!T7JNR6$}zApyT?AhGjZhaE!QCG{kkvx?HV&j zs_WDYIz9Pk=fB)_#F=tY+4O#d<~38t=_?$Ku{BlaB`<*Q-K;?JU|^kCBz~DsiHW}c zJ*?mg#?*`*UWRK@exr8E#2Cl?O#Vv#-+t*m-k+SJnA|yU$4oa}UDf1YDNjy_tA9=> zwj-#|H|M5#C{d9bOH5jvgtMl%G@TXqH1phnxLZU}na5%xSt~V;v}mfpTo;z9zG}97 zSNWCs(!M8${#54TaKE~ISkE7c*>W7jP4-aPv*z{O)-G^z{-^)&GvD)1zvryX|INF> z)J0IcwLSe_zN(GySS?3DbP(UwX1^Cv#cmGcO1fBxp?dt-AK|fAm?j#d@w(EX%HXHe zKpJ42Gs6fL@1>#9b*&St1PA5|qesYS$OAii^oZQa<2VVTHHbv}JG2e^?Vl**?D{NN zuQF7pfl&zJPmz82oxZhIIWU}i%h|7(THFlDsGQDrI93qLofl!d=P(Xx8CUpckCnMh zHGyN%+(j+vxS3}Y*$vFKZB>TpH7!#aj9RMg#aZKPijRvPl4uDc%~l!ark+vNMgZihazZLqJ8 z?2YLZ`})`6Ra_!t?Awmf4rkeN?7R4}8Zs$&@+$Io7izy!eo#;Csh#^p{%z!{RjIc- zp7$LEJvdIizj{iaD*xl0n#=01qTB~hPD&>K%WpjScFF7i2(Uj!CSH<<3-@pbhMdDLi;u`ei3VkqvRiZKB)?R5 zYdbiNHI;onliqeBO#I~7RRP&WM6^S$HlO$ZcsbW6%Nal1xur4-Ab(~-jrjYYM;{rZ zqdj2weO6KBhMVJe@u_=jAFA2V;r+*ZqOEYQd#_!`Z>+wKf%}~5%Ba@H$f6uXZEae6B_jM|D(LNcU-Yu9O4nf?lUQb>eb!g(hP5xWaf$Qg=YLNK}z~kXmKC zDdxI;AE6qJPa|Yw(dK`*irRvEWWQg%E6X`xzGuH~LJ!JH3|rwmlr-dR?%DZV#UsHa`O6Y|CYWaP7^6`$99;g3_FaPrQc^YX0Lz zOl||ZO(U{vfBDPa{R40R@lTze{MT>)wg2ek#{YZktKas{<1!R_s=URu62m>w;ci>i zx=dM%;J}BP(eS$YeMuYz$TDRTG z?&{rmP!wUGu}3)mvEn+8wDBFXo6LC?hsydxWw%W~yvkfFXL+Q|{l4GQoT5bms=1`q zOvPp{;EvKNA@ASeXPrO%6S}6ebV{G(V&J9W9ZnQ#C~@*6I#j_jL~L z&F8AS1WpnLJMDjHme4+BubdSfEuI|Qkm8A9$Q;n7Tt{*YuF0!7uX*VDbbN20>ogxw zM{mr^mh+EgNcmd9HQD6aImk0w`)G|z1jmJ)o?gu-@=~`3rfB#hB@g!F=XcKk#j|%x zui9Vq?CMXSl}~L(!>MlncsH9LD)aVs_ib&2^X$|Y%b3^a$L2X*zO$`Y&A@qV&PQRL^sF4 zIoa8k!nY3RdTsu(wa%4WW!LVXtvZKvb2vBDIEM3Yoqi<>`bc3Fndf)QT#paqqQ`0+ z$L+6Q-78HT9zh(AxcQ2@zxdj}_a}biGe7n3=f3-lnr8R@$%0WYbn26AUbOUm^q}iy z_q|-=`$3GVK(9D)_tc<_T(w_PK zY&Q?+gU+#6(6NAI+uFWlDn>sdtNdz+JN+#Cc)6R~`aUjxe8zaQ&b>Q+@BY}7QE*4c z$G$w?xX+apLIZlP%#$1CPtmA3)8b9PUY@}68-+dnf2CW_ZDdbaHUH_I&j zmNIwD@vww8cY3zNNxbfEcV2DARgN22Z^d6~HT6W-@);;*?ccL)b>&rkTIrkKR@V%#iK1YZQT#-STzd9I z6%%{{x!^qSV;?`hEwHdXxA7b>#Ue`o$Ped=$sj|KW25 zq1SmMR^M|N46X6yH2c3l$CGt|3!+1rBv(J2!{XU^cqucuAh%K6MDWoHq>n%@=!y%9 zCg~{@606mb9shWh5miCM@#LA7VQ61rma(r2TE)=*br_m`Zkhoce&-y94(FL;&0%QU z37Z}RFhka_`e%EeFQ%RSO{8D*Z?pl~S1JOHK*V4qj2cfEBsGS4ww2M&r?=`}6E zP;(CIxnk%&o`0(9ICot&Rl^Qq|8S-9rs56zyLcmdhIz)zE=%c}vNt%2IOO6n^y2+x zeTM}rc@8!Il^eh5lVAAuvoZ&F;hf^5N6Tt^q9CVZwArSZSIwArw3+7c9ZS)&s`7TZ z>L3?Q)+&j^J87xEcJWl!P9x&l5xO}8Mc&Yod^usisd&&64tY))KHq7W=TJ{7yK7zWNHUOP@ycyVjAtzDT} zJub{Mn&BGN9eYU!(~BRg@w%9nbq~{O3 zqJ%*^YCXk^k2A4AGJ|v(H57Cf*eROJ^&OslM2X)`?|QV1D zT(fLB`;ZAqOZ(o42yH@S!Iln7xu2I=?d zj(DdTqx#EuazydoP#furW|UXOr+!m<@?MqO#*FTB)?wV?F<>8d)30%7H`ToR*R9*O z=DiCBEM+&MyQnJG_B20{tZDQ!cpKF_`VO_&2wUw&Qcl&F8acUB$N&eZJCqF(>FUhQ zJp63YE?4U~t}vk9nK{*ae+*dW#cFdWJvAOLN_hOJ@oA+?uV=pL-)8pDv#ZmSKlQ!e z|K^?Z-}UM5`t#nonQ86gm$*@8p@{!uMGvAYKy|))-`v)QWJfot>4&Yno?~pzSAHc= z-RPs9{TZ9xn$oH(1C`R<819(%_297G90G7u%1Qbkjs}bBi{tKe4#P2kuPUkSg>j|kIb?VaZboZPcQYeG7ceSu@!K!CSIl+0v3%b= z3U5Bw>M`Ytv6GL_Ri49$yB2IcnL)b(Ht+i}G-r!{#;eN5EN^2c^b>c&ya{_4avk@z z&9IiKRBe9sfs#*qt2{$XjPaq950rS(|5oqTa<;V}(!$t>i$*TP=-I(~7X@h{Z)S-x zm_yl<^M`Ky$G7gB|Ecf&m;R*pT@1$F>Q>bKgRnJ!ne5zfE$@%8m~gz^++=p{)zvLi zDax{9t&7xo`!{YSLd$C68KC_636|_{$ZLhe1?wGBoR#Ar3t{7uu|5uku&xSn=f3QU ztB}7UKp%<7Q;7Iv9b26$+(VuZ^>xW2s|ASH0nVl~4-|5r?RR`PaEZ!cZxfZIT0no2 zRivmKZd>=iI z)q|hspNKLKr}>LN?1Oau_!?LFji}GgBNJ)wv13wTvxE6t4$~P@j>I|Ce@CP~i5kUT zA|3gGdVR;$`-TkAKC@i}8TS+X9mbG$+jX&{xMvl!ePb(nY~yD-EF>Be3HtV7^vH{p z8i^>c?jxlx)uhQa*Qg%T!G#lpVMZ8ow&xjr9%*;ne^ z_2};URJoRR&h36$({`Fx&T+L4=V}d`xyMio#3HrR(II!!!>{2w=i9EJ`*kH-$5!ze zneMkW+~ONoYxrUqar6ZJep9FAfx!w3dS;H5-4=>dmWUF-%dAMi~ zcT0BVmEz!)Pl27&yvmQ9|N8l_od5Onzfme;fA;+6O3z#G+niUK)^t5wvLv_4>iX7F zz3mun%|P}i^}3$GqteTcwW*`XrcWJ4SD<(F`}|>b1=T?^gz*BJL*uxXS}#IK9lv+W zgT|jF9u&!nZ)LD);qh#Vh5eSn6w_jgi58E?gp#|DBXS!Qt#w@w&pZ*w&*`!9O76=z znvuuuzh_QQ5bcj+^z=UzZ^wN;zUyLbSL2)cG`W1l^c+5v8tOu-VzEDwcq&C?E@V+; zDAE^_uFyh;ii$%up>?MEO(s*To-Vr3Q1{?mFy_<-3J6CM_ns$#@-I;9;$ci5E$+W$ zSY)l^Hls`F3YDIq!w5g|y4s~T%KaZcr;|>x?x_o_>?P-YZ=RBKr(j7N`E<)Q^4p-_ zSMK~2+lqg;N?!oqc0b}@I>*V5nA!cR+dps2H*4m>F-n*_G@ReC&5VY7aZp$d5HX$O ztUh^FDjp4%(hBErxm3w!HO9%C;~ygujE^#Ej`iN-(!8#E@9+V_3n#yR5_{?R(k0S->ifbp5q z;_0?B$IgVpWye#M%28m}&{!$#vKIblUhpWSn;iAm-b%Nf%Wgj?`1f`}A6}bh3bW#| zseeCP{{LF}^-}38?hda*#GgF>!ujdRKQ8>x@1HyW)xr>cW*=_&Oo`(iOwE8gjp>=%@8Da`$9cqsC?DxuoIT%6oHWUg#XBTUfYWwT z?@5o=_L<(_NXS{Om&pgq?;D-Z5E|+gqQi*lIh}{|tcA1k?<-2cvn|JSmfcgfBj&GH7a*Q?t>I3>}!DjLMtr97}Ud}d85%-yPMZZ^; zqF#9V81*o##9@c;Z6|Wgx-wsL4~D2Gvcg1gi9|3m@N%Tq9Atxq{3a?eQqN=`w`TpF z8IC{5x`yc-ga5^~Zg#wMt^=tVm#nf?ts{j~Z5424cUaEgo1|&AIkGmq# zi1^&6#Vn~Fh-*;z+_>eS~(>um6K z<%}I`_1>&MTKZ?Sj@CLB-7)IL>U{FE2V-~mP`S5<+a12@AiG1Y*=SW*Kghd7y1LQf z@SpJ-<(gadqc236;i|9!RXQss6jLZdx(Ew*hV=HEi4v};=$=wZ(lI7Q8dg1=x85Y zMLG(smU61EiyFpC@ktc%9<6!#rfmK zoDd`Xv_I_}xSni@eMB@bE*3vva-xm1^6kfn9a7bq+5^Z{?~qkK=gHlq9Zz51CQ_Ks zsI@tDoYqVB0lP627v+c;+|%JcfGNvax$n^|+6XI$MlRz#NZBiJ=t6D zO*CSqw|2JsnR)Ait!IDg>|ZTPhYC=t#@tgX|GOXj{_lPDTYmWN?|9nX-bHu0Rqptw z3Lm>w?!RNSvGZ1m1Fm6gj^+PEw$s@r69Ja@T{WEQtGVFtzevRj;9FO@8P32Qm z*x@$8R@w>Nl=TT0Pme`2*qRI*6Wih|emVXz(6aYjinjYZv<+JJ9b_}+V_l_xo%)fO zYpSLUzcWniZrQz7b%){nTBoG6otO3`yf#_OX@5&-hcUty3W=BohRAKnBe*kkexq$q z^S6j6HS`#?9Sv`m6LBHUlSG!x8qotI$cC%=2Xzoe53P)CqutPc@!Ym zB`@g8+yg9t{%&{3-Y%Ay;^gsa>JQhGaTzOptL&X`cgR_vALUuUp2(D^>&fqZzSE6* zH2 z`9^pBpD*u+(Z1nOSgpS;oxz`n%>^d6WbKL(r&tY>qqRcgT5Fl!U7SnFXRET8!KZH| zbA(Y?_f`rIR8;e-`X65R*bl33tnDyo@9q2BX201DtA{gi9agvdnq2%?jrrdpaP2bn zrQHPsE0R52TnseQv$D>o**jSEk!QZ=m4EsJrzgKyGI&2;e*ew#CLz?XUuf|VZ>BeyqHGx z|Fd^*F_vX{TG#_yM)JH^AipA_h{NI!_&OuTB-Ryt@P;_3!&fzg8^l4~xg}=F#sctMQqFEa5^^ zjJ#2-|eOUVB&GK_T!*g0$(CR4$lowI2 z@$3)vv3WRId*FJRHCS%AT(4oW$jl`wQmtz=Tz`4joHR38IZ?c@KQr9Ql|Sx%-gD95 zJj>=NzckNS{0w5mYa6#?6vQNJKa&g(JA0|&5%eGLY>8%tn%77 zuYbzqPP(~Kt@7#nz9U}1F;*CSzxejkd zl4MVqkBviy@@V7XS4tnbhk1I%;0 z>a6?>8U36%w2$sH!yDxacqw1txLotC^6xXJPq_>E77Ze@!;Q*e-9 zMzz}N@r%0CW{ppmCwRa775Vo}_w=~qCg!;56JzH1dU=wH%5xc`9j&hRWvF`n17uTE`03%WXUGxR#PQ0oXxPq_K)H&smSfZK8Bh)RN!iqij-{8gr1406QcR2c zS4_k3#2yb{t8s{ImOEvBIB{eSBK9$|VR5yOHgQCCi(f8(Un@`eT6u2OtyvU!%x~+S zINp)InlUyh8g|_$-R0}$T`d~3NV%5%*sVX4B2l{Tbferwp2@2vX4lX7_7}?cuk(rX z%Z#&8+0aIqz7e1G>iDv`S`NZQTr#rBL*xaH6 z*zbCb_e!rshhT~51#wsFa&D(qd1b_AzqvHtVcza=Yn9#d=kq*Guf8mKuR|oiQCd(L z?J6$6+`wdhp|=WBL%VzB4+MbUkP+g0mF;KzruZFO4t|TI7@}t@ay6%5t9=M#_^#Zw zZSS|QJs)1PT>a_S{O)+ImK`+oH(sY+Rp_ytN+zB?S&h;ChO5AewSJ=pB%c9_CzeS( z68~xDUn=M=5>z}@-NADW9 z)W45E2Q9{EJ+waNV)c!JSTw11_}o@WDVnqt5&W$z{8SPUFBY9f-hjUpQR5|&$(ZuR z@Jw9O6jxd*=_*3^EnA|M+7-+rPt%IW5;vD>#Xp7VA!*r z$BEZrnGy*>qO;*5yW?5)4@|u@cJ^BJXX;UeceD!G)$v_B;ehVPGO@SADV)!h?4aNt zPQa4`CH-U%#_&!GV$MOdrCypuEX9{Kw@OJxmpO>m<5}YS#*A$qp4Cy<4bNDR7duuD zJDy!`FOA%M_LH3VbzYgjR-$-*rNkpzH@opQ?3C5|Y`KFdo-b^S;UD^9nfPqj7e6(1urh{uw(O=18w`%l zK}k#w`6`oRVNzhA9giRN3#()=u_@R^e#h6uhPcY_qA%D4A}wS_!%X;>KHTn|UdrUc zbLo#%v%ZHmDUa0>?V}8_(&W}n?bY#B$;Z!#jZtu@H>}#NLk&&ej+H|8m7cUqV9NSy zm024lQ7q94Q+F%C0g|9 z_&LR_n^k6kK4tT|j=D#iwri%2ia4@Z)AmX;i=xT4O#Xph5S1~;;6v(gW(}KfdG4AO z|DA#wdQSx=YxoOAKh@Ka>u&k$HJscyXys|?0q+jSIVz`o4%c81`p{o1%_rxb-)mZ|t(}s!p`3tS`xId(e5$*UDUc_WtewY1e5-trcsY%lCrQ zA|g*lBgw)wCW$G7lZoGfyU^1&vvsLNQS|UbtJkP|7vuDkE5>R`X6jVipSGy28C`~z zU3W7`89VDiSH)=8*hsvdz8*d?qU}Z$rP!V4 z3XBsJJzoY10 zw5B$f#nl<~IIQgC9S?0ty#yt&-FFIV4Skz^&s?o+YvO8Uug;IUviY>9*mg(@ZApFv zhVx$e%St~kyyL~LLhe)LH9ACpPUG{%EB$G=Q9TyuonPPGr)Uixt^M~DYwwct6<#S?} zJl|3^%9!>su&ZiRY(D#EueHqMQJd5#mM&|Rrx{!F{X?r5V@eGWjLBcSu3b1vRH~cm zQ@`7%zgYHNdzt7W`?sAawZ=pPx&I+pRG%wBG3$G16V_HWs;>s->3SXNT4_a_Ct;hb z7D?;W#g^@g3E-iLA)B(+=rlRGlHw#jB8)*yVa`eLuRJMn4x&>MWnd)qwO)^hm*O|LwA_L;=&a<=kU!?{(2%C*}7R=6&f;{-#&|;vYFa z`j@9aEL!~Tr^P%|V!5ziRAo92aysJ6s1nD59hP_7(W+_GS)=qXOyCN8mYzZ66F*}k3vuPqs@w}$fwse(*x;_HT)AdLJ(|{P8P2&)He&3-u_m7^SK2Ep zDL(SySm}RAnTjT=uyLyq$}u4=O6`R>zK@ zqw3)5)t!`|r#SeVzx8AP^}o3LM|So@zEJw&>9ShBUV6nhwE5l(1;^egc#tz3wx5!< z{`&nOVWKap&OeMRI6o5NAl3}8Ry2}TB&0`BzWp_q=x3?@Z9bZH5Y$!pojcLd0hH>orfR~pXP)6rLNQ)9fSI~V}-Xm`}nNb zz#WYyu0#5TuMQfj?u=DTmEJRi3$M-us8slnnrSZ83 z(>5*Pe-sid)P71M8Mle0pX$42sV8I4%MOSppuJ`F>e(Rw#3uuhcmvRVO_34yBzVk=_=zsIG_q?|YM&9T~;>ptAU+wPS z=8tFP+gbSAPFI~?w-h!_~LNB zEk{n4Eqf5QK?k#bxXUG9Ire4vJ!{fF21O}`xW63`yJrI!5q3g!MtQHaUkJu7SY7Yh zRQ1K7e|6fXCCHg*Ms~1gnC{$A-SfwLDlW@BioKl*Q!Era0Cm#d5!KXcp&IyChK!bp z4r{k*sze6$MANN);?SsfyVMvRGRarVZ!$gAdp>C*;1h3s=_hZW{@Pvd?t+1O>3Tty zvyB)y&ZcU!#qm{3@vkzg)tXXN6{`g=+9g|I6aK-rdfr4%NgA&ytAn}|luX2~T^P3c zjW$D-64L-9J*PQ|dx*}oQn4A#rMB-d5xcwF%h$@&Z$d!14D|{l(YBeb!XfgmL&4#U zTaJPkKVn1HqfHNk)f`@(Dp5vj*oMPnSau~AGv7#WL$j7uQ+})bylPi~h_ zti!p#^T(ce>*mMDNB_?Ej_=$){RcZEo)ZMAhE}leYO_A49DYy`b(5!L^_qR5U9ygn zCqA?S&#w+*Y}rxOZk#fR#JJ-Za+i~h4gFx8Y7dYY`=fQ!4Movn7SX9)$Eu?vLcYVr z)%DqH%hkcYW_`wftPb|?uSdFhY;QQvmgAgQF?>hg8#hloWP75QMT!_H*Rd*j8SGQZ zJIDPh-*X2$5nTfhik-UXgzcGoyd12GR&=+WIMw!ftua09RK#|? zJuC`sHUIQabm&+o*sHd)mNG|M40e;9JjBS_{>#G*owxcy!6XQ(3g6B0N3AI$$PH zevF-)Vv)l>)>+BJwK)$lYag^D7R4V&VdAR`rVZDjdZMD)SWVO@Y|kub2SZCfN^{dn zi_aMo#DRPwUK(rJ++{VNl)jl`A&bK~EmyvI^v3~Q)%lnYXgmBrzx)VzeLXSv=nvvFDGh&D#Y%^sy6hvTI0?PjYflR=#=7FPMQyxnMd|pqWW#tCkx#2F3Zk1~5HZ*)rZT%c zMMt!PJ7}rbS;zc(IseaoK~JCt*tOd&T91J3IK@`|ryALKerr0oygiq!_WQ%NrXi!u zi@QhP??$^~T*ZUc8p5pN8Z$EFiTY?;4D!{QhPhX3TIC3_sO$8uthe=92vZDLZe2dw zYkIewp~TAZ^c-%dj-U2wr_KtfJ4Vkv9;KZcE1U9_!>(&cpaL|jCA0V^KK*@s`Wp+P zZQtNxi4r`YeKV)N;=^Fy3~OWW!@l8*mOszeEP{K?GFj8uGQSF?M;t|Lk1$GJcKp&E zSTVRI+Z8MfqdNvQXz%RqS!IwrDKGV-U zJh*v$^hAfNA0GX9S$9jcBDoCXy0)*B*WNFx)2%XhYef&U(9cfkQpe}rj!)KEAs+kT z)|JFzv$KZldmp&VdZ(d_Qcqsfs&!8vV!tO-lE;x3($!WAr3l)J8S*;&o_b2xb#2x= z#9;lyX5(}?+@&6_=C94e-FDHIjK6Iq60f9~rVRq_6tBFZJF`tLkyJc=v&_W~3F%uLKRp zvm7=CPhl`Tri%I*_F6gSF9u8fhq&gu_)}^#mMg-DzKP=|>-Z2Tn`(8*51X3qzH2o$IqHCU0xO5iY#CNwFSE#bx0#Q9WmEfntbH?Xs`+8J^j9o_mS-lKlhgn! z%j)wRUW*~%wbowp0mO`HK{P;Dr;Xd=lbv&`_xiKhH$|VMo^awCA#!E-^EHCa@h4P- zT!F!6q;}H@>NsQ`uE$HPYnt1pub~13K%eW)A-1q2jDh`2cDC`tT3OFxQp8u%Zs2D! zz+jF~&=A}`R~W-Y!p~u_(>5)^OWz&4J~M0FCafI#;kT;2m|J2>(nE=ij|E0|PJW3w z8}&9hfOt9Oz&vcT@=Z}FbA4NsFxvR}qfnN3whoV$XQl71b#v`dXz6UrFle=8-|T8K zzj^-~9}G?gsV+ZGW@njyE_g69nSR6FWIj?(>mF3T)awA}wezQla=qa1^Y`)YR*7DU zPyGrd-z=EJ%lWXOqOqTrQNP;#|LvS*^1bSNY;DoRYSny4Je$C^j)jE2XZ= z%8qtpkPizo?#>`rv&`niI$o5Q=?WLCu2vOCNzO~j%9r~(!WQ-QD?o5z2V`NX#DyWq4C9m4m)C_*RCysG2cBM3*lGEhvL64uS;waKJH?zgzTKvEb~OdG^@(ZZQ>^Mo6&EirYqa8dICiUv zP*-?emt)p=S@H4WSYwZUuzTt?@87?|#;Mo5&MRuD{y8pq@fRtEbmZ z{WWJt*(2wk^N6)UNa}FqM9a8iJ9khNHGQ74%_ox?P34W!!}m<@4mYHS)9me!iRDOa zwn!GbIu%^B3Xg#(BJnrkoN*WNBE0YOnB&qsqeK)%XGbDL|JKe`SZlqEFBbLD_q46+)jBe5 zjC`@+^_^lri(#79p}p7LeT_B?gel;E|V`T4QW5ZA=BTCV$EbmlvF>dT^{gfIR zF!b{sDnZS}h_l7pNHeaeFm2Nk^n~OrW=c&f9+Mu#v(KWYU5Y|ueY3xPDs?_sM|7Ux zsdj2l;wtPSaEOq*zrb2uZ}MyDE8MG)xg(siSK|;VcCcCe6dj zX`7Z{B?P1|QdiBZahvMS3*Te);E`!5j1}3G^Hrh0yJ6IJ_|(v$=-OArONykNwrNwf zuH&wX;71*UQ(-VCs!i{)xvF)$C#RPDKG`acP_rjRPQFw0e%ATD(u#Xsdp=mnp={fs zj|w`_hr*|8 zEnV+W-0QjG{mdyTvC5}fU)y4>QP{zfg}N73iZiioqV7J(?eKnzLe$q$ROS zvxBpPSVM{C<&m_5vL9d_g{Im~cp94lSCaweQ@(wU)w(pgu=Wo$WE;=1T5I1d!`ifA zH(zmPAMJr1u#|~W0Q9Apc%z^%hnin}rW8Kff|0|(FcR#FwM+A$!FrtyXGFwbvuuqO zU5r{AA8ZRDrdT^|(-N%p3?j-|&J>Svo6M_ZMwv&6D91z1K7L_5i>}EkWpT59F*7ZW zJ&cVe6FvU*vF3MqnAn5%H}BWVy;jaDqZ?neGI*Y7oM>OFVniRVD6)*zuESb0IW_@5 zN@7li>(}~A7PdMUv8q@}B6X}vtCZ4YM#oFT2gA;=BKRZCdD^4(9ekLBwHN7mt~PDv zMXgXhMdCyNxN3K#eZGw2Zb%D5qc_;UvS$uQiayKQgQf9x#iC929E_!)L24>Tc39pp zBV?bXOT-5O`R3LmN+jE`O-qoLkHqXVPs}ELJ8YBL75&oFn_=csawN6VE}{kY3A&(N z#9pf%`oib^p@i~GO?QvOBW=slZdGl4w2=0Ng0wF`0HnQEZ2S1%?{>9a<)O!0vy|QP zHefA1Z`%*z(ycIr)UcT9Jh+3bS1d!08c((rBBl|)zvEiYjKe5 zc5@JS8M}odcBEPrx9_F>D+%Xew{_p!4RbM1`(7d%t>jgF;+Y7?qc&zogst(QLAQ9; z^G(~4O4IB16_?ceiV}~q zOnKN8mxL=(#vo@n_A0N!mdxtZ*JSs?Xmg%M5zb^~#1gcw`Eyx@iB*zS;<_M1Vrk}Z z;AL@1o&yJ77S)-Va8~T2=gQeW@(D5rs_rm;|BLtIxW}49@|^0JtUu*te7|aOY|9(J z_%RxD-}9gRx4Jgc*W+)IMXV~#w?Fl1AD4;?{M%ON@an_oWcOIrXB$pqB_YD1mL|!cWbC~EaK+Oy&W}QP-uKEM434*S{0;4xnffU#clw!C)C!My5a*9#Ry8Wf&-6B^ zvYky$k*Vq$zh_phN72^r7n^hQnW5*)b=lWM=de#fcbo3%+hv@^?vfjlw} zQoj*8;UbA(V@t7(ASgRHbt)~Gg^&n z@~y2L>DAe`6qg`<&gifkgu@Lz7t{kb8wFS2?hZazJ)mQRm8>#qoG7Pwi+($*R_Xm(9IwifX%Y9m`#B!JKO z33p#wdyMiu#le;*#naJe*!ruVI6Q+p3>I$lTki`Cck@%TV`Ix!HZYH))!AA#`f(hP z=p354l|zp^Df`Om8dKNLEMyr%MYj&{Cp`eHpL z7lns)6tep+#X}k^e-rOiP=9r-Xj#V6&Sjs{_o<<2mx3D*6&n{%1KEw2yYl5ySM6)A zi9dUFUBmcIo|3*zj}jiXcZF%Z3o+(#Y8XhS*EhVpWSkg0aN zdbVnO$|=&52^scBa<$qmPi=>genbA$PCAXwDuc!sfE_#*2(; zyu!pQOnf*oQQbl(8#)=wnKI63SI_3&kuzvsD5~FkuhU;VJwE!}tH1N^KfiYJ zd;iQI`3GGu4{g#ir#=)<*Jo2t-;WpBRbwr4^*h&TnZtRu z+{be9V>RYv4}*^-bL_!*hMfQ#)#=HCXmHM4nWEWm|4;w(PyXH;-rEhW=x0xs^%X5_ zJzBxrecK;6&;h2vdkvmgnB#zi6s>KHAOwjezG`nQjEwn$|h_P|K?|Z#Cm&`PA;-Iegio+ za&1zD0`eK@{d;g~YUWr9hUvV z&HwO6zj*EJtv65qY2ju6bKz;fTA0}SQ!oabHHgj4*Dyd$Y7HTCrIq9kWZ-U;tZ&6t*NA~z){ zfvyz#zY6nhwADaoO-tGsGD%Ae;>AF_aC#fRjqOzP7UYW zCY)-Y3TTX|qVa`I_Y`p=b_{FP>(emwBF* zX`7aKR>alIL=?d+|In%#S_h&Oh=4UtNs-o06F!vYrT^yBSt2;17}y)w%(}T=WS0avIov5A9;%A5IFHS z@KL+W08b{S!Hm)VU|e#z)tlfaPmF4+qVSo+%XLpWttVTf4cEmeuErZ?H+)dGFg$pr z-~y%a&e3PeA2FqVu1xcjf*tF5<-a}s;m^Eq`bSTH-H(3VkN#27{{G&d_;)|Dg0`dH zc``u0TILjsGcjvzbe!jxxlwWl&dR9ws7O78idwN09kct6Pg=EuLdWEQ3|Hnp&=KCr z=MaZ8jdQg6#FDUf69Z@U-4%B+=SMNtP?c0FPq%1W-;A5-7{CUpF2 zdCr&1^FCe1ke0JLCu$Bz|9YY{$4F^y&%w$zqlA#EBUBz})(p|o4kWV%|8kYM9s84U z!MDW!(Iw>D(O%6J7{m%lzl*+tsm5t;C5gVxOHVIIwvag2WWlYrMulR#d}3e4{hM3< zO`NUBHT5#Gui6*jYit*`j$PQULW6(MZZ$(o~9rFYCNXwvfKB)uDp^^!8NW9)5>RPUu;YFq4TZJwf%*g z$4CF$pZM87{NC68;@#i$YRPf?+P6=C>A$*t`ovq$>|FEzMnUd)Ey7CM%!-e7x!2;A z(q455*`R*9SK9fx^7o}q^}ADkKPkU0Wn6jAHsi8N@UG$hetyP6Vy6SJ>2o_ zo5^^K_mz*rAF7MJ2wzDK37ZKQQ|k_YlX+{0OQyZO3$JtkL)fD@Dce^M4LRv1##NQ7 zvo-eU^nG_vmh6;wtz%uowKbfP?zJxCtGwx37NIjiY~iTD6^VCAv)Xke+WDJu!~gqPET>1BMO^cmPs6JyZ? zs}6@g$!m*VIP9ZM=u>-U9r{e)hZxl3X)K6+qmIj}J~l+3ddJMOrRa08+^^l-gNCUZlRMKT%7f#HLauKNFpaQb2)9 zlpE_E2a47}N5P&bArz7M6{40#sj*Sx$(UaW;6_2^Yh}#+`(#1jy=^`6U1~9%Qihm$HXJ|u z2EH5bb)pR^Q#2j>2&M#7io= z5o@=@@l>2lTE}~lU6ty|52`PC3+$SrhxAXfjHB1ZFY0I4P_@)MqmIp2oV3s9rWR}M zk>zUG6i?TG%SHH7A*I+4|LXUtxAgaa@{h0mrdPeUinuS&MB5ij1(qj|zFGS6_~^GB zy;#PPZS&=$-`ag&+lqa$L(vbqE81RDR`>_S4!>FA<~-XNb$J;0a?+}~mHOfhh;0hZ z`ZYceg*T~%*d1+|y2^U=)WbEbGI5mZL;_o{@sP1T&3UU=lpH0A8l7s?tXDs?c&WSo z*T3$6INLN;QCFGTPn5m+PU&-%!d7GQr?#i3n??%v>=DkN&o=GnoqH{_O)q||9yWG( zXlzPe1b-iU&}>;npZR?6sj|yHU2q4}d!xHk8*}P)SvM_~H@squH=C@`w&#%*x)fik z&C|9&qk4&#z~k(5s|b^rfYjj?je!q_8L~s|pWz1L{(8PKQF2%VuTpwy z|G5Z5mN!@Zs$=tHc}A_M2-suH>g!X*YZc4v@U3bpnA@wR7hWoJ>8ZjHpIyV_@XK-Z z29C_Lh?%kL$Kw;k#}MOtR9j1A22~-kUdF^8fZ@>%c!c94cG4bZ$d^fBNS%i zp&dPKQJcH9T7(^WmT;@7hnvUItf_5?H#M=|ED4Ov-jzDxypCQ?tdFa3R9MXaD*kP* zudqgW=r??F+7DA61|yy>E9R`QijOb$60a(2D_L5JPU0Dk#la2@XW@~Dl*{@Tr)}C1(|C=~*?>~7zLfDQa>IvGlk#m*ru4AF~yR%l-TemIF zCWgu$Mgyde>C@qu;c{{klB<`>^WmfRIeg5R;G?1%`MK%MJT8pVNS|^(apY@YgnuUq-!npHu zyG84@Kr`R0n)bt#g|7FmWG-Bm8qUdPJubEowFk;2V&vI^N$-~VL~*;*z4MuFhHc*w zS~173blzyY%##Hx6RmerzG=PJ`PH)0w(lPE^WOHigM>$~kA~?{=X^VeOk?Mi+%02Z zw&<_nE^__T_i19eqMw-;vv2U9V9z`flzPv&ib1>qR&|g{bSg{H{(*5PUlvs#I zGS)2Y1gvNy5Z}poq=VW?igogS_gTCtK(7sPp|{JB;BKPkUY{Yd}8Prd)O>%aG}o&M74 zpWitK^0|@^L&-JQd`nxEc&)o}E9;K4aGT5+F zJ$VC%!_ve&UW8vMYkoH@9nQc_nnig27)>vJtj5^$xN8>dWWH{Z9l@@*%I|77I8hU0 zdcXYqO!@y-w}ZpET%YLgSIRrJZq*dye#1|F^!xwZ>0dql$EAY9-#z{1QqSREo&HDP z_>*7z{-3^m`fq<9JlW2Jr`+~NS*xmRvDn7y~et$t^$$-A9)H?$6hb8Qp8wKZ9sO8@Iq z>cDucau!y2qCEz4r}x-}>^t@*`y-3lXd5N@cBz|2V@kcWs7-UVg=w4GY;j$i;(NjY zaoKU3%uIW4PC0cI?Zb)?k40&~HdCj9O2SL0MRwbG6U;r=xro_OAy85k$ z=8qqjnh4)2NK5^Et~^(COg%frRFw;Vc=`_ulK#Wf|Mv9fPXE@|B7P@>eiiW|JrRhHESPQ4R!c=xZ1AW(Bp1>-`(3b z_&i)4&b>{z+UAWHKURmppnc`aJV?BP8L8O%bXoD=Di~qiY(lMH?rN_7d_k}OZfE4W zUi|UmCV#Tvmnh2D%1r-4v28^Z`}2j3(UcUw+od87D;-{a(*5qa+o<-Hf_?v{d+%=H zz!-B>#C>r^QTK_6<|E&yEu88h{7qEBtk)r?i3O(b@I0}E@jVJxUa=qh31+#Im}Gq` zYKH~wlZn>#Iczh1xPPvA9$Wb0PP`k=%1xNo=2aIzR%1*%KOWUMqxBx17VD~?;+7%iAtnXIYpzY1410@$)W zhPHtzo5k$g6$I|J?xZAcxpD6a=M@K(iKFcTgM6n6|HvM$G zn)MvxjOK$l5p*3s?xOHjf7bP)^KAECx3Q|t<=WSdacxuN(>lL(jWJw`X0@&Dh$5&& zLlKdImz|8(k<1wi9(I=uFzW=eiOopme4LJt&T3?}@-$m>iFko#;*HJJ+<*U8spo?= z(fsIC!|1PVp5b*2uJ&C2zVC>~XNqUT?;K*;Q0=RC%)DFg8E!MUiyx~ol3Y#(x9qIW zDd&3>G3~6Z>ucR=ZgaFYPMrtS_I0XVw544l&HL4*7T%Kui=df0J8yTH=rSMh0c)5w zG{(B@qwp}hDy>3ZH)`>ucgyjXYrD5J0&)?NHqJ-k@QW5>HOj!3^;NXPqdyKu~Sg6|cpPvx7~ zxT_rQ^>W?3+7jYYUMnm8tg}c&5s4oSp0{!D>0*_NloUVtOlNPhRqu6J&_=(r@}wAa zywa+4IVpv@_x18l@}1Am?^q)}gP7-SsB5;(?D$?q+9q3O8Y?afOpn2;RQYAuLP*|3 z|MD(iR-)15QnOtXVdk!h1LSv%&3aOLWDeS4V=@_>(h!~Vozjn@{OhMz&+r_^iVyq9 z>|V$0*r+d;zpr)kLp1d(U6uo!{%xgoTIzXw{DXUJfpwpJt@Ov&%YA%m%>BkO>_hf9 zv<_SGe$-C97|XV&xc|_Ob#IkI*r!nqqM6!#*s3Cis0z_cc{I%={vkiv$8hghlI}6J z?^q$KwdpbU-sm1LnlN)arG%GwCE5LKaie?+IR9UrJ&Z4zz#uLphXM>w}?Bp>b zx9!+o-OH#>KQ)cydw6mWZxytvxT)&R-IAZJJ@JFA;^w@J!-^U&mifHh_I=y+S7 zFY7cX=9#5!w3L?w4P9}5RP5_R>=zpot87*IJ7t3ABn=PF!9+@sb!0xLzD#r)$d~#k z)}py>7f#jmM?|Ms?q0{`7sc2^(K3xEMuOWM|L!j98C{YXJ2`;M3jELyXO!a+ZOM|kJA`E9!-lkGk#xn_Kp6WsM?A= zZN75xV|_@zVr8y+TQAF+#EHTgu9X#j{c0s1$$Q8gUhX|Sul96#R-)Y+w}8sx7gPcb z-|ZC?%#ISm=inzh!;r1o3sV^_)h5^;B0-b?!Ea$7r5p3V&{ud{+!3o}$I?^eIEsRb z%~Gub&*NM--&tS7hrGU1@LUqd{jM`DQ_LmtrN$l<~q#F``l-S7`6%5 zmMX)k)Do{g3;J^6S{;Sp+EOpr#gEm)i)-_h;r;RuI5_vb2&nd6$)KjmrUK=8RE?Ks zdGu+zACy0z++T^U>T@>=M!j9GNfeVT@AcEn}4^CVHwdH(D~wYm{xW1!N5*nq!^bx~^_W-=-zGJ*guc53HFsZj(8b zY;pP;AA>4%tOxc0>p(t)+FsPSL={Js^GWZDWTC&wLepns>~3qw4^J*Qv{a$fxSVxt zN=*FSt|!lfn_oZrT3JoQxTKGZRmBTu&Q&|>sq#&f9(m`RvL5Rxto8grk?>HFpC{Jk zz3z#ZAZ2!_Hd3y7VD^EO$=Oa-0vhjlrp6N@f)fhTk>R!&JS@@Lq;<;9!2+#2ma)7# zT5>!xiTJe2`DJ>mcK=9OGXRFDwcXOaQD)dCr0m~^l4 zmC(mLPGVN!ASF6yg2)quN;%8gein6u_YBq;8?(SZlPVkQP-Pub_HAk-CEMc5_jQe4 zX@P#p>g1)34l_i5>WB>5Jh`W|C&NBo2%a};i+o41c|2-7a`6Xy5B|qWVa?F^$4I#; zbA5d6CR7a%n0{jFl?%?h-dZ1i;?Q>W2gMT2iO~0sen(k}Ip12Ay6i-}@3^4uy`#^5 z`X2NZ8Jmi7>L!V17vB(MI}a9rt&G|nEPlIu`}^fvZ{6q3ZI9fG<=r<68&^5-W{2dd zAqa8yfxm2WdUB5~`@moGRV0Ts&CBL#hx6Y$hphZkGp23O%Yey49( zRamT*!`}=Gtm(txZ}KF?YI%mfk2ZM&DsNoIRHG`KkEv$nEyZ8)!Kuz;AC77}94jM` zkrXfNkMV**_CdLpqVYu2*)dfIpa>@>!q^AFV4XcwMU){nRONmh{`PHZ<8RyZXimt- z5cvX4&5vQ5V5q&^d!q1hanGGBE59e_Bf2(TU_YV%$fgwcKuZ!+gTJ$sT5VdFLC$(J zo2H*REUKojgNU2z=hPWIv_fIcHvfV>T9i>N%B;#^uT#%>5Ym@y8?4{HjQ5*k*p)ew zc=Pxa<98O}ZhqQrjX53ZWag@8{X^QjN8i8ynN1N(i9)BvrG7?lDQ@Rn4{FUX^)A3! zzM523Xhj3z8g-3e(|DIZ$tGaenfsU-rpyw>qA9Q}KBE)W6>hr!bgoZN$f@%#YhIg{ zta<1|&lTrnj+h<8*=N@Xe|MEx=HJ+xB7zfrWw&98!Z&xZKV?qhVcB!c%XK(*wdPlQ z{XwnyrJ7XDJxS)_E<61uTPwJbEAXw%&VB6mS1bRd^yk&e|ETP4a_rO;&yKZB#lMU; z)N@6@$S&XZXg*aesD0Z|&y{{;3Dy|R`94mT6o%s8q4#c?JypGHV;?6D$^v3HCF)@n zXZb1FM51x+WOiLD30n#?7te@wy2Af7R=YZ73k!B<`=kAnxAbH-x4KoVX4&plQQX9> z;^9mmQ7tYfx2j{%+aAjzH}o%62AiE~KXfeGH+upH_8Z?lPQ?~B4tNl5vHLjEu z)`$C6`!hA}xiduRquX(cLqwiywSi09)fZ9UyqG&~pOD!a=*Ftuf z){8w~r_t?$Tdnh{K8_mIwk*R#;Ojo}41*tulNhQpk2cco9!*7TZuhXTsNL4K6IiG(S8MxfZSQMs&()>(x3(XCJJksk*UKst5!;Tt*uR|` z|0Q2wzL&oJN#`HD*TvMYi??_@xzmS58<}sV_8x#M=5%GHCcpm5N?jL8@kSS0`+m_L zA<_28iSyMm%xOR0C`!S@6=T6?+4Hnzmg>+C+s7D*3sqe}w6Qu4dVlEeqVIVxF_`>X zyxVjnDvSsU?|IFur$@9ZesL8FWNs${iAE(FZvIIo%e<|94z%a!duUUH1%KSrB@Xzh zl8daerK*NcmfyU3((S@;m*_`vc%B?Hvg_&pX(sflW$as9=U7+IWaiy^pNqblMuSoD zM6F<{iECXQDc*}j%gDE*8;ZlAAkuny$3+8EY@_f}X%j=si|f8dOZ2x`vvoBD*F{+L zZCauTnki-pMN$lez8%g!e$_IW|;Get*$!)$1Qs+O9(>EWExV5EdE8dqjuWHV_-I`dP%TIMt!$$Aoxa(7eB|9sCr$vl% zJO}eVExRLW)dezNdn|>6=5x+@O4h(|Hs{n7NE$56dKC?1eI}kIHCxPP%68_qm?EoN z?30Kn{+Q|$n3Gunmru*i`sUFa-3qJm)Ah5fwRRG-B3gKU?s}aKH@4(e^zZXuC$?wo zzn+Jsbqs<#>!a1$SPDVK5b9kFc2A0}c=SKiX6X2a%?X}D3TiG{`KCHf!cu|5G=f~Bt-g;Sa zb*bJOMZmveKj*R3D`dSwR(4*iDoHZdmLjX@*~brAA0~Abnu>;n6Edo5e9JO>zp{yk z1x+tbUF})u$%>sn#o8;DI*qTc^Qvdwj}l95N10FU{fEJG^--6#dl6Y`FWs-^cX8Ig z`oQtVyi?Y2nAp3;#=Ubt4{p8=uwP%+SQEIc5tqxjD{TuF(pml7?@5~!){3VWm(NnM z=_=;3*1LbyVlFSEEgr@uife@Hn^tN3%?j2*K4KD z>%-&YI&U;)+sDPb5w8`Eb(+UXhvgG-9e;_uGyaCeO-Ik=MWMg)n8+cNrzXCdZ{H_G zBlE5BQDBu-TitgZ2dXK%V5qWe!r&!dF1dWXfu4UiRkk9&S+}lIVOx=vcR&S~8|R!z z&oI=^x!?G*SuqdTx$#|v?9oj5k1y5s}`^xWMhvN+12(e z;kh(^c@i?3J;S&?D)Pvgpct#4L`RmHVOCN7Wk-8b9%svt`cZJnMFQ zrk*V${Jrug^K|OjYU>P-k~i#7XuaM?77Tv4@{or3vLD?cS;D+skaoJl?d+-Fz+Y`8 z%dkzhu=v#EZu16PQSw;e1m7>;F0WdU10wV4SaEYu_+~j#SXGRB_dl^I^C8{2ni_3na*>9uN?saj+8 zU_4OIyTeuHU27){LB5;yBQ7U60P8Go^u9a5GbEPbVclM`GOy3)GQoYtAFbu9ySHn{!TIaFqky;JN{xR--OdiLi zzuQ|prHD8EEH*uD1Ig;A!0g83n;L!Pg>;Z+>fzv`#8o^y&qFO_RWu;8VhY23EU za$0PUTlK83TOEph;Yd}l)c2x}s!3>Fe!IN-t%7jI<(cw-qVVC~jq+OmyHQxhzh$TH z$dcY}lRsNfQ1w|6PHORI9G)t_)%s%XT3_2gH%7-{#mBiB0O3GpOkIJ?FtKf^TVX68 z>q;+;=exBB8QFYrE)h7XCL_8OW5hf#5c3<(;2tc;WTwj}7N=v?%+F6>S_eeMF9>tF zGpi~y&3s(S6JcDf22lHQxPv7N9ny-h5*3^{G`m=Gz+o&L5!Go_U>CGBR>qnAEFavc z&gF^IHZ9?a_E?@BR<|8?Jpb4mT9SG`BE2wVyLe*xFyd4M%ic|;&=#{5=S@|soT>Nl zRQy_!Th+$g&vZR`9?X2EL}_ow%%vxlZO6*ZHNVHFAuK`GFyI=CNheI@g2Z3$ZhyCt zmHK7wiX5eAo|HXoxLWZPwIbMM5Ees^sww^kHxSuu#lu~3*`geAE9;X6N{^zuB`3iB z=kd)YRn-#b4_9&Ce(%|2e_!NTXRmcT4Mw}lZo`O7~3U?npC;aZ1F8BX;CQ^Hmww%6A;T(%NLP(zWi)i*@OoY_^azTv5Z zS1S?kVpEUTdOMb|`UN0*>oZd;(B0b^FR{e=KaYz|m7UE zL+qrhb$C(`$=P$uR@6nU!*Nva)hav>FI~DH_7*>NVgJnZY8_6M(#yFHrx~D!UWu2- zKBqTFO>cX4t`~0oeqq=(N^@5Q^L$qM_7e!(wz;fgd^Z;Q{v-4GZ$x**_dQiVS=egE zv*BGyrJ^{oxM@*TO+Ht(Ic15OiOGMCKUd5W6;3vu@4?CD*yvv=nsa{RTR#?GhyA7Y zO=4z-ejJ_|(UCl|B3F1zsNsEUYQ)p6a+Xp0w%rmINAnXmELw*3(Mb5|Z8PQ98hdlZ0 z6P68&g=dj{B38pZH0#(gEUGb{@1|C_quA9U5m|D6h5N9zNZu>4K8HZvZPi6C3kT(a zyIpoObxGgs&I^09n|afm&P~{Bby3Cl&qqbRz*I4Lyz1jsq4pXKVxv3hE%lq&K(1Ej zOcXoxwHmBv=<8?kBC*fKm_Y2<&-3``vYbwPf*oqNdL--6w=&lL{i*@%ip13_2y<9! zrHe08{YpIrJKxC&!NlNZ53JcbqGq#ynn7aVMOTV06DcZsQcXITS1~;K2*K$#f{pQb z+NLE@N)T0hv`wtRxJ}|ba*_-7Y%ZFO$%ab&o0$pOVR6(Z?GoLjPO1Cr7g4VEns%F} zxkbxQ&|aqtJe>Htt;Wb@!PgH9s;;m3e1)k_v8tz?FR}6AJG6`LIn;+YvDztOTF=8c z_*ARCLR4&BPqs2OA9X~OD+t)O{YDokqI|4HsTmIrD zsy(|8o1ZNuoFJ> z*-6)`kGpZ)r_G<}&8aT32_0{gXS!C#-M>$EPmaqaN@<9a+Em|Bec{=XJ9b>!r7h#g z6>$Om2(8xu*vpuf2pIAFtW;H-&ATOMxn+E04T%PihCZ~S#nZCy@lbX$`$9Z!&G=6B zQ8u%CBqz+Za(`IWGRLvhFkO6biWJk__Ezh@aKCkJHmcvmzfb^c9-GVxnNT9z^_6#r zZ4>>Dd3uk9Pc6Vt*=5>eCejF!k3=)@EqWv8|H3oY*3;!$47J_1DHqkcoH*X*uPx+U z_lZNZ(N9XBJyXys)r@6WVjp^vxBR2d3jUzHW-b2U^yg21?(~;Ve{lM@PJgBR^v_R! z?bMa4nA*xmI#0#?8{HT|+-J&4Fh15AB#!mb_V(ZCc;-h1`#s@0{KZA`>W-340qj`CT-M)ps8)--yuHCL-6OyH-1oB(#JORYlMEso|1=Wt?G^8 z8i6mY(CDyy%{lpz3Y#oLNTAo{7upS~4rukk`ov*sgLRYM-ame;NC*w}&|G$VqqO+N zl0Wxq`P8+7%dd8|_M&YtI9FDusl=_cM8qxNuDU60v6dH*i<2zOakY^PQAW6x8{ zsgbJQuZ|4`C)u7902X&n-OQQZ@SLJkV>0NA)&zYAVyPyRO8m)%Ul)%%)(84ln2D>c zm_{P7(aj&beTyGZnp4+b{0By0F5(6D9J!_R46UdcTD%6hg#RfCi9U-i(mENydh4To zvkN5JciiITSQ^H^J?{QtT!F8Ye!E-t)IV^a$yP2|Jubtj8mrvOi;a0%*WdNRjE;}` z`TH=hLd-aShAp~Uk&p6=Nt*KAuEiuCopP(&-OR|Mmsg1lJ04aBkAI&K{QO&gULWIW}(FD!A6Q z7f;4)+E&5pHTz=t(H}(buGY^xKf|Y>h^OEy=f~5sA;TB9i(%ngyhX8wlWprAtlcM5 z>rM17j}vZ+llcTc4U5>5$AYLFVV??3?-7jOaSobg9z0!`{f*MIw2D{> z0u#+ZO{3kU&Oxg#N=vtHwW+PXwAvKiNF5iRyI8ivdB>8hF&LC1wGm_S(4u${wa~m} z6VPYUK5AmFPCN(JsYm9jFRY+eHJMdAA?xI#vjR8S36It~4l5bfXxYR{hBNVM9bc_u z`-*kk(p(R@j?cr1wyU7)t8|_neWUDO!&*o!uhLnm3U#~e?RQG0sE>ALFvD*dS6o`B zPiAi(uI72XrTUlK@uYNeoFcka{3WY9h?=>n_kj~oi1>^|1X3x(YABNQE?Su##$W0? zMnieR4HLI`(s921Ym=!*5KY>QoyT0NXZ?ly%A}|370KFjXGit@=##D*vlx3>|DEd@ zO#Mc4ZG9|Ld#@LVWY@+(rk)o1oj4zC5-;FWF)reNuu}{Y^TaJ(p$gG3JB;3Eblt;v zxA*$7QrY)WZBd)OMDZPSGF&n7%I4s7_L)(%OVOw155JLTPpwh^YfCDQVnP05VQSOh zG!$_frn~F8cAKW&qZ-N7y1wN((h6R!)$0$Zb=F>gwAXYHFaCz1M`kmNsVl6m*^?P- zI+%O4rsHF*vnx9ylzRNubggc3-W9!^&775*De(%Jx#wXtUnt7Vc1APLODiKI@z>R_ zDl6!tHTq4h#rxf^B|Nrbfz;V_5{6iydj%_}b$WN0y5-+9Th72(>4A zm}o^x#*n|P&%x=j;pr`$slFedu^v1hzGgPB=S;2W6nYwFs@GFPa#fep=f*~qKAu3i z63K#R;kdYzm=xY*eqQVX;}r{DxmNfHMQObM+o#%^Pxh$3MN9D2yuj@+JTY8)cF5Q< zKwjYF7+`g-!u>FJ?Vw+ImoM9l!@}rC+9~!(eva07&Aezu6Rqb=(V?cFnewKJvD0t4 zSmyLNu6n*?b71MJf4R(vL~)pREnBI-V!tb25sS9WeYO8RU6 z3ezxSc_~}!Bj2hXc$!LYfEi7ir7^X4H(-yUv(=?92Gnq&B3Z6T&WXPIu zZhv_RWzTuaWN6}k+JU9xiGIhV;_IWtX}`E;@pL|~Pg<;L%7BusF;$MD9}Z*c^28VI zE35t8)|noam3_LwT^fQh(?S z>~Jh6@!29z<^Qwgv)3e-JrO4-<^FRtp(XjNsRfWYNDs!stPWH7toxjNU5NcIGfbcd3-qzR)2Z1 z&@OD`o%HnCk~#Rf{H~A7r-!v-JnQgm0E+kZa?dyKXWGdVm3i@DXLa9QnWvP< z&Cj!J|7bI5dOr_$&9(8wLnPwq7Hwg75lN87ElPlbpKqbOR2 zCN63rb}Q>L)^#fyYm<*5=%SV3)4R4Z*|^$3#hK>Gv6sz8oCT9%6Jtc?q`gq(qs&L1 zuAERP8b!Xj-P6xGr7accrhA1}uJbxzQ>{--E$+(8_u+F`;@jPIhgl!5mXYO2y57yX zcC`J&uy1UuI@@OSQE@85JleZPWw~RkgNhb!U9f44J&E^bF;J{n9wPMEDXBL=wM!K# zdA*4Qv`;`N{%fz=LlPetU*ln{4$p)MtYY|fKlHlYqN05NzPq;%L*I%g&R!K(D)aNXtHW9$l& z@<1i3G!YQ6)$56hO+18EDmug!UKc0At0Bgswr&63r#@C^xiWKBkYlsYzP?`(_`I@bWTC3gWEILI zn9f@B+Psx(5jLnCaz)15onglj#R*O7i7rXx)PPw$YZTMuZ$T&}n zsH^?r5VMX#k1y>Qrxw0Ixm2a0?<6aDxVN#qjTPL3iorrYYOmxZV7r&!s~X{I>NdTW zB~R0aIquZPmvtE-eTyDP#C)7M8RNZFRoky>vh;P>`UoXlid-u)q zZO@l~#Wvi#Z&T)J#P0X?{9h`+B^KaTch!;@hUzyTv&tx!!_~hJ<&v+TBE~1e-qxQ( z>n{3@3`EwO8Vj^0HlFw+8W(>n-+|w}$C~H=kF`iY<8P*0@-n#p96Nkzg}h$5+$GEK z|52_^L5FF0sMa zp=DTQZ1DZF%J@OyrFA$x?;z_~uX*Rc_epUQu2gc<9XRgvx6v;;Nbp_${E%`GD^ zY?ED`M@S_?F-We`DroD8%}D-zSJ8a!3i?5Ol#J~3g}RW?c6mjc%g-(EbbRfT?j)HZ zyF4ovEI+s^s3L|^e**9H+s(o?#kam)qCa_@?;d@o>-+OC&{s=j)piE@Qu*!=%J*){ z)Lgx0jH4x63*GTX&HK|+a+2<%ch(YqTWiEX)5Ve8wpgzXqD^M}2d8W^h#u8+Pk_dKhjo|DR#UnUW?^NSIhgU=4j5cZR4k*KeTMxeIVk4^2{ER zA#RIS*%uz}nhzMy!mj80REw>y%7+CPcaK-OLdGj(#2@V<=SN0SWK%S~Eb)DJishUHyR5bsO1*%m3*X>}Jt;eJn=#Ih=WAU#wxrK< z(y^!#F%zqmH?(V8{>Y~Dlkf|512GAmcF8wZf9VpJv)&a=o{An2kKFMS;VN zPt)+4o=L1l_OD^@iwDw^zTY1fvU(0)qopRAqjEqqB=xKkV}#Kgw~Sis)#-Xq&Bo!A zPHQn@tZaGN&3N8;mf*D59Q&LtD`vzeavB~FQ+&pJ@O%YwSNy~p!R%ZgPZNJ?3zrUA zgKe%_|2V9p*kK~T<||W6*O8iTSL^6%9reoe+hq@XyW5o?mHlYw^P*Gt`@?#l*SvMK z?y8qMc98g$vEI9WhZ z_*64}^z63bx?Z)K*4u4;&!lD-?WD$HPjfk1+y;Uy(G@o{fwoWj%4$0)n&Y8$%1!IK zRgdRUWjFh)$Tf%EobQYYw#7crnBesppGj)$Wmi|7OOA!u2QhLqd+!dFe|Dlw;N)%4 z{l!Z-SAv!wVv07m(aWJKPP5qY1Ug`vrA0TMe(5X;AM># z*hS?M6(yR5_rm!h<55%DwfaE#HpKiH3%;`C+88JCImR-1;v#|gfV?91%805UIKO_^ zqsfC>`NfAs%cVT1&ZBt49=|ou8_h3xwdSwZ{4!tedX5AGr!gs4tNt?V^og*DXLuOH zd|1^td+cuhtcuWAJN-$A)DJd-<7(AE-28rdT>e<;I4L&BJUyhHwY17L;LeA|o*JJP zbhYYxEAzp}ZC$2S{~*0R*N$E-R$f-X;k`Y(=O^*{^o)L)$Gfh)huBalb197PISJLTtJEO}8sJpD(f*yb+rnkv!!R8SxjH-d_6okQ;&}v8=1>FuU9ThvRhKW zN~HVj>H7o}X@Me$;v5(bv^i>-|o(dZiepwr_4# zFsnL_$Of0>_pWvae!I>lFyt$qT3G&f}>zVm5RoL8rriiw$9#yAt9cU(?J zyjc(@6*yq%Q|0f=s*mT$IhNf)C;B*+a(Hwh>R2%kPyxb_nx* z`l)qM?NclML80U`rR{L)tRR?H`dKWYpUrJ`aaU0+nE6uaJ)eBH^xnPh>RSc-zSXUW zhY36Pr^3$1&N*7_I{b7_MRLzqqpKcm{9GD?hTEo>u$e0a-OpY(##zb&60~7tIL5{52~`}<+WE?TvpO~D=f`NtnK*#>lhcmPFAK`Mm?8UhF;ZL ziYNT?Tde9+WB0hcT>0Q$Fuhv5H_Ph~pTXx^Q9c5?DRpT0!Pn8;#&z7B*2QGVM%j(Nj-e>ta&vo?#)mO{wpOo+MO*xC} zPSNf@DmEf7O`dS9`0rx#E%&@u3u9>Qd6IGVOUTi z!#S@rXF$;X)hG17^8|iR`JXRLg-2O=PnD~A6L@@O;^8^&pkg78Gf(|r>X}W(dF4|* zb$si^kUhYp6a+*o^TjnJ$`STMWN34@cY(zWzUM2;pOs8PnOfw)YpHq{L8jG zF8#!_!h^7?tG8ldR1TF3$=lL@=G$cse*V6az!QUA^1q53VZ-~4CrK4cKk?r<8{xFP zCr^^K&p*%dcb0?-m^_(dzofQNxyLmm`nJU@dt64^_og?8zJgYpXas!tdc$ly8O=eS zRc%QfR8Phq8;_M&-BSzA$FxBmb-AB1dDYQWf7Kl4v7PUo?R^#E3R=F3Zx{UeusrRs z22cMfKeawJ^>930=Ec+HK4;}lyrR=j9Wr}ssqffHI8Kx1_2BhK6bXKyJuF|mh8fyY# zz+-E}$uEhbf#h-zVT1cuTa}%9=YF-_`dW=wT#C=!ENZN=isNkQeM04b$A8=VV7N2wO)uIn$dmo;BR z6=kDB6*-9?9F+zW`wz6UD_HFvF*4Q)J zPdY`xCklJ|=;+7GXNUgYCkjq@b$XXod`kq^cRtm|hnnQ!y}s-4?YQ(7@5R$)RnQ4P zDA*-}Ba-baeWcOZ4HtI{iNjX8!A+ z`r6I^_iI1(>JxAIN9;deM^D zxETeX%}Nz$)VYD(Fx;+TA2(BTdb=HE+NSRop1v+x=eWcdvXeh5xOBH5SM@>;k+!n^ zDZ0OM^h)`5tYP(AFAkfZC{I5;CEH2UpLBh^3rbcC`lZsd+fTk;<&eAZ%;ma3&6pX+ zna#t<+P0xO(EC!pRA!Jfugo*i*5g?UbIdomhcQM2h<)gFeqjv3oV7B|VV)}7GiTL@ zp|HPjQTN|JN@@cHOI?MzC|P@E9lspD&su-A%=%iDF1wc2%x9fLY^nFoj9c#&ZrRIF z171dniGO{#vl&Y@l$;HzW|Fu;qvCf+uM#u~u1 zMQyZfwJ0&<_FCto*l||(>Tqfb71WPKpUPiRnV=x8$@9`PV&{lmuuEg`;o9c;`cp2a zIJe4PTm3M#Rh=VnKZlCD^?>Q_w;3+6-_ zn#Y-HzwC+zQ0EE_J}CPzE>U~4$G0mq7;~#DG{BK@_={i%v>ChhMX`hIVpr_o3J-?f zfg0B~z>Ymxw5Hf{1kt7K$vf;q4LtQ*1puSU6vWNOXOGONt=|ZrBNS!&J`to z|17IoT-v!ix2mJiGm#~gz1fs3BpTt=`$8$F?Z=m5tc*c4exv1#K{g2eoOa`V-Wb=@ zdDtvD^U;jpT^e(QmM&H2SKp$?nOjZs!lF@%z&tL#YBTKuFZ3Q5~>D_2NbtL{YKy=cv9zr2)x76P8n1HejruBg4w9~4c`lh2Bm zis+ZGIXo3}nLnWNqA@!an-G71JpQTQiY^>aRXlL?e-=EIl?RRw6~p1J5>4Q>Xts$x z5V=Ngro>`ICuPLuu+xiE0B@8yy_VOsqDB9H#z70lcK$rCX&r-?N>97jGOsC1Am@WS zA0a${Xh-mF8w1`@x<4MP_wiEf)F@%@d_Z(}egS`YbE3)^>74eW(#||~I&D*%owh5r z;Mv;ZUp`%ZJ8Tm_uxO^79pM_B+Ke)n*g;-16ZwD5IQ9@bipPY1nE%22(@wLm#ki-Q zfa>w&!J2+zoflxrO&_#}bblDREu-W7_WM5aHy%%{+|80t6wc7Y%#!Ns5Us|!PSMa> z9Y#*8vGe576+Qn$165@9yU3SpUWTI2rGMuf;t@w){tFirh*qT&_ zw|IMulASTHI^Q?Ts)iw{!6eW4t@7FLbgMiyPd_N=apyi>OmQ!jO;^A9#{F7=Un_S` z-Kc48QyG45c2)n5JG7a8*DiQjZLyb+ezL5XZR%yKuK#`!@jU8g*8HKWox(1dl?c(P zy2;BcOZ2INZ}OU>nI+afeWF*>iWp#%kYYW-e7YFMhNRhmDCm8{eOQf2ua_9(Vj8Z0J=Ke7WG;aajX$ z-tb0|x_uStuaw{3F7K(WkXNS&_;8`^Hp~9-XuGRt9@6$4tB>EA$3H7p)D=GVBVGL3 zo##hdV)=)ii?M=(t3I9W%4mO7nHp$7X2_^xTSpdTIX*m_U&2GN`GrX{TDku>)nF=_d2cNqXTH4 z!zY`Ih|xVoQ`hP&%NXY{bCDi*r|fqAep2?m#IvPNPoL$iz7|gf%U&D^q!{XE(Bdw^pgBjaW|=)CB{kAOmd{%e~#6ER;ugBzNbUwGwZ9x z*8C;aVtsSpdvm-{%TO{sG~ePMR;g*n^<4Z2JiO>vbA-fqtwtLy*HYtAI&W6+#gE>+ z^|Q>MU`=CTV(sM69C8JnM>DII^=_Kk#gEn1O8c=czUOmY?Qa>-^-MOk!2O={fog8_ zW%eCxi|RYPrL~W!zsJ*uur%r~wez6iYL?^v`NVn9ul|*B~ z;J{P$|F4%yc>a2K7w@Qyh3jROpOruE(bkZhcuAvG{m)fxkLdU+HK^_u+oOH;D_uMa z3*~nA)4g(Eu_-SVug{z1)qCAHEsZBhmP@UGB7Rc#POUQT*dU0NmO2o-@7E>Z0T7@Ds);18L3V~JYff5n_hFywS-pqJ>T8iX zayn8&iJw|UC($J`$5W%*iA?<0vUGT>ouQn1pghQ916br zzE8zOHnXc_WT-})>>@2-TZ=W4#}VJU_@Y!=l)a*ksyeCqq4k`rl@nsSrgrE!zvFQB z)8nvu!WZH-oU1?7XsgYuXWdmV71WN_xMXDw>#Pm2-@VplSY7TFxVc5`{Hn)orCQt7 z-r8<|*>i6d_3h@-XUd#-s_f5DP2$1#$yU?zd%nx`lU^@{l0yn1|GwzVZt89oOm%>Tn4A#58(K zJ!`v~>_IVEVnNc-kRsQqmz}zt z?<_%4h{+%BJXZ>HPPe|h1`mI5`cFz-^B)x4`7mr>ovXrEbmQCH6xH9q zZxq_Pla}>}yAJ(^^K3c#UHn*$t+(@g`-3X*d(}3)I8+g_B)Vxkru^#Z-#7=Ryj0Kx zro2$HmCgD#rl>LgL8lO9WwcHSTfJsqm{Oy>qdoMq_xzZW+TYGFfDx@-nvP&McB+Z1 zX$kgcSF`<9{=lW|dC-PuTwFYB-B0TJyP7g#CLIz}aL(15D4VqGiYe#X>w&zKw2kGI~;cg|3&~BlYa4IJk``qw-Ll?1kYwsaS5Fm^HYa ztMwA~Y87MZlTNvgPkpca@r{stjC+SvgLY#_FBTO0PGK21h!fxSOzJIr?jMwjSPNoYZPkc`H|27h0 zS59ZV)7`brtyZtutdrj;T<)yQvG@UoIhdY$DT+pe9NVQ%yt0prpIP<(pC3gj*>WbM z)~4r%s~U1TO~&f>1XeOTfL$Oe0cPQ4(3J&bMavIOO&bWB6QeLVI;vhd1T&-Xv0Lmj zb90JrlxKah?3=HaPxUHa>?hCJTd1%?`-6JBDdkrEd-vz^-7=qfKcEe(D-}<}`G&pE zrqav4pYp7~>uCpiG*y&Xow2%d4nj^q@LuqVw$0{j=WORp#380m^|yM48+@;$IDAf; zxOri()F!P;{if`ztZ7eSE_fd@LtuGnc4l@ayV&od)V5(`?AHfz%2sbVo)u4+)3QD) zn8cF2URL{^qn|E6zg=E4e|E7EYXlAN#`g1Eo+{`mLh}9YNopisi`~_TN*dtJ4$Y$m zdd@LQ?GhOoZGC8;%)_SI-eF{9AN|P6vpVpwC?%_$gIA9d279m!a~wudTX_E1GU6xW z$@97u;S=_9o;}rxF+fZOZX5=k!h#dMH5Z*~&-8Yor|U6k`hNBZSB(*BI4-NcyrIHW z@0hu_-s8XrI>oY!AFDBc+MnHMK20&`?ZO=1F1VB9*6cHKLDTES^5Za`@YpakNu8ku<2Q3sby}bz*X!O*l2JaCtBBF`0-!Hn>3m=t#H zH#OJIFS>lo&OD^W7&~@*{Pp9qdSZWJ()(OJY^C_q@D(#?ymx!Gt@#c)drPsoT1Qvw z=<@AC)k?RQ_w#zY_jvOzR9VXSs`JO;)H~xpo4hHPdj$@8{X0i@sR+1r;o6Qk$(0Irw@F^n+qw+$?&vU1=#($1&N`$qKBIz7#8Kh#wXI z=@DQbOg&nq2n4E`?;o;8u{1O&oC>Fpvc~%7k>)wB|6`8)LaxOcpDRB{*%TAPKZKE` zeTRwkt#vzBy*2AG^2Op=ezrT~^@Y+3yg2>evvdlgp05fy#;gTnw!zBjM`cwj81jvF zl!-p$KVcEIm^*%s0b||blrUkMB^Djukbh;Vx(+YG<5@=T##7{dS~FJ6=QoGBx1W_S zhqo#*K2!FNxAPQH#yv;o0re=1o{b?YnZBf7ad|T=b?1#B%fxdgUb+3OQ!i20?{FN4 zZ9KFG`(~#l-tOWH?{+h!g=qie^j{QB;pZ>J&y)VB5fQuMS)b4Fe8DpL5~^3dJ;*da zDXU?#uV;vw`@zF_cB);zZ#=~R*{Hm$Eh`$fv4qX+Tp1l67V?|(=VCSS(z2|BiJls- zG~cPFe5CQR9!|NiZ>;VZo0N+l5665kqx^Q!&FxA3br4e&h4;spxVr@gJw*N|i(!f} zlqH&wk%}^4MB-Vd1c-C`a_L*Um9Y_#m($sJe`wql52+rWbBGny6Yad~A$CuBojuct z`^FmUFx)#S5oUq$hQg3jewv-sp6)sQWDoV5cnbR@J)ZB!wLJg!URu}mIS;91EaP=k z1l&b6ty=oo(d%Vi4LvHYDi~@g{+s(=_P4rfNAGkqvCYj6jb+29omUydYzVLGxx+k0 zSNo~${}D?9i_A*%?4+B?GSEJM|8%@W4D#?~l~rWoosP#eC#uk7%|`pZ{hOBvldx~Q zyQspPM}G(mi~lG7`?>m2-!t_Lw3hn1?kb}Z3t&E)4Q<4F-^}0jzMz)XE2hA%0MqOx z<53f@rMGFOJbU3v(9KWrHM@r>1FS0h&U57zyf0DA&y@FYbc}L}CRM-P+@iTw?}JCj zmgfo5;-;5X7p^nt(O%iXy?A!TEzD80`kuL3*%;;3%5M9Vr?_@mS(1ufFLt?S-ze-w z{akzWaZ!)d4^c1o>GH~*?j7|UPs%Hs?aDVlbA0qmul;*}=zFKPPk+PPPrT(5+j-de zbu;R;@7mSQyjEKI-SYWF1K|>)fpP|e`|itbtbA)6H9U`XZSvWP#?2|+_{KC>gT;|N zG`>_Snusv=Ae}=@4bJ909y3vI?&n_`jx3Gmjzo&7Ol}X;D~I4*$yAHpwOmJg{nLoR z%!X<)uIgy(GJIEk8|<*w=?lH}>68%mt?wFIYHj7};zwv~Rh~c6W?L*Y1~=8l>Zi=5 z%Z!e=@hxAD2roK z_4sX}Z?YPaMZzCPYmUM-2TPZqosg)ksAx;9`gK(f>P+e1U$4>4L()11*}K{~QEz6Skmw-dJ*916FW4}{IbB>Ny_@_Vl08#1=5xG?lh4AFGj zrbh!&VXC>^>V;`kd9*z^zk2=Q(NrY_%#C$^eDp^7|88Nb{!MntDjR*hu-5m>C)857 zUG^?#=9ouQoP4A3LX{7&i%k~x8|7~I%3aj5J1(E`z4_+0FJ%4oV@rECzS%2!%kXi? zG(E|8x^_heNaojP%Zf^0)od_&u9)ZKu1v8Lo52IDCu{&hicP^`5=ZJ^)zx@4Agb$O zu{DkrvDSHSWw+-3bFg!1m4rSQZ#7%dns+a=>76pV!#s+oOBUYCO*Rw zd7AC9?{!b#w%WgZ^w}~Z#-V3Qc)xzeg4kQ*QPTVT`&O-N+VK92OLkb}VQ+Vp5iyI{ zvPQ=LiLi?I^l(;Z?*V~3!*#ds)t-H0_tk#A*toBC3dQTC$6qd^@kaUowX#P1D~B6r zU1pPFrqBt-8iAAY`Qci_TA^8LdSR`;jn#(hvPKgVXZ1tq#4fV4v*xT|sN<9KZBkaq zytaP5Tvrj|*3tLNPL)_qc@ATH^-;o=*xcsp7=<1-T$!>6syn<8a}x_`I3w*pIRn`_ z$#xrP5v@OSlV)W6*BiDo#Aejha}=rUKo-;G6F1g?C3A+A7i zv0ipuwzOUzj$$efNbv6%IwDk&C zE)rLkMYvJh)h*y@=)JOh6zsj!6Me7PfGUNGmHk%v!zxS_&X(WyAC-9EA9i)D{{HD- zD3$V#kN$Y675X!$ua+92|Kju?p8omMzghm8!>jh=%jKS9+wnX;+-qfaQ?Z{bw!;hM zf1H*!;hWov+_loaZI!Vu%BP#^au6?m(W*MlvphHXbY+pU1Y&PY_k?PvKob@VHc7!@ zMPMe;(do@trFtW=E@^PAA_{Ymg#CHAItuBbcsO8U?IC=9on@IhVP~K~z{)xws!#Xj z!v0<@bKRbq^HOugm}z3#-s!(JcF5hXs_u5X41@D0S;$ix5|Z0x6Hkqyh;d7%IIlVz zQpBQB2&07Mw10nC_@d+36ZC-uBq#S7N!wBp<(I?Cb zPn_y5<__L#uVQ&>hZ#r3nDVf;Z{mrfH+^*US%l&f`DSq+0&grwabM2S4hY-FLQCFgn?-(ld9;D)^*4T@^*l$*;RfJEQjS2`{~?sQ-b0M<50PvWe)4M3Zfh=ur|WgN+H?K;{2I~K#t1r3m#cTo z8d+|UU-VdwncjE1H9@}~?g_D{$Jd@elBU)=eHd!id{X-4g|hyKwNcN5qA$$Kt~l$y zar;T4@+#gb(R*+wb9~bYIn%o?!P{8vk_53`XzPW!O;wp+B`FQKojjWI^IB3|M(nUj4HTVh|e3eV%2 z81k7bJlGWv+RWw(59B#QxW^L@AV<{pF?y`}6RyzU(P9TzXmG_2rcnzO4O$%Jka)1n z55OAxPO$?%TmBbK8mp(J@BeZ+@$1V!`r?m%P)-B;xtTitRQsxDRq!I6l<#aS@~h`i zwDqp%ilwF={YTxCtAd)G30V~%bru|3EZ?!ohFkrvvHiAdHPSxY8#C{%lzB?jCLJGx zXK5u8CovsEJ1$;5{@JLvt`$|Fq6DRu@=UE49iF%ZIutfd)yK23>D2OO6Y9Z3*m2SE z^;1sknPbP*s%1TI`|V}cvT9y0R-3$&Z`>d8s_RcbQSG`^g^L|Lw(O{IP`!Vqb=KW* zK8O2UFHiD(_Y_0rr)>+-2-(UkqUlJAiZ*&i#R$^X#RADO;eTPV#rjqsgkQJT5%n%5 zp8aHuSyXJ;F)wLZcheTN+1xZXBynqImZwfsz;I^9iuF`l#P*E+CgzMf8Viqq%IA5! zS+T6}v_rgsxHI-3U&HG7WQ62UQIgfynP2It@0nd|DWpB)U0}VRx5alecbDmVcIGIjA^>9-4oA&S&5O#f z>nEBk-w>_K4qq$RB|gYr5U+3I3i)is_u9=xceQn`oc*!6MOQn(>Ta^X9bmoP5RHDk zW3O5cVK4hSEqouA!}-x)TtLk`ZTZ755Bfh_*o5<5_@3e6(4W0&4}iJ2q9~tLlv}nF z)I6zi{vF21s|>GkrSV>XfkkD9Dq@!PctviX_q3|^kTZzL-uHve;y4}-L{nVB1d&a51dVG~pX-9(2 z+Y9Q5?6MbNwo&9^cvkjsFAxQuNL>*Gu$~o{@na`o%d9sem0V_5V7IIXBjqzb>D9T` zK;2vW7G3QH7q=Iz%K?miA|~j##NQ-Z-wb~cJHgMCwS1?nYv13}js9|}5c{h$^`i5{ zebySW;c{(VX;{6rZ8yA7+VVlc^W(Bka@wGFEmeiGdZ*k!>^7RmepMkJcxzjPAUyZf zL-g<}Rv*O&BCyc?4VM&w$3Gm~8d8WtO1>ALKMesR!8>KBxPL`$^Y6}m-*tUWjF#7T z&l`-tySJFvV}4&lXN>2bvPb>?I{V)KE4^k96;aPSJ=H(pu70K9L1n&eR+;$DC_stm z^m}6a=^}KJ`1dh+s-FMt(qq*Edzf>QUvw6GfPFpdWjI$7_vy)evzU;~7T?ZJ#0&m^ z_U8`5@;KirS+r2^UWovt1JMWF{;l@E ztvcX|d`+`&Mc8k{mBj0$d_oXwU)KQIWHbbo$gnEa%1}kN3(WBh{%U$A+b6hB9ozBy z?f0q!FMFsf&ZAC$XZBSclKpb1>R{!qQyr+=*fq|GKVFPx&Ew{##tl4^-fC9NGDU(# zph~DORtb>voOuuGdh>TRX0U9!|0_uj}8iBs(bU`oVBFT^_KT&y@dlzQ0#8>F<^GaJ%C{ zVuEj!SlTD$8F#z;+GcpadHL5af1`A1{N2lcdHHt>-}^rn^1W$%@Yap5m;3%i`TT7> z?$(VzSA6eWx!G=Wx$(1(#o|P+(iz68=+R=C_r5*0XW!XFGWN1AhIk4GdEPSjL`d*7 z`!xF)2J->!X)D(*6eWbhb}!vftOXaO9-cO~mpg=M^>>KhGFPKhBXxZaxtZ`^-0->wJU(J^jV~Q z1Kc1vw^Ig)AL4!38y)irVZ#!KZY#r|I{)u%qIN3QmBd{*w)m;thUb^hi% z*L=0ytFM*MRMp5%f4%r0PnG{)D1UpV{H2|T5HD?0*P! z(**LnE;?o^nlq(ACbtM8PN+iEJmZaQ*fK`AYlLln*dC$&Na=MzWu0o`xU4P*MkNyG zdwR04qbzDVn^97!a(o&-x}T{g*s!d6^C3#t9^tmUbE@ysSEb&EX487bnwZjQF*>%rV^|HNgCwc=M>1K>%~gJ@Ff7tQjJv$`Kpf}My02Foc+ zG%R=$zl-N(52a&Ob{7kvl8+KaIiNIn|Ee+`Q+cET$jgAs!&zIxS-0zsmAQ_eb-Z&) zvoqGI04%XOb5%lOd*gXapO;h)L3(*=<}XSyJdBP=tMpFn2m1~MS$tRuN&TMewlVi? zsQ~p}^&@Jd{51P49=of7_0w!RtOFNGHI?tFVY3EhNu;~36%ehQwPHzW2kw!*Obtkf z;c3p;xEoorIgVBHvxXU;0(GA&%qB`vJF?Qk(l+C5J#&n@&lQx^g+%T6McMDu$of3? zK00_?qsim={&hv%w@ZHIoibzh?ql>k*QPwe*-^gUzkv9Wf( z9#e+mkOfr_Y8Wklu-L4VhZx4qVqbo}>=%{r*)xa5pq?pvYN!{qVo+b{a201wC#N<> ztIy|^%B6m`yFR>?U6H{fKJJkAwb@6Oj{U=O zjXI2&b=NuM%&&d=I4?QR=()+&u;%3D%iqC@r|c`7n%~LCrZXq&DjoSSujGTKhbw=S zZ|-|K_3?4};|1B$~dMd$J$;Rk^zwzaLSXF}FtK z+UPN~8P_x(QFI~Jiyz>c(p?}CKI%tmKHL#2&inD)_;LE%Pz962;Qtmb?^gpckN!*I zZI3Sc@5-G$HToZ#5u3dKAs;+UGx=UY_YaEAdcP>Zsnb>upt(y#<x@3Mf$QPq9xKJPN^s0yXCKX>8X2urhHe!E$Zo< zi902qOCDFv%stGrSQ77i_I|WeKAF=#oo60@!P;;88Mn$Peo$VgtDjm5u~#FU)^M-! zGuqma3fL&TJ>DEc|E6X`R$3}1HQwooji%cl4wMXhj4AOksv=aTgnKmaBz{Kw77@+4 zap~2Z_df-bk0K*>5$;)|7E3U>KhNl*%-F?NoAn-#Ngfd|GnNKxU^A>l++Ti>QF&Yhl22kxtdHnRIsqG1M&ClrHixe< z%BA^ovIAV_wC)YNI$a(~?Huu3hon_;ZsocCPRVThr@$Ba@d1FGMh%TTj&Y56Z7 zbYtzaMr5qj^I5LQFTC>kO(Rv_e%g8&cltN70tlFrDql6c#R$Mbjj+Hl$X zp8_+Zek5aL|CnL+wQKB=v#QN~%y14jF_hi7S>MmP+m4&lOg9!Q9rkzyQ?COa>cy8h zZ|WJ$i7E$CU8|?oBg#-r6j43}iwTKi`P3;Vi+l-cPDj*6&1s~NE|GgKuP+|LaP_gg z@LODzdXWz3Y`koBqj5)!hzjJN91vMCR1a%6*(BlayCa3!e-9%6w~c*=aK-0JHqvet zdK0hq!L)5U^BkVptEoMx`H*UBJ_Wx3S6m zJa*WwfOPD1a(G#79!#t_d!kQ@c)a&tf^)Y@PR`xpSLl$E*KCW`r4ETc`Hv&?VLe6gFi%RPF%e6Cgbdbg|B=)G{l?uJ?B$q0tChpFRS zbQ3cYWmp!Oya$RXgupZ5O+5VQr^$8EyOqiUInDAKwm3JsHU_q}U*m$zwC8a0;pnK{ z8MkXwzrzlv&d|8Rbd5i{IDY8)S&LR9Tfu_M0d1jRn>SLd9#sDuD|+92*`D3lk*T`I zVWOf9?<|Jxo>)`a#mQJPA35>Ms)HTwt$WSah|NkSj=y8?vQ=V_m+bnrwV3e;qte0D zCHuZ&Wxua4HunAS@m8nh?6Pr2?3#V=a4xkw zYSU&^*ou7?|A&`V5n>&RR-JvE=Y)T=u=qCL;$mcfSy;*o&j=2(!|;^1!UC%vz?*cu z;EiDKQEK$kgP!qK>`Qp-{g>eA+Gt0-MBmpdYfEsn)}LZ3#;_lH)>+sOJ=vwih;fSX zOoiiwKltvB!&4=u2CyQ)_SYa(y4Hsvd zu{&O@N;KSux5(>-{jMClXX&j!oG@`8mY>bAs_BG$(3a1;tzG~owqA8ewBx~}=kr}` zHD1Y_2KQf<{Ll{_%ReVI zeNcRbUD;DImE={m-)+}5982d5KIKG>p$fkY#kc8vGO454*-g{@5_pUaL+W@E!EO5} z*g%D*s_-_bF^REY0}wyjpLfBjYJS=SWk*VD5}Q68UUV$JOj^lN5$<9T@Y!l|)o{7x ziC#Aj`L&||rwhm34sGU;@DEBPLR8|Stef4c-67qT>ZzKq6x@WKcDDUTQOmw-z+Lv)vQr=Tc!r>&D|gR_ts@{HnRg0sj&KR)9?hCm8?#C z2Sf1X{cw)tdWt<-&E9_rFJ0^3rvrDQ;d!AY*I+&k%^S(pPWaQBNli3MhpieYE z>%PU>d^Z(XphRCGEJ`-H=LuKHmrp14rfh;^iQ(b)E$(o(IhzpZD{ykFMr zdu6X}=kb5{@{cb6>&t(&n8{E3X7zbRuXa19&BoW}70o~YSS&p;Cf}``elH%*(y<+y zKqBwcyi8tVv^Pp5-;shG295)&W8vq@yNu_~H?|i2!>{6D;$_zE7_W}i5p{@GYjcd| z)MI~-;t&mN%+iN5kt}NY4(}91-i21OT_L;s=zh8@Lo2}_x9?>)VBBUs>M8E(UsyNJ z8V?DZhXXQ$V1?hrqbWr#6cAOm`*vL^I|iu|`HONsyiyos1+ZlBNmL(Fv1TwX=dQAd zJh<4g_;MoPMrAd{4pM!mc=hnczo&en=LwI>z6&2uY-_1^{2;Slh8DoyUX$r^eRl28 zZ=Q~*?KQVp(|LCf`}#)NISz-}tus#9NzMAWwJ?3xaxj)Vs%1 zolOjtwP8!C-QFR0@7U20`Wd#iu2WLIGjoh&`1q;vg0lM7AtR0eOZY9+!||Na8L=52 z4JHv?7mEoG;$ezvWZwD0{9joJ6gjhJCOwNMWW|lWn#yN}$XM@IKceNxh{^DyRCM4s z;}JnqI;fGPDjbg!s~3GqmLIL!YUR6A1h6Fet;Uz?np#^rH=^T2w%v0KvVG?^{lO>} z4>HU8cHyOOmnfZTJ{bTXcNKh36`Z?Md_B-So>bbf;rc)88f7}d2r5k&X!yJN5@3DnpS*i1=>^`?* z+j8n5FUvUf?%`Wv!|b7qO=yYW=8S7o5|*2-eEziTZs}{(cDBzH;N+3()qdl1Zed@BI?phoU~U&2C@pvOwM` zSLaGyYbv_E;u!duT8^PtdklVS1!6TAPhyFi_$d-eE5mfGM<|KgibVPf--W*Rs~t%9 zNlmR-0Sv{T?0B!s{X0ItjV8G^E*|{+Mp4$b^)%`q4~I5}F@6s1+HU;J+MCDEXqV&M zpsSy&F|R$m^Zc$#k?r~#p4&peY5wFImU-Ox_&y%{Hw(giQm{=V@NTz94nekCH@>+D z+1|X5pYN5`oPF8ikNT58UCwELv3t(pNCs!{kYghme*(jk$-)*J(U1wsQce~Htb=Lx z6Gb?Fdm>cqE}ffw#toqwe54k~r_bM`JuhK`n6|EZcW?ao{$1Wyx0ibp92;sGOL*YE zetJ-OjA--mgcc*rnwv+omfnZOsX2DPtM)ORF?NG~!jBcV!PL{SScVOzZpLXF7!{A7 z1xk(^i{?x!ctfAT>08LL?IdNp$cWl}ur(rA$?wKoS07J6>od8!7(hUipiWrK;Kcj}dx1e)5*u-u*m+PCsMQM?WrlF3m2gzD--TyRKNU zHrp?(CRq>ebM>50i3Z20<~ySSZQxNvgWc79$Hjwv*wnW=Ya2~$E(`lNyPhz=eT7-r z>3&pmuvvz7zQ-%&>OUyVY}*M$uNB`Cd&4T;EAOFV45Eekf_ZPuC^AR z!`5hbvG&XG`Ki*4(g{Gf@84fcc&OXSMR4b%evf$>hBLGTY(Xp2qwPatw6vsTM^EcB zv0}Ugqr#-3M&Vep%WQV@>sonP1X|IB;nnRK95RdVTi#*1!mS;t^Z7X0ZV2tiwnJqPS zx}|R-)Ap#tSBm!w`}*!#KkV*bRJSpz4dW!^uI1S|<5PaD%et@XPF;p&Ew;I=n@nm- zL>=O}jMp%gm#(dXi=V}ewkZpc z4@j@KUMXLxfis8njjU?O#M;tij4W9NiEyRwDa`T?@d%cn(pvr%|5(0X*iuFHCI0d4 zvIDlM{{7?lZ}h}57h8rz)q2Fr&TC}t{fFn`VX5Ao>YB-85!J?I;$P5+R=O+}{K(wM@HdaC6rpQQ*Yvzf){m*JlC{Tly)mUV{_BMT51uQ&Qv4TH*>hg( z_2P=+$9D^}l%M#?{i|Ne8RP%P7q2r!;fSBKccb2X9%Pp^PtxjC1gRDCkt_nmM)vi9afKPrO^V$%}GLl}p#x z>iSLNf-IO#FmkLETrV81bI@Z}`)q(VW{EUlI^sX+{I@w%^m{%tRRgB-li@Em#1oc3 zf=!Uua?(0Fb4vUGoSuQu<}8IR9+yuYt~#$)(}5y`NA zr{h1HzMXus*B&A~7RiUj7afmZ$A}*{3_dgBaX#Xi5nr|1`6wgs@Vu;Ni?43KiTQ{I zr7rUOd(`n z3hc|A+xb?sd(n8>KSkMnAF3EMi)2|whfJR?9x;tsjG1O3&Y)sarv`cEBDv{cpXe4X zLo8UNc3G6`Dlz+OJJjU*IE}>ppXQLSQi6J6JRy zgy@v_NRPNw_o=)PWs)~1-Ym}K{cCLKcy-Y}4_}JvOB1fqw`IuvQW+Txef55JPYb<= z&&g*Q%koJ7du7~4oO>{=jd`uywcPhzIW}?_v6JL_;eng1%q+;i!3@L+Rl18erE0`1 ziQt>(RAl;H{K;2(l87yTq&T&_(n zX*!3=alk6YWl|R-VkxpHA|`V|o&tV}gQ=1cHvBtD~9DO`plMYi_J=)jDCB z(|j)@5qp*OC3jZMQtrQ9;wO0+;(VC5XS;H97XB&z=V!Z5hnC%=na+)SchRkxU86}p zwM;ZwJJZpqMsh{?vK5w9mer&~iWsJx9=$}8IpR*5CwtW$unvP7>~VWE(`<^qF7%X{ zSc(1dH8-#8YGZ#7$_hW|oQ?gJj_aGhab4}~+K6HDTXLqwFs{1H&R&&=RGHAe9+E6M zmXgZBZfsgvj0Pt2dZ7@+_KyMppJAt0Q>Y+0E5-&x$J7%qBB8Ain#NdtqgqHR$7O&<{Fp zxIZ%ADvHQHF~q~Yp>ZbNbw%Pe8nitceb{#uPwV`hGY+3|_^?`q2bmqG2b9irl<|9= zbv~q~?bTx8cSrYLDW8`9c=FP=)!eq8d5oI0{ye6-*VknhwEFq6FprkFWp0KuAcr7vWilhc6VpZkzVg zKkhT)RWH|lhT2HY0?L|O8qVPb|2*CQWWr2 zqpZE&jm7V(C9ONW8&**(jI=$bsm_p?T&;O>KFP5<1ky|jbH z&#mhCUG93jG0Ddp!)0{(Dw$4n_LFGTdn>ma*{);FK09A@dPeEh&(%2Y@@V#Aj#BVoPW;e)%Gnz4 zmNoTM>CToNatOA4Z4tIT)nTdAMEbK`t?M?j9jniLGDd1$e>gn6NS5qSYdZ$EIdLXk zfgsd0CrGq4Cp*xtsE@p9|HN8hS9+B2zWL@Nvhq}_Cr9t14dqPi#6eGoZSv99XA(O_ ze48HGKMvc1|6^>kKYBdfg>6}XYq5>?CST0GPp-_S9!ViiA3#y@_{VbB5+~+Kr`NwY zGe24e6+4s;7jzT;xLKC{wY0-k)g${cwe`q0UdzBrkBn52T$KGa)FabfhvGwlq;}Iv zX{Y{A7agmS5+I`PZ`O1=59)Me<>?EN+^KbXBpuU!9Ao^cyGgB69#4gjRGO$a?Jfq( zedsmV_-yG`n0QnA3r;h6+XzW_ProVOhc!FvaI$J&WBn1ggJ$WemPdyxmC8>ybjBHt z3Qk(R6fnEWy2SD1g!sGKDyW_wQdTf7NNKk>)5B*8QhueY#(Sr;k^QOOyL;K|&V`Q- zaqCwGy)ifAm35c*Sa?x(>XZlekJopf^1x+SS?8h0m3Gxd8&}K$T!R(vwyPb^mIxYT zV7K5yx^c;=hOx;cN|vbX98nN)j$~WQeWf&;)%qSSjF|7v)sN}%#L5TdEuRW0kEb@S zLCQ6%;~6tmF6(21QSYZZrnAD@s7;TE7iYvgBWAb$6762YE*~|-+?82*8g98OD{>o3 zCg%mS>lxFd%`EqiY!BJ@5_K^cx!VWNGce2OQTut}XJ$F>81v|O;SUNYWg>mQ*mv=b zdakc}qG!uVnbZQOW8Nvfscx1Y-#Vdq=7-&D-YywVeLsF2p>;OOKe+rWmw*5AZ(aUR zmw$ZuJC}d5@O+eMkCm5-1(tvLV)^{=kyhPrp5^hj*7=1`;^V;<8T-I zoqF_UZnye5TzlRteg2>C-f?&J>ebKHSoOP}k)6#`-(nXZOq?bNcbt(-^2%; z?2wZQ(@8$L#$F?@QH)w{I6XYEo>QPv-~B&$(Idk=8dZI94vmJ7KXE@=14G);m}PiW z-_v;m>+$I7XY1j>qgHGrtV~2|s*_$H{K8jsR(GJ8D#s=hS_(XX|?{+_7srLp} z|5xr`IX;Nr4o_xrzSIx9S7o+c=P>8vwND?%2@=KVSG#D~_D??s`sSoE$f{e~v@?r{ zW4c8^XVFH{9(+$$Ipoz_UL~>^P-;TN3Do3Znd)~v+iRUdbW!fX>CiX*Sx&1}wz=RY z|J)S`&mLLJ1?5AeSBLwV>lj+fbTt$Obf;taoT=h3?!IVpD#ZQ9UV0bNAaSFdZO2No zo9YgxsMV?%ulA%L)0*gxN^d)lb?1>>l=U$jlguWue^=>Rt+HGzOH_Rf96$|(+tw@_fA2pVCBtj z{O-=M&xhwgqW8<)?w{}8AAaFgTITP%kK~;7q49&Az$lFCr^^z zfVcDx^c4>sW`H-)89)L63gJV?J>OVz_r`AL3<%a*gh(_R2N3xd3u3p~>x*t|ySXAo zmzsR{#*a7dN6#sz=a8}#>zU%M?i~2}PSO425H>7+zr3KT-({uEGsSkF|Er&=F;hG| zKD|CK@tD3UTli+TrgE;(Tg4j`Nw`-sWbSpo+y|ZiQs?R6+A(WYs61~_gfaAc z!hUX5X*|C(hPvs|`PA*zy3qN&XU2Q-dTHayP0M)+Z{1f;Hf{1Zil*{@vDv#%>*5o> zT;}{%QFgM*=Ik*w2M@5fV_)7bHMMV-&k<#<>VudoYYn@z+nqV<`D?86oQmV`H4ot! zC_|qX8B+7F@4xFD>H@mI@$l8p>T5*3p$_O{6#Z2E$?vQQ#XRrheJPFV9Mvs(eT{Hc z+lq6{X*m0!OjUB0`X!n9XA6S7SjHyOq59IjFgAChN1U&8&v~MZB@wN$W&UCrc|S9W zC$(_KC&~W3RogwB_KX&yqHpYU(?epe+9>0GJYo6}zf6nT&`=?sWb;-Z@ zL9zDwmV8)d`0FLxfdc$-7pr^bJ|4*#@aV1bn3Du)NKcgKICap^R^Bvs_B)riFaM*G zIs2bo{^as^i}3Z|UH;Yb)1AxDeD{yO{cD$R?43z_`^HzxntY;MYglu;Ms})Hw>^^S z^Tw#RD|@!>m!v9|2S9l^ZuYGB2<)IH%3O2*hZqgXxc@gCVCafZYT*($oV`~o^K?OVJev*Z=- z;uM{xI`(u-YjkY-GgY3J?#eDkW2&({u})T&4^5qBv#Cxpw5>zhd{!}^Iq^#IY4J{L zF+Q_d8jtCR1+PS_+{^xim)ezPX&2LNTKHJskqg1b^Ss|0Fq+RcJg4xTHQ5tCD5Lm( zd3P9f=YF1qpD?)h$|!@sPj_hh{c;U+nET}W|L>iD`_-E_e(pPe{`Q^Azw{qIvp34V zRBZmUWq*FVpso3BqpTcXSLhjSd>uYxEwUz(JXU<$Hs}9xtBv^g}Hj0gwyBQ<~RLJF3T(Q zfEEXaLP09C$v1%I#unt_7eMYY3bk_4rej)%tn9G$BDSX!%;uQz(Dcd;2VeoP0B9Lo zA=W7#M3WSymWKwdb7mOa^$x6zQBB9xBkSf_Vf*9k^c}NirtjFgzjIj~R@m_Qr^aVz zZL=%#fS)NpLt!;#{+XpI|NY73-@g1urE2WoeEl!H^4*{DoK25^+1cE;%cnh8aQLOI zIDGp)4(rn;|H6J$`KC_8C%3WrRKOx@mM`aZbvn%SWSeWT+u8#_kS_n0< z&vmu5c-JQzIlHeHM1dss*(R3Fsh9W4JAHTb+?UJWbQPo_)Tl$=5oW`L zw>td8V&+)rx5|6nD_16;_hxwwyJ(tyR=swkZvdb`Tdt8NwpBN&K zXqulc?ueJ-Lb85v0qiyBaLRnbbwn`}Z^SQnUCoP6I&p?75w-^z;uX*W_!P;^HcB&Mj@Ylnm)RzI0Y6!OTs(=ntk`ik z{%xcCX5liGbM{_!8_!u(S;)MkR5fhc-mEPdY*t;e?=Wuuzxa22e@qlpO`auvfL~_? z=Y&0Z=d5r`1K5SOSsPP~p630!hZw~5MrZ3eY;F^KTRgIbyD%EQyxIPxLQ-`wCX2by=!FODaVjDDioUzOHZ8x z%tzY18>jZe6SwB)Qh>i(m|sQ3mIwYPm;bo*Z267LKe+rS<@+BmR6|?n`T6pBZ=^vC*90Vu`~7+c8bqJh@jIPcb%f*zUa9tPF0y*&>*;GW#>dWyv&+ki=*58^VofN zz!|~RrcIpG_0#IbT`6%q@2FMqG7$#PkTI|F47ZkTS5Y)|!KoqTrF;L1a>jS8SbgGD z$)X$Hp=}tMb#SY2*XKGfruKSCN1d?vK3ZQ_4a@RG=?`NhWBxj{ahvRQ6Lr3Dzsh8o z%MA_0U(85s=+Iup6L6nZxVXcVYLx`RR%B`ipLr^!&3%b^7s$sZnHI54M{aarqA~|7MBId-iT-IYqp$6ihU8ua;Pm_h?6ozS4R9xaY^^xvzCR3u83v zVU9oSkhOA_R;JRr_ZYLwUHCZVmLdgJzl4wW!ZGoYvTIjDKP=GQ8}3UQef+CbbGjDQ zO4c?%$?u5;^Y_CIJcc1)2I2@}80n{c+BiP%y2gWQzSlN~6hp6muEw5gA4eJDeMQG*G4I1Q(3+|Ipm<+a@jf_JRkm-G-L|`) zVcfl{&C15l8e`5j{jkl)SZJ$rJ<`G^%d5kbEmNp(w->q@ic+5|jp>;B~ZdQ)9=4$DI zIitZGxC^Y8{0Wa5ZB`tx2e0b?)h~(f14Fi zdlRK&MdQa0Juo(k0-L^be&(mqrm&%8hEQ24`_x?4TMs)CEYD>3s1)LWI6>~(ZY6)8 zY7*)WA9Zcb+LF$negAj)mQ!tN6N_1_RxQcq+FOf@S3g%{ess9^RJq47Ge}z1C-eLx zbEDJa%@Qq&3T#FnMCal$s%=)EezTy6O0;CL-7G6x|F|d17hLhX>)!MPPm_moyX;|# zer2(3h3i&9MhsfscDk~EwJ2NiX}(z=*`9~D`;}u1z1`t3%`ES{q+ULe(xHxg3=ECV znhaEWmRT8MC?zVn(6lQ3Ic1_yV5wHAyOUw(Zz6S~0+5yeBEJB3(zN)eLATSW{KNc| zO`bRJS&H)DLC+R%?}>7~i5kZH?bZFP9}HZK#r+xc%4G8n`Rp8qex}&fk8gareBx`J z;`*H%pD8TDU%c;78EUgjemj4iLg?P+RlRl|{achk>`@fknD|$Gd>*Bk_Aob+_Rmh{ zuhe$)#CaL4HPWsi+&)D$ZtoID}Wst7)PQfWTAnw$BjNtEG{;N{8 z_YX@9^|u$s2M&pyMx%M6>?K$$dP)tmYohhc#TH&EBlw_T?}y!J+N|{H`&oz1xYXNV zlgW9KekluiC$RJ`R(m3Ai=P)9=w7`E*W^cXw*>lj_l1x>Hc z#=Lr$6_`&FnR>c>Mmy&ZzaO9GBZnvb0aK$lo+GiB&iHGMY0h__#yy}Tv^OpYe^Ktp(7GFmd%;VBa9M-&VdJp6 ztXo!Jtd-XUQE7WDKdqPw=-Jlx@_ZGmy%lM`ev#Ry3n%RHRySlk_LU)3w@S-i-O!5CnwoEEAzE@h>Q%Tn~M z{`&r>h?pdDO+RrB{T+fAeMReL%|eaN&S|F8$E!Ls<+ht#dXCo)*P-{C!`(Kkl`Smx zA%fD1oxn`70+A1vQhrM^R+6J>-jdN`&chAOEzC`1EE#)#pYNyI^IHDEKI#CF41zp+0)J=x@XjY9D!%lxxCye{nAT@z37{NnwC#*&1)FJ-0`2j|Wjo<8pWXBCcF zsvTZuWuBo{OmQ#P<0N}#*N0W+I)-z_zvtn@$JA`VRTfYNG(MWhGkXU?SUUC%(=(gt zlpTd3Uc}JDonxreF|EN#d52iE6@z1r*I)GcX!J(lA2ej&vB*?;vuEV=$w9n% z<7dmA)D`dN%Fp$Tb;`r8YLVT2d4{p8ac$n5e_r=^ztfiCUqAZWomZHSYO#gU4;z;-*Z_f^*H~D)qIrvblc(QG*LFgKPM+_T8FUAa*;37>#lhi{^P^y)Se4H+>vt#f#hz|LQwt9j@hx?mX1Ozuo)sOuH{eq;axxnTV5rnMN30O3T6=R+_9n(7ei*D{pWXp`lgzqJ0 zDH}!A67>L<8LO4XcTd%wd?9}|b~ZTA=EJbS{PnrKp*8pyJMb`M&0N==yLr1CeoqES^riRGR?j}`+ui@2UWvp&y z_4s)`iIb%AY^hILQS|Ebda@hVa(jkwMSl2^%#jIP?o-0AbyAaAlKrpTLIMSfc4S%)F7^V!6$hdDlD z>1v(4u#ut{94Z( z^SOO9`*>ot!eXePEsGy)%QKP7cW*cl}%-tSlPr< zY5%OYxScQdjBQIE%PDwLVk;udiTo`=)4Brs?kLIcbq|KQeNnZ?5rd(&u^BNP=0UeJ z^;oc+dk!I|_ncRX;h1wACi=I#j1kDN6j2ltr4-N#C@$hUvMJ1yObZbnvBNeuz;}jM zI?VwQQ%`?9%wwu!)UMAS6QeNazSPI!U{U%h_t*>0hF4>9>DJ;JX&RV~)iS-#&3w9O zO~oZ*l6j zmfCven0*gFt=B5=-S0;VmB(tTOs$%ivdJr#G4JZHx9h(j71Zm!ll5I(w{!3Q{?!`r zFm&Ef*x(uS-tN}#6vZDN%xl$<%V^5El4D)-I`{~^t~j@2m+$Ljn4RtQqiwIJ zU1Cqo#jl?Z`Fx2#zFwHiTxE4jT|7jGyi>9Y#AeC++~e?|HiMCd*^;t)wbpp3@Zz3>@l2Z*rUTL-<4-| zRx$R^EqL@*44E+3+uM2Ac6P8(&c2+mU3)uK!?J974x61`PPw-a_jmO3e6;+X;fNk? zex)egWuZOo74 zvLy!+5+%!enAel4kyMH3>ET)G7erG$Uv8h=N%?TKFRBVZH37-HOGi+3@ijNIa-3~7 zCTmeN_b(k7uFktWB+gUq+CC^ML(=ZnDM8*VD>Iz6+Dk#ci>z3gi)Kl6idWRrOmtu~ zpQ#y=DUi972kUuiQ_S#`A+&nXKAQ1cbvx7XU#AFeT}hAIu9sUZvqfg6innFCYKLn| zhj6DlSLa=S(buu|GFwx0)vx4EedQ6Y%u77kQMDdu;yZ(Cb`luzF zS*)kkK--jmM4Q>jOv^xoW?@U2T5e z^;PeE6x7kHxAoUg9et&o2$EhUS5Z0se8IoFUG1dKwlu3@Kb~zhEa}BYn;PeFpK)|q zlnIVTDcS5^ep>c)#?ePVf_%o&oNV~YeMCEb4dAWPf842sZ*^HWZ*(!9H&)^4Io?!b zP%M%-)IRa1Xiz$IU6t~D#?v#NCT5I19jlAT_2Z?_mfVupt`JW}^JFlt;iP8_9b>4B zCmEq1m%Hgs)+~qqd2ijXQ`a%4_w27S?%0e{$=4#RtS3?|%Ajx~l6^_hHc{*_9d_f4O|>?jFI% z&7In(vqf~lVYjEl`UL;D+>MXQKdcaf4cW%84j#K%a?Rf>_w3zr|8ADEdCbr-M}$Q^ zeUEl|SUEk)iHJeA%`6~~%HWa7BU?zGkAAE2f8_ee$kJaeCza@q=lmU6LeA~Td5d1< zWU6q_isjpKxAy5FsylEhFRMbnM47NoQ}JiErj>pk_sAIU<);lf`&i_UVH= zK7CM6e2SHO%u{e3!`U$ddJ*cNuMe>I$XPPZEuzxEF?KQ;ddaEtj(Y0m99+7X3_i0u zTz`G{+_{dx+2Kai)^c6ZctlR*aYC8TcKYnaWJL1K5<%4YBBv=jAHcP{6HWlitBpWU zJzW8Hq{ac%YFL}j4!!?j1T)Vhqd^Se0f=* zV#Gs>zB?1_6x?Chi}rf&`r(zH_wso!AKwdDyO+gwqo}KfJN{mN;=ZQtpO7UseTW0?`mHk#JWA@o z83#6XCufB{2vu+`A2>C)KjXmTr4k;316SW)2=}b98m9{-d)!X`qh0$=lTGi8Nrzmq%&wMDslD=_Vo?cM+$4T_okE@`=DDTXuxY+Gk~$MT?zT^^ZN-|NEi)jO z$BC74O~$kJg)#%qzRU^F&z3p#^<4R9Zg@*FIXo`gBe@&0I=)o?q5?aeHJ$71ylT5* zoF~!h5j4%HdHC~B_VFwqRKI~o)s8$2`QpO}_1SU^bKxG8<+!?xbqId!OvPag|9V@1 z;gz1V4IWIk!BrrCJd1CYeDb@6i|GvhbjQi=70vSIjoam~Z`{vnf4ML+l_FTlRb{n* z>!HYMkGGMG;hGD5n6;p?{IJ~ZyM+f=emu-z2UI`51FF8_@|E%5 z=gOB8%VjrvmtX9@d;jWzY|EHm8yicEJbL)B`eBLxa;seHHcQk$KA$PG`I)=&WU}w( zv*)e#={dH#mO3S#zxbu%jg05YiS198M`YK_ly_#kUZ+o$SE*+(H#|(f>gT$jJ&$D!@y>XAzP{9r#d@9V+B(gjf4TJWR{7EL;O28=#!5K*VjZh5dTY?<=(CMDR*!3k z$GEQRo?fqQ(>?adbnkcUMZueC6-@v5c}KrnR_A72S5+h)#T`A~qlqfd@9C+oecsho zKTMy9wU+vjES7%Xw)eFa>ydGF+q`w&^uw;V)g4~z!(>fs4NbMG^WNSeb!b<+FPEGo zpcg&nrPDwC*vcGgJRW(vJcG)tu93zsE+C?oe)i!v$wYT*fNTtm=E?H>Un=h``hbJu zL^;#pblh6a8K%|8dXB-ZPqAaMVD*wTdC`>deOI}gGaA$gKUbcuy7bA8Nvf(--HTmP z^iz@fO!*zt#4#~XuL$EbS1pzpt9stCuip6fjql7hs;_UYEXv@jq)vlhi_pg&n&C!S~91{h-Xyurs3jKh$e@39og!+9zc` z@!6+}$E9mHX^Iio&O^-t4%;^eJ&+aeDu&z^ApC z6?OU)Eb(Bka_5&}e*0P}8F^PLgh#TuGMqld#;`@=;!)1@40y798L1I^*3;#xTzOOu z-4%4UNbia-l~?C_+t)f(Jt|MD(OcGT8&`X`VCqNZ+K1}r_&u`9_kEWz#?NoPimC5b zuVGi`g7x+%-eUU2EXhHxyI^^jYHTDOOsvG#+OUQ_!*^`Zs(7|MmnMs?U_3aaRYu#R z8Ok%Ep3(WR8~jo3$}`>CTf!OFb_2|r-|CIEI0n0c_ltJxSB_xZMZE%?DiHmJhNU-_Dr9BJ}kc^T>1EFyry% zthdVQzn(o{+uRi*_TKGb5ymrXJuYi~6z$KMvx>2uIV<1!be#3L_9yk>yR{Ed%(+gA z-zuz7-@U7|4NsS=p%>5uE(*&VY6;s;S?JXaQAkQ+^-uS&MO>mByE}Y5Je@-9nupqf zoMasg)4h(c3vq@mS6Boiau1+J9&eX!$J;V8`p3m@+ow;m@pZN~)r6sPR6p_MqVkzz`94)? z8?y3tMuxlVe!7>Gp6NWrQSy{QKw1Z#)s|4}an5G9&Rv_#Mg2p%C%t z+MfJe{5E6S*3qyP?@HAHPtuBV!q4W~%Xq(7t~^~b<fWC=k!*Qudze|p!~S7WeQ3O!x=-?9#?O^eKlKHw5Ad)>dmmTd2IhYw-nn7|&q?)rPTo;ssb3g;xF{wcq|Pvg$?bS!MjOt#nWVUTCGwaK|#89icH_Qx1~ zPalsN_JnzyxYpI7!`T+fN~fVFwfsx3vG zYo1FVeLHsC_mC`_ItynMxLfLmag)a}%kGQ<7lmmoVFK$=fYs~y(rGo?Lo}E(3XH3k zA0-r6s==I5;4~H1w3agpoKfJS^VN>y5nNBD<&_(+77x=-zb^e+YVK)H zfxtmivvSs2g2%g0#|XY|X1X5R%Q{5GJ|pWHSs#65y}n%q&Ip@xh0+&voex{t>*ouH z)zSHsc?4&SJ?AKIcCA_)DLkGJdtCOKNR3m!KHlh$_mj&%x%|iF>t9^{;pN}B{AZVc zaQS!2Z@+!{Z~YYa*{7QSg&W^2QIjWbe4|8JuZrbfifvHFhI zocEfm)t~FS_my)0^+Cu<0q*5+uGFJ@rI}KLpk7Z`1)ciT{ORqb|7}jQNR7L{%bHGa zH8t}hiDHgom91FXxK@8UruOLx?fwH|qE2^Eb*L(CJSOpH(IM+foLUz${Q~vo@s8G1 z?ID+O=v8Knx(+6aozBF1o3$$9PFJgcy4c`!M=#08atCs!b63ar+GF}O=zJhAAiX)g zMrA0CUd^bS0y|%)gk%et4>gGD59Jj=gi}_ErtV(H)Xm(A>%7*NUat%$9k&BBsuT(7S=8A%W>Z8 zr?KnV>#^%Y=5zeL9^ZGrh`^=|Jn!|3f-+~jt`_T1rvCWZ_3ZVf`bph+>p1)&nLzau z!{N_+{n6U%;~aqXcKsB3$Ugc;t*yyAeK@)mQW|Oo0Pn8%Y+U z*OBay{E0eC`ynW1k^EsMLKTUM=l5tle8BX3 z_mh8gIOm_r{ilzO$8=rOQGb^QYoSRS_FHMW1b5$@(#^(Us4LIz;&OEHG4tEknHq|EB%gXSE{uY=Q9eNc~yTRRJC)Dr{A?te<684 z_{_tB4r_I*v)6S-hci0te_psVV&KED7r^n^!&#MS=LPnR=MzEN`h-s{freXDrY$tZrO=oB>*Z|ONcbj#icp?2)Y&|WJ(`q#=k>0=;o zvgQFs_ohvsw=gJio;i;6;N)dJ$!N+fiC4f zeTiB_J-95-e50Ihlh@3vHSy4>x-x@K%fyb6f!(9h8b8ha=mMhl$(Oq_oGG(Gd7*&2 zBXlyl87-TFBkM<|ml>CvNt==5Ndc!o%dvAduXlG!z%sR_uB(1bYminf#YsIhc}mj7 zXiUi?rBAs|nxJ*zE;zG@e(!f#Pf_jZ;qF27s^kvl$Mx6S&&Vs#9A)=zot@#eWwA|`Gp z=IZPKofmTAgJ`VZoH*d*Xzw6KE2<|0TjWg7N*VN`WxPw(Bd6=jlKlCr=+)r<@0&kg zYdWntGdkCorQO3sTwCpesH6Iu@mwVr{+G)=H(w&*{)t+Ob*8o_vtfSBcg`A+EiZCw z?nHIH+7BsDty9h_kio9;lmZ^`AIiM0V`SUR{Ls!xCTnL7AC1%G}&8-#;#2-!J(f zKU4l$V;`2^zF(ekr~LME`K>9amLLa zu69>)T>7ZOuiXDUojBg@KG|Kl_i6Tv)t{>q19JB1$ECKXo}cu+a=$+)_xt_ww~xDd zz^ProYroSynv<3)7JH_-GH3O<=EmF&_nkGAJ27`ib!LJJKr!RNc>{~wgAd#0?BJLNBLm#=%} zFYfLXk!xSVr{Deg@BEMd@&EUipZSZPw+|-2Q0}>Ygr6^{>^<6;{6e{sx61Xv+nWW$ zKfLk14w>dKdj9!qkvsfqjNFw2r|ao39(*|dS>4Z-e|W=_jrA=D?#XV?sR32#Y~RTt zvzBpSdn0wv>bdDN2E z|3Ml15PQGW*@*GywXrXGDpnv1GQK)Qi@RIycz*>(HMDqCsn-UN-@Nfu8M|4EofzV`b#x4W zug+h)UY<9@r(r)@s$aVLVl>pfJX6mFs!KBX<;163hMaiaVxr0D+YrTtub6HdH6Qv1 zW%Yj4*+hCoR!IIb~0ZDTz3&OB9oy_Ux}eVj#z_b_HWe3iP6<{3|Y z$Lytf#?w~)u70k@Xni<$HX**I~dMLZ|*LRql@uPS?!)aaD(YJ?S5oe&g=tP$i<;(}Sqps;g)SiUEq*xpl|Gmg!GTk>jFmBGhFytqryX7 zXt+YX*IXo|tqWZJTs;W3xh?LSvwy}{b^W5gQ|voLk$tUb!MhdNrwR&vT(IcZ%a<4v zWI8r}ZPQ=t-X3FDjZyadV;O2y4Xv$b>gpkrLS!}>lAB(#E-_-f@JJ8YboCIcg;_F3 zbdHhPLcMen5*({%8F^1x8mvan`^ud>6>f!94`bX*7+8->uI{5U|H)vfch2Ka+*drS z<(TF%E<>*Ro>_})k?ZPbYm58m+{cRL zFtHr-e%T*h{zmb~{@3D_{p9kWALN^Tv)I?y%6|Gv$q$aTYMoo~&F<_`+?FwuKKPZ3Oe-%$Rh@jvyQ1?R1qF$(Tv!^38bYyt3bCm3^%lgPlHZ7Q!jV*tjg~ zY`Eg~@wLQHoMG!Lv9_UKT>Hhzd`?$FQ5SJ@@fO~(OlUJHX06K{Ekb^v-%`<`wnp~! z@{p&#mvGxY^ zn&nx&HM8wO^{acmL@wVc82QN#H2i~78}UyLsEtrLf2*L&t?u5;<>BU87qb}ntDj=z zu@Eo)gJsdn$37oafcW4_QoFbah_g>ocaVRCXbLyilL%iYoT90_n_H`B%Y_Q8+ z$8fI9AtW>t^eMK=->7?{$%#s?iMt3_ohBuo3&QNv-&q* zb5(hWqJZy}oGf)s-`rq@IAc}p4^geYdE=`EQHF|9i}5YbRJmQQ)!n=^tF8|}YiaID zJr%Iu(~o0zAj_RjxK6$cjt=*U-HfSVp?QndbZOPk+J)nq;OUsw;It8` z`}OH!M%Kr0{i#M|VW2O>wpL}TsuXt3ye5CQ=GYy0&Elkf&ON{}tnui&o0wZ|&$QmG z_6BWRt7&ggpY2NQhRx4-^l<&9VmHiFJDz%6T<7P@W?b6oelCY4Rlw2pFs&M~d$cjX z=1*9~!_NHnytoHs4-?tkb*feQg6aFNo4eR97KHWKOKSAu0rPAj3Vgx(@O}O!wv^8B zbxwB2P}XG{rv5FN;mfOlD_-@ep0zxVq4bZ>v-4%BUuR)I)Q91*wJ>|y2_jY3@5Y!1E=T*vo6|q4XrCzTe$_)g zXFqfLGpA2KrmEze(Y|`VvF69?KD-3&W$MoN9j z(NKvyv-z`TbBI#^=-_+miN-qm&2n0)?kVqgTKLl?bLFG^s;-FVz4A{7s;?E4)wA+W z`JHNx2kA8T-SXGr^Ik50d%vq1c%ozCy2*I1Okf@Bbme@fd&g=uzW&febvOHiJleLR zosBI@CWlbuRj<3O0`+O1yWfw2UN4@jQY+aS)OuPmjbEfuC+Eb@D9ZA1#Bb#u)@-ku z;}bh|>ZtC}{x7i=)~j*%c{jtA?2&PH;gjW_4b>%|Qlq%T-ffASPJ4XHcT#Vd{6U{E zjAV*U%5M@E5k-+NBY#uZ9nlnV6I#5?6!~?cDY_a{=F?X&?<|i-rp~-hzx!HUiCGu_ zk()ZcR#8l`0@o@kApg&<5~+2C`U1Ibyf zgV6Ii+dsMd{mVbR{NqwjYd$yezGWAtSnnKf-OA-{d5^Z*|5P_isetvYcE&cZ;7+-7 zzI)bjau%ykP*s9{zaE~YEx*;;g@jqPn>$zzn^>8hYk$;kyLP=DBhHo{__7&A+w2?N z_GQn=ypUZB9nyjSqPusyqoV67VnsqlELGn@@cs^ML(Q6#c)MJ8D;H+^xX%c3OmTGh znL`vER>Th1n)jNkh?O-x##(p-nLH*k?M@D{HkHZAWKIt=x%BS5*e7I5K8X1+qimWC z6IrD)Uu43-W7f{A+Q>7GiB3n^2zcg6NjB`d!V z*y(~Z+=w01q(=E|*lnTny~S3D^6+eEc*6l{6F!FZ?0cDq!cq`SAw2btKn zx>eIgxG{F^hj81n675UKxv6-hE~k%L9$uFxyGosFBGoF|Hg^h4vX1PfWVG51$^Ew? ztrc0=vId}|tZwTt-KApR<%!72vgT#R~;wqe@sa-FY~dH4N^ZpWzW zt+gdRFSM8HBSAG?I-f0BPC9lQ(HP;v;g+CWIGlI4>R_|174JD@X)Q!BV;CtO1&Q*S zp2I^b9L)R4os-iCv&>%RCCm{rgu%fEId*1Sh7MluED*09@9)ad#u(QcPiB4Bc#<6i zxl>0n9*0e${&U{ za^K}Uy6?WzO?ch35EV)}kqCQYC3Ozx$7gnvnauvp`MF~ZosOx^6We2g+H(EG_k8w6 zXG?m!zzWOvOh*KiJSRABUZtT<1+iYraaiuF0#5pw~}4@9eup ztI5eh*L!ETIpS$|Ha~NHul>_8o?TJ%DU)gYj??Fj8ILh+i><{NwBMIf@f0HSfW_BCG2Pa z81!a#=XFBJItTk9WIRE>7QZR;IOIOmAuQEA*7^dj=(JkyP4BT4dJ@QDs zuT^cm;!oD&dhW9nA*&km;OYi)D%s64b}?lUl?A+CDvyGkUwwbD;s5I;R#%u=aR+uyCqar?!fp zV#SKg@f&r05sR_gpeZh&?l3xuPvSpSJUR794?@>D+-bTe=W+47JfmOD*!%WRKZYWQnZQcOim|xHAuC7+ z8T^uVM;lQKPV@FUDhbw;$QcG89)M-wsZcw;kHREqCfi4W?o`|1<9$!iKw*4j^QTW8gD^deLQQp8*hRFCl|?k$YzqaM8z^U;+vE#{5F-zBAq$aJacDF;C6Fd zZeE*9wD4wmzZXh0C|9@rlwY3{#wkKO9g$oB*N2Z|pkh1z4^P$CK?Immhksg`Sh(ML zO4MSjk)2P*O`CB~BOIIAG_6<7`|x9inw4<6ZlwG9`?t#uyIcMl2c*3yJM<76aJxGR zZ&y9kiyf}N)8Y8r9Y*@xw!iOeJ9v+8{jfaisdBZ>0QQP8?ysqhYTE%=77Q8ZfULvY z>aC4c0C70}rD&erW)wrj#ZAR8tamFncp8tA#^q7_Sw03_jyH$hiiYHI&!!ys-}_g@ zgqCw>%B|}kAjiX9N*x)5sC<7Lo2{6qKUFJJX8O3#$QZ^byQw|Qp=_Ontjc+mZL?X3 z6Fd|(M$u^-4@G;m%^AZm_2*yr|mOy6ywRo8PMb@{s|6%B@t})Xw zwQ;sRCYWwr@YwaUu|9_DPi!OkSkaZl0+SCD?5yhw_C^QcdGWN2PE6UzMS*-y%XVx# z)wDJKDJrjxmpo|A;4~P!OHVx=#_p%CKAyOGmFnslRnMpj&3mrB{;YIp-m*hep8KFt z_1lFvI=92g!uM|cyTy(@Uw(3SE+tNZ4S|Dt4o z|NiBj%Rl`Wyka*CzE?hPTpjfJ!b#sM+=xeyr+(6X`ZTNZm0}-XF3-DF^5mZ=c2lmJ z?t62}uCaVju4$XHyZM|kH$Ft!&57?(2rAQC#)r2lyRs!xOM@d#y}m?K=o54b|9GRg z6JHMFa9xyK8FE++w#7$`Co68|u8O$TTAn3bct2$~S&A4{y+hl%u=#(w)Jdos!0M}> z&}UZ;|2pQsxaVd^mpKlcm6lJ^1^(M*jlEX*cY4YX(W1>5aasIT%tt<~H9BOB@_G{U zp*m2Eo++cDyj#<>qGVXpgi@twc5p*kvU2+qHA*!V^`ylDr)oog|BML-&Xx7(*V0a~ zZfuoj@BZdB!yF*dF**X~Z~frrbS~Pxm6V99Jhs&Lc+~S!*AQmyclqXRENx|rTh%QO zAll*0(mj&*7KHfq?q~k%@J_AIE4N~ncI?GMtx+t$Dg*IInal+m2YjR9M_DUbFd}WAU1tv6c@0 zLrZ!%CMMezd!f(;vxgRwrJw-DBFZAEiiy~Xe`47(OA}wA=B09uHiPk`&W<)i)i*<@ z;5EYz{;bUsUQ;8|w`Mv+PalttXbfYHv-z2G{ARe$yw^H*BO@pIzIaF?I>Wij8J#NG za00VNo0Yp`F0cul6q}*fvics69!4WmC87dcZUL2c(`Ls4Pjh{yV`}4Ko3SNVM}C7W zTHQw9KaDlF35Dsl({}oDon1F}9pBf#tQwG^g897dKzAp1B-` zcl)4O)uwNC6;Z?Zax2EYiCFEp#^!Uzs5bnBbrI}gp2spQt7B{Dc8km5?NN89j9J{x zilAi6KQzBQ0XlFx9$QcG1QKz?usoLsBbI5s#+RcZUz`Zd4mqE04$bPF>mP?ee3*UF ztbfNEMP1{orMf!jYP90{EQb6j@m4b=ZwuFp&&=wuId-_H1VrS?@HPD}f}c2QdS9@b zLl0yQ&8A~ogJvRIu7>w7R_)#n(ToM;nI@JU?1N*hW>A-B$$lCQG@}+6lUzuCw;au6 zD#&hVk7+rY$VJ>n{Czt*2X@clDH`^mnNu)#JRYvB6E`xPGjrrB~|%fP1`OzH;tmGS#O3TyjuV zgVU{t{G`Qzrd1kk7Bqd{VN8g>6`!kmEBkXGd0QVA4d2%%T{a#K&O8t6I#?!rhsELV zd30!>SRdH~GObif@+8~*RSd5dh@a&PZe$s4;{uKT-X zW?j=Z9OXyAI5_I+mic-W0dC)TsazeN@@iQdK5L4lo6qrCxsPL?Z&_Z)t+M`JE1&s# z`MjqJBNyut55L)s;|t~gHLNLh4E#5h4^xFZ-X5PlUJ&+5LFOr$bNP<6-oz{L40EbZ z2WP^Ysm;l!i{`w9HSHeb8oafdtgKWBP5oRsNwQVw-eK`7TjbV(#&USxN1u&nCZ?aTy}EX3g-PXU4+_!cyJA1qF#OTI5GMM&jx9Pv zU6jAht9C!RRB`hAm;cx0|5@Ui`da3((AofS%ly;Iaj%@%RSA5bQvA1X_BA`&7qUR^?5(|;P`78B^1xfrZdAqrX$L|&6 z4!H(aU{igYukNdg-dz3j^znH%y$t<_YtnnILwnIc^XdfUyO1509nCg>{fFVoT6|I;J(~&MsLi6gpn~cuY74ZlY(Q%y28v zzeG6`mkp*{iPjrUkS?9*CtZP>EvJ#%xfXj5_j%VSem^W|lRS{yC2ray=3%A z#d>d-DD>C6yWd8*X--~$bz_tpe%3Mt5L-N~cDbzp+AkCp@ozh0yt+jDDJ|9uE@c-` zkL|SNzD7rOeYmc*gwab4l`l~%pMOVNC?l& zSL&6$)*RFSeO4O@rr8?UxooF8rZwos7DdmC#y1`l1(Sjo)(zWn6dsrL2J2v=tG0rT zh8^|{il7*Y9yGG?S>)yYuabxC^V;`eUIV;pZh1OH+;zU$F%fae`DU@_W9|oedY^Wk zB2e?~$CVtaif}hO%1#-tO7@kuoL;B(nO0={e-;~`NKAxUPjUCV8Uj~rCx=m3ncja1 zD!zT=dxdNB7xId2RdYl26joG5e7z8{&OnbIYrOl!W5t)C#}pBvMk*QMfmjwMm3%KV z#j?RWIf{4?1}=hc_7We#uDmzQR3);E@9BBEFCxYp50YV-W_rkB6Sd(li`U3nORvJp z;`sVTZS}%_>Xo$$>)j*h$Of<>Y(jfX^D&X-i1=W#h}GSyF4fuZ!@?EkdpP{&H+}n%hOT1QQ``P{a%KYYx(0aA7*GzwxMP9e&r3c^wH_#I3IOu-w5(>t!?9vX5|Z$+TyF9t1((` z(+O`Dp3a`>OGn$Tdi?l34(|dn&+Sed*ZE=D>+wQfE+b6`zPsIOIK+GXQpdiB9%W0f zd#Yg1$HiY(RUt2&dY8S_!l9?ibKfoVpsL-o#yB+mv^D-~A_MEtr+R5^|26S_ibkxP zs~uWPkr#PS@=~z5bl&n4g;PX;mw=D)kdoKOk7Xfc9>}GlnTz2-s@${Vt8-y%@n6@* zy64ondguDbVMbWe*neH7&eeC!np>;R@y6I99E8UH;oXAI3&6v!v-&l+TuQ_uD~;? zBv_fq6Q)LEv})N!7SZa<-yglm$SE;Vj`FtrBGF#CAr$6U87}*47mI5HARn}Ps^jTCIc{$ zCb3=bN4KSyK_sv6S~w|k(Dni!FRX0m2Tql~2j$nEjy>+`H*jpE+^@?(A|TN55FT0g z<->xG`*#^wtNNX>@r;cs?1wS3hoc`$Ws&#F)yqZ^>AThG2>R^lBzUi5BZv6e-|AGp zq31j2XXjJi+p6@v*j-gR2*!hE;n(=t)fY_+pk~5|OTb53b>&5m<5{14L!KGWkw!4) zPqgo_Cs7=6n{X!TJ9eASa;c$6U3s*ER4nj0scG(ZI?#ImB@vvpx@0O_^w;4N_H(*~ z>&|tStz5W&+=^-IlABtnPu&*R&K_B-3tatN9bZ%I^A~yiZ8klPsnk~`&NIHMH;Yd9 zW?5H5Jf6>B%-md$9)wqi$4_;6J9b|??t-}<509TJS&MYryT!`L*Ni&)QTh3eqF6)o zoHsp(%|k}^Xrppv*|Nii8TFKettI z+EggY^GM}tYIKtYxD=P^y_W^S-zZrudCj)ix?Fl*wT==)o#uL>a-DQTe2rQ>9P`ygpRR%&(@6UobjE|6rb+qixz-t}A+7nm4oJODEjE*86^~Y-+t2D5s}HfNL)>yF z&sd$VzQ^g~b9MarxstgOj&>DT{anYK?-WL!tgJIOzf`*NDmolRc;*odTm{5 zuU)vdX&kSA{7`KpJLHMt7s&Ekt8HBUOg-$#?4;jKUi^3}8@saakE?7f$-kdhH6CZ) zJjUj$_nVht^C7$$`>)Z2GjD#JdGi^a!vmJ&mK{%bUXxokhtkO{O>WsRlJt0}8;>SR zr>l!>7)taRrH>UeICJRF4yvZB<)=^U9p&r;r;5E*x|O_rpBF5z;lF+3Gvz(h@PE0) zcI0U|rR;m%j zNA^G4A=S>#Qr+D%;A=O&dOriX-7^5L|DcTPqjE>xg=pBf%J{xl{-Uzi-*~udGDE7r zKF$nDAE==Qx-PG{U4bFTLhgjjd)XGQcBm6STmCMOLhgIA-{F-C3;KkPjkRYo^?+XC zQ5D|0QlxWM&Z^EC)ZTxI7O`KZMUZr<8j-UqzE(!@V%Is%sSi(--_)JD&R&-g^OS>| z_xIRg6&P86pDXXPCaYNPw#*e(6sihb$8fG>c$+Wv7154pLposjauNiEh_aLl4eExh zaWPtT@9a_ftE6-6)Q@kSdRFsM`Z2Akz(_W8Iymcaa4{N_8bd2kyjjg_YAnQ;)nz+t z(y9|7aLsapRAR`gPK~$qE%zr~73`j|b(rf-HCzkR*R09yIAvsTDIPn8=UWAtKJ4Ob zHOuZ>1*1~2ce5zTZ*&&H4D3c>mP9u!6|nDg@z8!9EIDgJ463mAKQ*HIl*%KPC_M@Os8jr-Y@16)1M;Bd>_|-L~UekjmWyP zp45t1OXCrxMv@g_+0y+i7M>M=w?>@q2{I$BWL0l6c#HzRTBoU7;h(ieG@mm!pVKjq ztkcgpWp;*jKIO~v(VjNHdQ{LLXK2ZpN}qr;8l2JK!J@(SjWgXYXo+v#F5chW!eQhz zVM{8&s$cxo!ee;gI-IC*;6KYkh10v)*D-ux-2WIp@TRw`qbP1>yy;VLuN%`EzP8;1 zJ~m(D8;P$ciazZYrRN$enUh%fSUD3zPXU=#a3Jcd)^nk14z&BK{&%2a2@l^RTA9#2A56G&(XVj0# zOg4jIO7sn^Zha5EeoSqi#&YJ|*I`bztF)qY4&dQiAHy*@=O_Ic{hwZ+m|3lmvC=Tt zbQx6>Y{hyM-;^z)&lv?H%x%h|9(E7-)Mz{J>sAcio-w=I*WDLG*XGX7BWv&9tz*44 z$0_Uf&4T@J-tYZWeTejK8?S1bqim-1tn|P23n3{|yePdjWJ&1@!ke=C?SFmK($OW= z1H6^ww=VI5_3pV_{J&o-xyG)kssi=3!!t~heQF=^C)dVjuD%{Ot8s0P6KseV=RQyE zA8etB!bNimE2(ObRDTJWMo;81>Qq2aA1A4w(*6S-JIwLz#H0t|Zoa$>OQlp#w%`Q?UC+)-X zxY*UrqTTrU{jx(^=h{8_(49T{u&*>cUYF>})0>t#eb`0L@F zm{dEfQ}6m)<&~SSe!jf!!xFRmsJj#6Xx8DK{c|2!MWJO#y{)sq+D|H~7*#6gH=_z7 zB;p(*2|BXqW1Of7omJLCdj5-VMf0Oa$a|4PnD01xqASUmsT%6BPll>G>{9ihcJ7~3 z52lYFiqpe&>b=(Gb-LH0i1=G8V~qae@#J+nxl8Z!bc0PVUkW(1ms_MZm{uEgJRPW$ zziK8a?3;Woc`noJqv@E|D6kY@*O=JTGz(6Rv+K2@(x=@zO&mZzs`Jd~%krm0{Nx{} z3R-l)oze?lL`%%9%~@p-&Z!4i%Ua*)^6@|XG$S6?-YQr3qk_cmc0bDkxK|MBqWrcy z{y*>izgkZE-5u4xUC>Ns<=Y+3>xt!a+juB16yABp825(#6vth(+TOjGs~s}rT+7g| zva5EUm6ecQ%XZ21Bs@q5*~BHpmh7~g9clH^BDE1ohy_ywhk7y3-+_Tmz zrXGE=knsVlV3^Oj-lvaMfgHnXqh;BXP-b}22|i&A!>ox!MRJCqd}@ylS5eNYaJSuk zmI8}#|DvdiM9R=jWkkAbu%+y;ITq#2_nbN6{ZGYj*s^_8yna8sx~U)9KYrZ(KA*MI z+8x-6d0_1m|J|G^89k!B>Qm%Ri7vxq=RwN0G7Ffg{bC2edGlpPF$L@h3WO8E%;CzN zV>g@o-H4X&ciA;Lr6d(7?*4G?Sz)d=QE!$h+2DAJE0-sZ->^hEr=E3TdEB2MMHsn} zuH`l|yVWVZ(7Y3;-Su$dox&GnHO80ul}~@a*=0d`#D2bAp7l<-Z*n9(A7kcW>C|HX z?>V7<;8$wR2N31KAI?OPSr+>M#9DH&$M#HPhx> z@<3JA+$?J(=S+F7s!3Sde$B1&Ow}=Y-L10TZgrn9=4-qB)VWHTuoAuX_NkZI=BGjo zwh-ImyBONA%oE5V6Yg}`mpK6{ zIhf0stn5E~BRFGj0_MX@$q zU20u$F;^k8l}>@Jt6#w=-3cBgAB2Z&*Sc!sN&ngDb#7LexZ}0|=iwab5VUNgp@jL~@p=<~(K=a5bZZFt7yX;i?b_ zqQIMQJecKg?AjVu+K;HsN~cKa3fVchYZaM+;dp}d$)#22&%1<`@twn;jTow9u0{iQ ztvsWQ9_Mk7F7+srzu5L!Pl>FDc%OX^^P{q}!`{-nU^zFT|2|QoMNyR2@9b1(Eaxoe zoy{+LSa$ZjRumpOJjvq0vL@Ac!@e^r?Wo`H6pt#W=x(wm9m$;zq04PF`L{YWooeo1 zDZAr^vPZD@8s~5OeP1cwpuV}Z{^##oux&9&{+wsKf8taBaKE6^6j=z~JON@rciE&|KST#@2 zs-pmi@bFG^^!abaG>0qBd#%giV3Xo6rstOH z7-FisFETB90WnkQNS_poHd~O0_D>Zsvu2MrMLRHK$)_;i6oe^y;0xm_y6KqO{-jvM zlzBqX;4f<)Yr8onHlD8wS><0RelE`8x+#XNfw4yIuunW+1lV(u;o*PUVS7wd^sT2_ zjw2)Mqm=6uxQdETmpcs?WpTW4;}>pxy?kAipXX8W?_K`2f{#DB{Mn!W>7RbCe0laJ z>y(4Hn{n3pe4(rrsA$#>Ma50zT#JgaQniYf2a_za?DeeG;@Xm};@~29h8Nm|G0~|_aaj=KIV!aamfiLDf=UaGQ@W+bt{+_*! zZ4UX$a3^I@;bN=p zpDDv^Ww-Ubln%Y@H5EN#`C)0InPs>e>p+`Q?ZEu(BezB|y znVR1&V}m~;u4b-hxUZFKPgJ7VYNr_Sd6@+m&ySQaNedGj5Yt8;(2 znqvRs_+g3OdvpKeWp;0vBt-;Y^&3T+e;SRNM?wF@;Gmp7Mp&J`H&`DugACsPy7>*a z$|`DQh*z(nf1FLq`X2iXMpkEKUQHRU+HF2V@&(4a@72%Mm@6NCB4&8?H2eDWym}ME zzEe=$x#u(s`~1CbuYR}tKas6D1pDt_|JVP6e|q_!7RLOKin9BA3mNk?PIkMnoo^Qe z`$ADls1`4ltB6{%T*zvo%|sJt(9>xga;pR27Cyil%6C3E;& zJ$1%sw$XC_`NzRco}gV;mERr}4#!Qg6HyNgjP7QXL);YQq5(ojQD-q>d(j%F4&>GN zndiy+Ps%ryqj|bWSk!{V3YV${6*uS3RB*@Rzl~9H$e%Zv+R*pMZO8n} zZjUd_5>4%t{mrkJLqH)&tOpl%&)s<#;BNAqb8l<*IA2+$i`9xsKlLkn?AvvvRbize zQH3r>D}%*^OAw6@51q|7e^!kVHKJab=TRoC2Ja>(!1a5zd;3CY_&6?M&M9POmk(zJ@H@;MwMLfm(k!{@nAT`2=1lZ55zVPi#P8r~B=e)H zcdk{=5zc7ci7tpRCO*MC5nnKh#1#29{4DuMW39Tz$u{%RYhK4yXUQFgqDyh~y9eXw zlSPxhI2w+gT3xBCv|X3TYGq8v@a^DSRhg$Nm>+C+(WR|NnM*Vlh)R2q<9A_}dzd`p$C2-=Tn4T4gL;CL+URKpQ* z6#-!hsL_eJT8sW}rMV+@y;+O@KYRBYt67$xg}wMf1V}{5hkT1tIZ`G#P%~#P#x{1M zbocb!db+x&&zTvI4H@;Nrn{N$>ZYoDW_lzLAV?qv#R3^cii8vkNCH+MiMZGaF@yw- zu@b@uVn-regA`+|NZ|`2M9%u{r&jO%?!ET=zWcqLI#vCuRJZe9_g-r~>-j(b=l@@> z5ihU@*mF3D?C+GPp$!+B(^RbzhrSj?-{ z?OYul+FinB(eo!ZP7eoL$f(xjXxv(GB*rIhg8; zO?tIh1Y(Ik+HPpy6b56lsd$9+aNVnde_olc649*9DDPy8iom$R7bvtHL0_cH}6&EK%j zIS!*k*Z+H-Yvm4Sa?2KXt_i`9Z*hz3{ zHPjfoc*C>pMKlf39h9=0;wd%$!^!dWbX~LS;x)&0M26AP`Icd(8vJ#R$o_G&B%Eu^ zT~-}XcC%J}>3GI1t1rF!u^RJ+{T-2;I7VB?s;`2&Q#Ny*vIlMan)iuU4BOosUgs3; zv7ev2qu6JHzGb zr^K-$%JT2@Y@?IVxoB=t#*PtjB_@q8XesNv*nnXD<7S9=pGIHXdAi55Z4SZQyJ;_v zs~@W|f_<~>%;_~djM8e|d%K2a{2u$GVD*LD6Ib!<__~t5x^X(DzU8U%Kki1gBHWGs zZGKGo)>qHJaQ@{|Klv}c{Gpfr+&$0P%(@O!JE?*)6Io!k@#sy!}}kRRi|u5FsDt>W3^1qREAE=|ZV6v7i<|B!1=@v<-?p?*)~Y`Vmc7 z9+WOaHOTuP594;PlkJ!WL|b*b`jI(28dY``f8r`0 zMVCnp-fC{KzUoonWUGjG(IK7QZ(lE1ryfRijDAd9-)7c4_I>E3|L;rx`G5TX{E_Fs z;CWYte;4IDLO`qp0%9sz0qr`#+P%qht`Y(9yJX+&|9up82n598l1FSgJh(ToI_fOH zaw=uyuAt|@ED{#o)+qm2wc_csyXr`r*Y+;UH?Fnfm*x5> z=y3Z}UFYz#GRA$y_~*(acAt17=G~~PpFJ0^itfWp6S;53L)nVth`lyWyx~qI<5<1b z$pmm;tFv}p_z>MdpAZUoddJBd`$?`VD!f;4iL}vb+ykk<4t#4>p>N}QvfA!rd?r^3pQD!Mc?>ChD|H<;N`{mzqmBYTA_q);AjH=W6!rBKKJKB8q z)l+30t(jWs+{Vc9v&KAeUAN7ubg9YDX&2T-JaA^*Qf#c(*FO1*?q(I?cm6e=t#M9? z$YjgSKnyS)GbmbkALkr}Pwq?Rk{SpLb3T#TMhP^_v#O854}**8kK$9RN&uhcocZ<6 zT$Ik6EfsJ2xCkOT!I&j(7X#OK%v@XAB`!*;OeNhkk<1VwVI3|HN4RF}N}L#~YV2;t zftx{=(=K3-!|0v2U=K8g)K_~NMWl@pV}zVuQ#ey*9xdYqisQsC zPJMy?zPInl-RGL^zsa9lDdwqtIc}7A{mj+v(Q-b{4zHbd=oBU8lg4|?bh?j zsdgMaM!(%K@>8AOqVI8fM7&*UqFyYhFGF(w{VpX~>KG|gflW8e{#dbKJ1$x0^YdkW ze7?L#=49X39s8q%VSVQ9c*e$G5jS!Ax>$W?srcA#Z)N(w^@j1tc39CKHLJZZSAmrt zzr!|&`AoM*zSZrO^@O0@nfhu9^J)!+>%hCW&3n{)b9IPWM`1U_q*7pi?j|Nb9;vafy4_JMp{0AMQB6jj8wM8=GTQC&aY!rid9;+!i?c~R!Z z?QZTJ6E82yJx(V)T=~WB48+u$pOEwI4)>@w5TM7yd)?2MA}7qmnjq&;tGHfV^Mst^ zy7b3~Ykp9W(|Dq^2wu9Qu_Q5nf};oHXi)&Jc)fwD{14Epr(-e<9!N;;gI-fPY&)K(O)eyoQ15c}E(-6?dp ztaRsie{+C-^5eA&`^5v_(5v0g{4dz2YubD-gzxzS|Hp56{mp-RargXJ{^p;3?O%BL z%NM(ML#Q+CvM4td{l5DF`tcnf68+}Ua-0>~bcRqnGen>2<53x$%CWZNq3ce|P-icn z0K1@@l|RHi`Gr)|+cn@BRznB(Q%ETjoBX>RgB&KuBqXJs(&*{({+1u|{uQ|niF;S) zkfaCf>X01H%3W~ps>kYjapr2tMe;@ZM>*HU3v~VwM#-A|z zkhq7n!6dmv$Tr43m7lUY!7!Ns$OiwoIOG%j;?m$DQt=YkN1Wq+D$6P}%Ttt$@-c8P zcPOsO)eQA~R(#6mTz&5onm!Jzg5CS^y~}d1mgC;lkJa_Yy{mVI-|gZ%{O)rdlhaw? z-OdpywtcZgdLm&lpED40*1(Vr>L}ps1buS3D#gcU62AC)xAvy-@Q=Uz?(_fNd;jGR z|Fa+dRk#0_AH8w@WQmM#|LE=WfB*cs^WRZ^eSPQ1IGrADm1~JxrJb|+Wchv+FeeQ; z&F!7;d$!|W_ds8pJpZDs_>1n@hv9##aqnUIAB5v;fMy)xkYLFFbQhNihmyLXrt6X( z26Cr*=gNjd2aY~JRc#Zz3?}+{&gl{*d;jC%AQlL<`<-H)3R!V(&N)7P+&&a{?HC7F zKhvkSYW#*XZ#fQL{aB50aR2I->QQ_={p4|FOtI`6-+uS?yXXJP?Hj-S*T4EpMb-Pc z^M71S1{XhSHSFSO{8CwG&zHIW+aGqZ4~QUmpKf z`3AK&I4qW7_N@+sT$~fuOg%B7Uzhtwt}ulIk((Ps@U4f)r7s6$;s8nisdPr-922MN zg~90<7a0Wfv#Qzgio}(RHA6n{e=OvRFJ4^T-=S@gYtE%pk*j|k+Jxnfk!$rc=a6eS zR=v~Z5OHhr(m*;NOP zaccXy=Y5UGcHP`7EKk-D2YjLYi-(&^h%*`SU68K&(fqyHyS-YwH^F#_)5=uW=Ex?85$^;dma&^fAH?@x@Q@DpWzWCo2_Q%>VBds6po zepx4GR@}nWJMKgb&6>mSusJxC^Terqo@=dn|6?FudTgm`K6d7KAI+{G3o~$Ot^ymD zZNrOm`t0g1B_kwDDnn$Q%MIDjXsSjKIzRxp$SsPe!%*nwghUuaYqgu<-))qb^CxCi zxuzw^m%KLZB(?J9$8hI$wQ^;+9&|Jx<;_0P{U2tVk<=4E4bD?rC@JY&e)Vp_p&Ds!M$1{3(q6>bl4M9q*2kGBJ+iXCodJb1rTAC;_r&URHLW6Xn5 z7;6iI#<*Iq<-_H>eWqNEvD$ns;taDSp7bd@#%j$A_U zCyHJz82YaFR|{mNsS%Js?VQgaauzsZrN9Su#t`1U65ruf$!o)#)Y#EQQ%#Mbz<(A7z6Ep^k*h<8 z);>Eqz{KX*fEWwr`Z?W#HemlTD>x-wnQLu-(`hyL<90&W z>0-_{znWj2!>*-6%wHG3w${e=S;gzGsLi%oS9D!h`=-3eG5Z)MI=0^rd$igg-z&ex z8Ey{BOU}k3>rLbNJNs@rk+@giSWaIx;$sjck%N- z_A7t$ulVI(@ykE+(og--?|Jv;jlb~r|M2^M?;rfB+c$3i?7#5`ZvTbfZEo)pdt8)= z__JjDm6H39aRC&3te&)L_jZL!GPGggJa8pgc zT$x&jofvY}+Ob~WdKjDJj3?PHS`$86Geb0b{Fi?3T_{V`V7f7tRh}%}m-R`Y9gA_i ze^rjmvBTCL#ET}LSc08&romoq4J9>MI9G@O6?<8KOqUNujLDrf)TDl`y zCG?!sEl`H64H3V0R@2~>(U6XTqg-rN<5|iCe%2hCE_B<+)y4y91wG3`~hfX{tT*V$`|;)dCO)o8tqbIVSgyBjjuiTBCh5 z>L(o)vZ+r^zs%gR!)wp+YdAk~dyj3sGZ!W1Xz{!0*pFwS_C)JU9yjM-%w=(-}zq8IOO7+g1R*n2l3*p8ydjH+LuA1@u z&uqRv-l4kZ*_q!eF2?N0(>UX=p8x6dzh5%Oe`1dw5|?Ff(L>_$#+SQ&za43;?!&w6 z)w@L*_Q1-Nxi)&%y4|iljWYUJf|8O*oX>KazqI!zs+U!c+pXpaQyC*lpxCGb-zilVAiG4LTo)6sF%zdfn~Lbg3FD6y}9nV~I?&^pN5B4&M&ZDsN~rs%UXsWcd5k;~4)% z+{NZdYNO4L%%;pZ==Je3%fuR-F;-GuNhgV?T0gdEVVf@rDpl z(VkGj#gU-73E;;_ZuQ^%L!!yC53pOk6J9DZcG0qNVzUicD>_ zu8kKJnF37*;~ErM(wbo#cWQJj4s4@G#rDc|?wMgOYI;qN6QVr~-glTt>AJ3Kt8q#1 zs-eCxWOIjK*~zi(mOq-Vf+fCXI?rikKWwgY6*1jDYkQk)2mIzrv>%&M<2{0QnCirw z3E`fHQ_5gqgLanq%4ItA77}UO8R(T*uzYiTjPXStBioTxp9Zg<9W{7i<5H#Q@Nhj|{oSDv4XR)i_;@fd|U6?@x6 zDD^J(9OZG^&!-W}Y1JQZ)i2}lS@YFV)9W^e-|17mdWfC=wC2wW#yo1O#A(eRZ_O{| z_lewd2Clt$StdkezCMH4KSRVF|Ho0T?}Q){{~ zYFZ}UOfDytwsdmroZcpG!noyq5>=-A<%Q|J16K_9(C{KU8P*_~b(_ zZEHwJ8eMLo#c=(}G*BgILYaeBB#(QlW0MJ@Nu=WtXPQiE%_;SLak=55gKUG9%TA=p z-AU%#H7w_uSAmq7W4sl1>ZM4@J)o;yver?yR!0i{$?wR|L5@^e8#(?$h?&ubw$YV5 z)4Nifxcv2TPbI@#)$%y!J-wzSNSS(-c(2W_v(fCcHzaFij_SEgy|imnIQ@)rCaZ5p zwu`6ls6YMO?&9CBG3Pn8RIKN+qJH81IGfLU6fbocZaz!G^)a7S}By#dmZ26v1KFYjyaZ-b0W zWAL~U-6OmCb;ZU$R^0^~nJLf~ZS^N<}) zp2Z9^vh-yYA>$}=jzvzdX$dykNoDYPkwhBfYf{&TXQuNq>{h{IKB@#1$za1ALD0{i zakzPf>xQ~eADY7ay9r{h6@9gi}bwo=1E25 zF_AHj(xvL;<~-XMO*Gq znNqXfJQa;Vf4Ys`+;4XzZniixa*dvk2g6g>AEzV)onF(r>eZVavgjy=fxXu$v2#1d z9P_kWO+R&A4aXt0&Fo{FyMolw8}g=Y{0rgc_ND4UTivD2FuRf+n$lz6i+7QJgGrfn zK?r*`9ff;Abef(~yuLISaYZ7eV=$`dayct{bq#O!BR(wLSenap|HV)AC2Qqu#HjEn zk9Z!}hzQKs;84^7ktinYS$GNTuaT&c;~KTf;19%a&GxA-S7%D{1T~un2#J0sY;BVsu5^|CRE|!@lX2bHUC{eZp6tL~@{I6F2yRci(%)rLm2m1VAxeZ9Ug>h|^FwaczAU72*z^?j$;hnvP#3@<$g z*QGw2r}l3yznsC~4w~oDY_Mfjx0%1@D!iRyYkR-=aPgyjxZKyu({Gkh_(=K0`VBXa z+vB@u*a^Q?ep!`sy2-pg(AH~@TeH58KG4@$8~te77)qT9uNCb1=!2CH7x`^y8u*c1 zGBkytR%U!T)}r^K@4yAsa8xXe6plg%SbA1w-!@3Pi=Wwv3u4*jNV?9~*t67K5Ojzs z6}x-J)~;M?vrv1KyN}J~DpyexK2mbRxV#xvoMT9f2i?2fd# zL=fAd%JiB}EHryx{5_AJc6j}Dkq*-S1evV*FEq5E*ZvOJpY;VKUGd= z`?>Q!TmJl0pP8T2swiQ-6Dj`3B~=A7uB-Rps)Ty7IcMcMnG;)2-f3DZkiMAdLosAn+aX@P(&x)u(9_&V+8Jt$z#UHM zOx9@Hp-1+_43j0|nTTp_e$|QT3K+dOp&SH~c;ZW-qBM?fgKS{k+QIz))L4&`FizwuDe!Fk*4X)+UB zvHq{3L&m`v8M9y>*9JVXkNJev^`59|>Ta7}(e{`Jm+9{IPy6Ngie&BN@HjwVX4H7u zJ=qdD%=qy9gb%}fPKtyIp4=2KoGr zA1cUmJw0d1=IxG&!)l41G2(Nnrb%t{c;8N}Yj3wNi$kyqJF?$0>-Kz+6*sObK;E64 zJjZY5y|G7;G{2|!--a`;lC$Ycocr0v;!^tQeE4qHV)MeZ&3hLVh+w(cw^{^kF%|Tr`GY&>XkKSqBIVMqPGOI6;`04f z&GmXAWsOC9RB3xd+Ni?eNB33D7pL)Rd~IFB9lwmK(Sd_?l*Fm_F1wwm)2@~d3UI_M zQ0JE#P}Q7mR5>9fRcnfr9|R70y;aES{=k+#I7qofg{-v-C!9Rt`DQZ8YZseh$NL9yL%@+!K8o-p!+k-xg^p!U#@lsJCemnpi@GNtlP z$aK4Ug@*R+z1phf z^W}TIQ9kFb;_C6N_NklCl*hv&UhkeI`}AtjH~cgX{Y}bcJa$u8P;xuIX=;@?9MA5k zIn07xPu()}ZfS;x$AyE3Z)E@Ila{8!+m$Q=>k$dA4lR5r`$8%P}fUiZ(q|PGCU89Sw1Y(+!UK11~m_Hp2r6hKbOYm>AQlPo5{Px=U2%) zd$d`S`8grz2|;f@U}>oza&pFU1ig9Vv*ni)lP+((R$hOz>?~Z?FLvDUaHl5O<>FaS z#<$H+$INp#e)_3$1w89|^PiO~TIO2E9`Vy5_c{ze4I{yP_&B1$4q1=BNH{DWfdSz^ zd@9_|T%zGOc#r2{uWECWyUmHR*aeOhHhWgCeH(rnZvWMC&)$6yiB#rZUwx;%Pu%|a zSA6S1+2LKh|6IF=7jHFnBO9EGwVb`T4r@6?di%>Y$#Tq<8Z8kT~toIBxRReP#r1mw*@9<)9 zv2hNJuPNU8+O(Sc#>gBAAflf*=7n$q=JxXjM)somw;uGWs6R8Fe*QRPYG&KKD$w@Z z^V6$RkCKx+IaCEynbBV4X{a?(~`UuH7XTu;{R#2Rg@>$Ei*}f5{gL9JfK49<82SGOYb{+;r_pDlm?h4X(<{`J%4r{5{PlYVl`Zb|nGcE2=2=8u;Z{z_qpGF$fwg1=Yp zG4$5c-uHT|AUgzjrl9fd^1K(i8A-$PykjEs_3N;d6V2$J^t$Pqr+eib4YQomXGK`w zGS*hJH3Fek=BZe8E(avxMu<)buc3VWq}!qM(#p~3wej|DTREEXf1-F;K3itNm%4f2 ztd-1ym&?2|OYA?+LZMxIWZYY6H4d3~tM;?(bKQGA-@V)YvWn`d18rTC`UrcVGG)_u z7@{&%qsF@9ep6xL6D3oI-QVyT5_$)@HA<(Ef_r*+*rO@&`un%=Xxe3Dd^L6EY`&V> z3CWHhC(ZC`auSwZ!#9?#z{Fj@{oefIhJc&tsbcR}@dc~ZcR^>}MbepN?nJOD9%uB& z+I!S@Rq3)(@0PK5LPq#Q(Bf<5r*bjx3>-wsbjme}VpsQrb?=y&xBeYlGJ2B1qttWyYO!L`(a;_ zaZP;NSz2?v!?TvQ!|K|pqTMw_q=U!Vk@e5ait9U3=$arRN_3ZAhAK>CgvCo7ecl6i zzzTJ(NUt*$*dnGd3%o|Q+56Whd|hO|l>0fwFHU?st=ELtWs+9Wdaid!v+}yJ9st*Jsuq_2YZv3$IR3HBQD?Q zCdNcJkwmM>c1K4Mspjl#{j`Lo7ZL)OQ2;RGr7N$x)E z&2@=AT!rXC{EgjlBk;qIomeH9;`hv6%arxul}=CMUKleqD=e&P^(3>LfZ(3B zUo(x}jf2?dVV|zt_X~PlR=$2gR*!7ZwkyA4;@p~_K3*$)rm^34>%YEZ_M4@u-1WqP z=`}4;<*q9poYwaB+0}==z$h;@hF!O-*IBu2Z71&DZEvricv{=Fd+}*))12=WJ?53d z1n;~*Z%>RJ=XahW=DM7**Oj(xZHG6X*0!kC{jYbi$E(x6y~_OQ79!A`VqABfLnx>9 z-alH=_%0`!hLI2Tio@^PajlE9dGhJg zx}&ywNjyQ{*6nt%BU0k25U2f$4k3Fm*;0<&1YK&QozlbCxak33Te!eccY!QZ%R6 zw1g3mo9oYK3Ro#&6p{7dI!?zMDoHqN>OxE48WZVCRY)EUWWy9@Q2RnpJZ5FJLP zjB8WB<<^I8`kWPiVtO*mX>lqh3leuCXJ5Mha*%k8OG)MgzCa(D6kZc9CRqq~cpJ1|nzKrU zWBf|nD%YzytE=%VnPtoTO58m${nm0UzsJs6$^s>wM3v^dZbuUt#jr zLC;SQp=w%R*0xm;&)h0v#AN`JAq(FkmtZhMe%K@Npu%v-k@XZrvF7l5UHYv5A6Hj*RaL0Wy7_Em+l`80yStE^>*H*Mhw=X#Ax_hrV#p_=mjgctU#jtj zg{n31eEw7%S~O-?P2x(ic6}jf~(Ne zy&U2YZ-3tIV5?8Gr~Bp< zj`1~l1aA6Ghr^oHmbo(fhHG)nId#;dUV&GemvOVDGJujoooijw{@D6xsUvvnYTv8v z6q3#Q#k7j5?!A{~)Hb_m57Rwh$d$()+Bs~Ewt8spnkpMAAcipQI>cG&Y;@|K^=K8u z>BuRIKR{qB8lsx{=6tk1JQgZjLDm8nt@U$wd`(8aN7?JnT{G8~a#wLV)fFqnNZrdJ zzH<2*Df^6wKIb)Kci5iF(0CV&p>a2EA{JQd9WlNjlewT$tA$15`qtI;P>D>Vxz z&$pdche5?~0K62w(#6aiZwcBYS-A zdUbsRF3T8PXH?A@&xb};t51v=HZau?(;*3tT76VB`6O%Kje(!gW#v)Wph5-Yhw|n_1Sk{iU)-C2nt7cl2!@H< zU>md(vB5$;jG}5@S8Ti7fNlNbMj;x=7~58T2C`DEQ}u>(Z5_5zE45jw&i_p5h4+hF#>4v{?d@`xpDnBD zQw3=ut~-xW8QFFe?HbSEl8HrdJl>n8)H{7?*|4E z)@uDsX2VkjVaG$5n z9C#6*ZaSgZuk2-YJY>!M%zKCc{7a@I{v~RNpBo{gh#wCTqhgJW&G5S#z457{A`S`) z-4Nc7XAHH_j%t^MZ?a0%O?S>u#4t1=cP!s3@8nssfa!f=R?0Q$)zkW>Q^oK@UH78z z@9yLG-S|*Jo_B71f8*7AY z@S!2f%%fYK0aYoCpEX&F9^cyW^J)fX$Qp;}AQwAEhq%@u1W)P|9g;fV8c9r0eyEeqUtGKQsD=-Y=|Jz|I`@?we8Iyyx_y-(`#Tt}Jh z$;}*Y9Zi|uTtDgA_k7~6pBY(Y>hxJ#~&On_M3LPXr$O=VR;xM~I#p&H) ztGSE1Qr4?`(`QkwmhE@zXY*W^_&O_t>#yjvK7aKMGw&lMgOW2KvS0kb`~P3<`G47E z5Bf~TF0Q}6G6?PuYu;M@AzHbJ-Ln?MPus4-PHvwfm>v;BJ$}24MZMZ~cg)9yy(e4h zPHnFo^>-%j=CF@s@{|`8=)ctMVCKT}SKnaY&DgtNXeg`xK9? zN2*7A$F9}xtB!_a@7E7Adf^1g&OhfUJ*4OA>CRpIR>zPq-)%cEsXMp&YIn|FU0)W% z)SfwU(DYn~i%~r@_jC2u4}GP)i+V`#`>4Z7Us4Vquj0E_-I-ou-bsC-UQAqBT!Q{q z;jWW{JMP-Iab7)BSfz@Qx8L{ZuIpBvv-W73qL^)S5OZkfJNC}2xo7Q*iFHJF(NM*- z-&^iKM<(yOZ@fBcsS{UCYX+{y88ll82~w|g{``jPEjIj6Nvr@W5Y&+D|d zA8tHz@!%xqtB7YV3PXOemx%O=_+-*a`!|LlkVo!@--{Ppv%oL`)O z^8DZY%0KjIrPrdTzN-R!!NW{>_Umd#MC>X%O77Vyk>KX5ppG6hA*VQ&& zO)m&)Qk-V_&Xsd*rzx%L1)&mE4ZePLYO-AEP?=EOmlJS2Q;nYLEPZg)qN(iDc)56laH#(0 zZD;tnaxfa~z2fR{C;QW3+V#nL{!w$>FMqo~!~3t+g^Sc=R-UAIKNw!q0QfwmZ%R1k8di7SHG+8qUKQbw5o33U6-Vfm;ccc zRi!#}iN5HO)Fiu_Tw^*cxgV*pZhzNlg|a@h`XH-;-u5*YC6BDiRQ0sGKD;Z->jIbY z$a@75sio?5-zwV5ZzyAaS?Z?mbfdo+`KDFLeSGyqnaM-vP0Qz_dyl&0`vu$dGR)_; zojxy=XXv}&nQxTu`E+?DX5@tG@JSub{OqheI<8zEev`2WC^f8AN3zn)4>LRNlwG-I z+x?R+#wvi)@x-?st}`>%?2g*1j}4{PnoUnb^NYf2#YJbOvzy0sS+hARtWGPcn7#io za87o?>Kor9s59qjth3|lPBEyTs1pQMysYbuYGr7qtBa0o?&WZ-pbVTdThsyCgWPj< z#PTD0vKa?#9B#rY`;Z_v|r#Zt4;n@6H%Q&4HSOTxE0&`@SnP3~!_Thk+H@;A2^^keBIN+B$yuv%vrS|o1CGUq;!_OSEy*5%|Pv-S7 zV%rX*`rWwY2zAb;oiVI#+Vv^%33b!SpovCclqjh>BJ9|ST*4jf#v&Zvi`oMgpA3UI z9@~pc0yo|crRtsOQRu8-^wb~GKc2n9vvx(Pr%NO-MS83-#PzBd-ULXvgA!N-@*^tj7;~$H#!CHoiZzPmbY%L?XInDp>lThTV_c+fpT_Pt>*-_IoEAggWOd?L5 zzouNMM!Lgq+NuJ!pXwN^J0g#v`!MAF{AxN2V*TlrNb}=Q!(hz^++KX@8>J&$c46_Y zI6j@dauU||@oQyzbNp}>6SLwD)s-+&^)B7OK1eHa*lohN*4)K5k=ERb#9j3C9`6KW z{xZKZhf&t>T_EqAT6Miw@cJv7)2gQR#HW=W_VP-};M{qCwjOft9s54*sC;e7wYAQ_ zqFFM?O|Ii?_`Es_un!Kd-O6Q|=;9L9$4giM*_A56x(s z7^L2ni}DRy*`Dd+P*%h-)lrRG|C!P1;t(1lM}5c4y?GtA6^A6BjdNft(@~OF6NQJ3 z3T?V@)vJkFUs9sdpD9~KRV`JGly z>9A-x{In%Fh|~A0ZM(RwuDnMJ0hf9tQ;!#a)wW7Zy)!2iJfYyQV^DlU4+{miRbK1t zJ*{ge^9;wY-kD|V8fu)_4aX~PS?^)b*B&Q!({j!%%Sj*GM?KGOzF6XdH#&z4Z}R;z zUa4B2`ur}-38%^K#b2=Rm0|X~#rPf!cIEna9KHX=Rmt7p?+vXe(-^p65g;ahzGFb4^^(B3ZdA zF(MzAKV?MJfw*dOkao`vtNw`2-@cw{jJGMP+`>Vl>Khu>>E~RBJapZ!+HC0YLIh{J zt!iQG^35kiI3WV(PT~qD?!H|xZpfGW)y<_db`V}KJb0LjId@R@r8a{)tVXoCOIuqp zufF4H|FLDELCTR&^Wi6z3V$ zl8)(}?efstC*(9u@4pSZTH2*8yvm<;)LvCvhoyCwxw^=*jzS-YwR<x~5cdzm0GDH-o zi3C%Hdt42DAFb_#h&qVeE5DNizV4aCR>aumlw#az54=YU5mgI4-*KX=K*UX*ujcR& zH>3&GtbWbkKi&*+_s&<_s&937T*eQ>p~wDiV^_yzwen)9Po2>4(L%#EOP=~F9yUL` z*(rV7^s1WX9qKAjy}G$tcl)S$SwE`fnFuiqFV)aRwG0v4>Z9mZj3mxYt?O#U%)6u3 zmhP?gES?>DtL%b`G!9o0vnWrlp8D;bbk$JfE0(5i>;Dln*(PFMnvdAWV_`0=bDH&! zXJ-=ij}dW|lZw;dE<8vtsv#n-&c1o4S-Y2s{7*ddM$2kl9V-ra3OX%FCc@npTYERT z2D$|&p(+MkhQBK#W0Yw4aomf@la-n3ZSyg6R+MX+iol=jW=CV0C&grn`mLZtLHjUegjxwf90)Io#Ghp@WdD zaC`*nnqjM1W#@Lib^w~U*(I+EXVWc6Cflr(HBOee#Tu_3Q^QH+n^zJ3sv`8mA?oeY zzcu^d)gtPrJ8cfHxm!*sv<{{k=J7CeoXNSa7`h}*$3trUL;6wGeddIqss&C6dO}dW z-qW)Ng5JFG>&x#aI~Mn3=Onyec4Ju7>Nc2eHvjT3|C(R^Tj&4e{C_)0Z=3Y$ony1h z`qH#ricgh}v+ov+y{o9%e*w1Z8r<=ge+ev@5K zADJOfQfo#Pumg*_#9@ibQWqpE>)wjTa1vbyInY#|;lsFwo-ATe)qiK@u580;m+Az` ztbd~1q3tv4wNK4O@h!G=g6ZQpEv`4!3AR&CYiA61%zMps#%Oces~@XzoVH zHG}D9{9czSa#zOhv40Q4zE)zK=easo_^E~UAb!jP;L>v6a?_D3ucU3w96fJ~Jo*<`+3N+$ghPSG#nQa$01Hl=&9 zSPJgZq3qeB4K@j^EhwSGi{qHLXM8 z*7a|%Y#tv!oiakrd$-)R=gOaFw>n3yF|5zL zqeGgj6d{^X)O9NkVya_@n(Df(Gh2*;?S@V&*qDarrBEUypO{= zk(Nu7o~ctovP9E8RDHipQ|$zh^NjPIppwVT8+`;^mEF^>%Xtge%oZ~o=g<6WebXr} zZK@Nw4pkr1XsXqHFguEBDEB0BRUdVwcVlX#?19$LaHiy(hU5ig^z1hHh^R^>j%;oA zlw``Ha@!~EBU#nPz%FS&IvcG|Oue2v>pZF6zqd5*!tm-kUCLrkD>QYl?G?%sjTvA? zQyE3zQ{n z1xgK35a$n5k)xu1U@CS*GuA7;9(RdDLhS);v}2|hedfKr($0A{Lcv4T%=T3s+h+qZ z3!b>~Y}Xg-OWkaMq`qUHRkfZ|?a)@8?6m!e%sck_x%Rp8e({P9IYL`+N|z#0u`Za? z>R8pwd?#XNovURhKT+@w|AI$BbhegT}QStJhM$Rqya< zUkm;SyUYYp*j;ZFS|K4tWHmjCzzoI9(2R))z?PvTf-LLT@&mMaKS3NRf&z1*pIDgk^`z^MY z$SUq2_kTQY&=Su2hVlLxH<4G+N}MjHw9|MQGh4d2Jt$clUy*RDa2fG|a@w8UQ>#;_N+sBNrb#aueUOhk7 z-{Qxwm!CMP_0_@=bV$8<<3ruOfBVMwmw&4feZBlNXTZX`&8l@Pg4AUR$8buvZ!zCx zDQ8XHD#&P$99A8)`bb{h_)OtezE_+1T$JnPSP(1w{CXxN_LCEC!k@gV#okxdkh_0R8G`cEYgWcfsGK+Sk zRH9=_P zJXndPRL;0g39onVviPWU00_lYcHyrQeTH(Vt73M1~> zR7*JyDjBwdQ5k>yET{ZX8Im22PJwNR4b9s-{}=BPf4egt(*erQMYQ<7pW}}-e|cK#O1wY43+pnI z+xkN`>5k&?=_j{e^{7;EsJ^*VemP4`#Q9d)Y3`JHf4Gy(KVH_~=AGh+vU9=w;pt{( zQG4HbvV2EzcKZal{dS9FNRwSS%%0Kj3y?)t#7YonjMs^oF6%<25*ekK%b z#l>}p$qZcTd4ovFQqbI5=jg#FajktGdPi9lS;}vUkSUG!dLt%EmfNIKW+cQZE|Szu zxgBw`ogm2FzNV=bIq$2>4mYhB_9=4I*2wCoELS7*8Dkdj&b(KCV@7XwyI8&VLq7QU zt?l&T)E#AeKWn`+{n|CNdhKiaxV0UX@U*taU5IjdpZ@WAjO6s{M`k|zT0b+hZ7Body-I#Nb7DMN zGzx4}j4J-6nA6;K*~^*hbbli$(oOZJ2$4rbo>q3#&y6E@+3H%Ki*2XZ)JDlxwgZz( z{2f2s_=?O=TrJuSrCg*QFSlH?=-hlXx5VeEqNW(|vQPj-w9yYRzV;PO`OhYAORIy_ zJOc_J9-iZM*et}ZnEFydse1*%qUlZZxPP|PT>Yhz$NgW+@1NN@oBMnjm8S}NU6ye$ zzU^%8^Cf!Qgn9 zwoxQ&_H~Y-P9HZ4AMa++ZVYue54~4a7<1P*xklp6O;x=(Y&uq=&E(wW+hMWT%Z};Z zL!nf|iuTek0Nz60jIjMwc9REq+vsz8O>OL*i$1w_(x=t;9bc30E2@Ns_Hfx(cuGBu z`jI~Ho<}z{A6>0oUp#9UaXmqAW7pD3r|3H$eJ+nB4}*>SFiW_1XuWM2@-55G^n4TQ z^{i$)ysK=W%{S>8xT3#t%JGbYZXUB^M00a`LC$e7|56de?ZDBIGcnRtEJP%4_xZirXkF*9%};#t4ZmE;Dd&UCn76oMaIC&o-xg!YEj z$+=Oj;z~~KFg7ZOAZEZ&xs!6*a~mDz^tS$*9&g0E3cYPtj1)~{W>(og2>Hb_4>lv@ zMVDcC^Fim5HY228*J}?ujQ5e{WK1LIpFaO%=RZ-R=btZ~OLj%c=ZiiS zH}q%9EdO;ytHP_c zp6!?2ic43hJntANx+xN$LsF~@Td!{M%9*6dU{1|e%iXCIO}~6yH$EMtY(8V3lmq1#A%-CZ)kSW zlTsn=^#^V*mz2i8$d;L*)A7*;l)npA>Ukhba7iIVSF|xLc>6avkbi>db4ae~$|u)M~VGMra+&s&{5rJO~>&;lb+p z;61{9F!7+~oKI*VB6~RO;9;OaxXuX;PG~T!dOD#24|QsI4uuBvFHzLJ8{h7jWA%sB zI75{dC%+t}m;^gbPjHcPuYepcQaEA3u%lz;Stn)?KmPc%gb#vV!^4<3ukAIvUV6>u zleXKc4V@6$MC~2s&X(mDd5At=-YFUW-krv^B*urS^y_ilT>BAGcQ~KK{i>kE%Jc); zH)WP5K$Vn?BXz(#QUqwLdN*(f)pMaLs;;YzT6V?_B{h1AXzdv4P1SCozk9SBE32c> z<5v5Oo0ew714|7z>v?&{BSjac6VutaG?Fovok-m$H&<%cqUmsPrQ;+gH}yBYca3W@ zFDK2Wt%T2OHWc}*jnbC5I$rNO4e&sy|JTPL73gNts(!9BfqbV^u$^!)-Mvpl8p|mLX3i3!%MyajVX6^J?tFFCDWgYaiay>f^(c^gAqIPFj*%mMBSl{ld{GWKhg580k zD?`q<5)c|Todh<*U6yB*^uRO?4*-kZT=tM2nw>1*)m2VRh2pMVx(rZca5FGo17 z`%T`AFGe00pO69OkKu&n1%{Ba4pd_AkX%K&!lh$`yoR6VI<`Sfo*mD>RX*c0<^G&? zGpKhax2}Ze(f5$w3ns13I@uTKPoMU^AUfZq-P&xb9wKu~e$?DD57XIPU30Eq-35hv ziec?~`#xtV`?~y9ay+e9O&uf8-uS`t3CTQ6U$Lr+Cs&>BPviXOalOSdgR1&JUl5j~ z$=I$UtD3gWs9NKj&)@i=GEauNzE)W)5kuXI@dUiS^!nEOH(@5a}+ z1Zi`3YlMu$9n(u3Ow6oik z5l2V%uxnM;D(nWO_O}-6~g8(P>}wsbi2`Zz=j*{YYI8^od&_ zU9g7V=uu=ko6bxE)s#2Y)<^WFa0)~ybYHy33GeX+!A)ptMkZcec#(baGj zJ>FQe>}2L-M?_a#-6y2MH23GAC#1PqloxtR^pR=J&sWbsdHy@k|NBz)^G|lJ`MD@D z0H^Cmi=vsmuBGl=6tsA?i|5mmIOnbEyr=t+u905b)_A;s>gL7@&!*~}c^vY6tvb1= ze!XpnN$aX}Xg2arvQLy6S2c{ZWEInKK*U7}q|5SZ^OE~c9L>~Dx;(8o6_27VF;?G) z!@sug-n&%kiL$=i$;6j4T^eh3PXD-AtL+wDRrBYRp5ff{Ud#Gq@Zh<}s!iP6@mSHG zlf_UMMPK(Ul`P!ibX@=Q9(?}sW+$&H-yD6;JfO*|Vx20!t*V^qHMJG?wt7X;QWuoW z&a@JqKRj7%RW<$<q7)5&y4OKw?-SeM1zj@iOR*{e}L~`Jdba zDfN<89r?v>F3fcoQhB4NyV=;r!{<8GOjmbZZ2L}=LDBVfki+*s6rR?OZ`R;Y7v3LF ztxR*4`@-BFuhH7KRvm|&lWdpVku_lTs)EqJ1H#Ir$)Y94l#EwS47IjXd6v7rS-Dz@ zr|AhSQwj6?9cNuES@E*34fpMO?P~gXb~Vo$E9W%1UN4)&)8PzVj;B{YRzoDYs#tP) z?fCV|>$TBvpZwl;Z`F@-h&xw}Ys1{*_OYrJu$&#%>{Hu$f#22YEBS0|b;u8KKoweC zXm|#H6W3b$aHZPU?u$33XJC|lSw(6+%|6OK_7Z1DRnylw)t2H}U*C?i4zXo(CU6eV z>YeK!Hv*g$yW&}W$IQ^B{P60>>e0ZnmUC=Adzigu*ikZ3*~4)*=quq=52qF6gw zD}@(4-{r#8NaVe^+I$PADp6MVaKvX34+#)^EikJ;c;j4g`*ke2u+!j%tFh?x0`m&FK zo{6sGrr1{RYoEQE9i-=k;<9vxXghqz`r;fDe4*SI`_%ajXRmI5`YP2fotSvCr*1V& z-uv;giKoS&yw{@ebo2G6osSR9_;{YZP^OtjJFaZ?%f@vznsha-n0kCQwX(YRtF@zP zPBr}}?7wkjug1uwy<=wH`gep7 ztM4e@uL?mQj~rVC*cSCSBlvt*c7D>$F1In}wwdtwSz}~g$7eU8@=`pm9IDM{&F!d_ z=?H6<4H4Oj74dS9Tp{y|WFs?(dNm zfE%yt?bhp=uD-|OdguDb@!71zaeO{r%j-|2$y{5?XVdRelpw0e{xBS?Pn7S*V+f5Y zgLX*!CpT_hL&Y>UunsN;!|b(uiO?)nHB`bmG@I*}(O=UNy_1RwneFcBc(OYGXz=zC z&Jt|E=;Ep>g+y9jV}Hp!q#KEvV4+9tO&+1i=cM5&o>ervS@_y}W%N_$TlG#m%@_ff z@#n_}8#no4#;CU&Hg4mEnZrocu+R!~9XiamW3F|*R|iylix@8ce&Qf(Ert`kz$ zG3ZgHU8C0KeX=0fnjHyKI~(n4In&B>+;RCjc$mKHs&$MF6iwX)9t<=6RO}+NmtI3K z1_Nwigwyr#xSRjh|?<=y(`RuOO421D^ zf-rN;SDq-jqPec{Q!cv{DIv4{NNh1g*2f1YFUsA$-OagUM)wzmhwHQXO6TKwu{%BS z#Rs1{)=1~@GJVF9NB5k{=pS#qT;?OJSUK$ldcC;i2{FIk&HmwjeZ3L0y>Cn_JFYWg z-Yk2{Zz}uTvz;DG@wDTqJqtG7EPVRrjjxnP-z_KZ=yjgV_)>lLV>fP`|NWxY{`C1@ zJO739_s^Vv>-_hff9m|={I^`GcKfBW1LJ9D<*JT}?wg!Z>k&N+_^_FLtQI%GA+QE_ zU^V(w(}wM0vZ*ZgKYl7KDS9McjGa&i63^is>Q2%{2iJ=K-1~3CewSvxlF5%_b3g4i z_n_AcXt$IQ5vOlI)(G5}evh56GJc`dDrc50({9BXVieJbh{AUmj*!R&7Zh#hv<$p3 zb%%axJluNi62D-HMjXwDexiiW^=H z2A=9Byp|q9n>Kr>1>&=G&*XbbEw$^<49;CpDaR3}vdYM`u4c-2qumbImXTbiw7Rcn zWh~ZftyA^(`f9Be^)E||1KD5d>U?i@O!VfBFBj~0zS?``r`ZKu{XW|4Wf{Titj$Ju z7)H~}7<5~kO(*f_tvV05i^COQX2Z>>TOwh4SDaAde0WXOO;?rl@J`;%GowO43(>Eb z(EA?)anq?Ru?A$UQO5P+&sF`&TwAKm>a!6~2Nat6+@fP98rL@tCZ&^rs&C$4x*%dlH)2x&6 zv+F~2jGQaR{lX5i&$t5+emewSsyO5`t%dPtTnEkJ;b7_Y*K&E+tCl<5ZI>Zyjf%%w zZn7j4KU_9!dWfymvaCWi*RT>oTC-6KF@`wC;jMR|=<=w-;i!UjJ;=paJKJFEGB>JqMc8-4dZENG^(5q@=IR3Evv2b zs=uZs$ZFTMOW>nE-Rv07K3O{|sc&bV!Tw+@HzCJC`ZAewW?lRiIfF!2!S&$5nC+5I zI!lrDQBWqXmZLs8+V2MwUmtJnw@0HB!k!S;spig(OT2~azFOjO-FoUz>i<{sl$Tu` zzu9L?_jT6Wy{_w5{J38(dceIB``gW&_GV|>C-Q%)s0oLP{BM_U^o{cSo$?L)(?pke zv!X)PE;qenHnHvQ8MJo%kJpIk@qkv>F&sb+TT~@Nlc~ae;(HNeVKh`(3>0rrEoEIK zE~DpRw>euU8r3!&b*bXIU;KZuw(Hnssh{h+;wJ7M>#jpxrYd#Q^WkdzpBc9_{>L17 zTt&a4;6BA%^Tm||$CWlX<@mn-PS&eSVh2?#8NW@h+Wkt&(SndO(-j0>Wj)Unn zEn%sN+RZ?5($sN4u`s{Eeq_b~dvc8I%;<7*CiqrA%LSUtVAcqo-XU4dMc^%sO3#%VBB zjM?YCsCG4TB4QKe$)iA8ITrC;{x;SjjS)Vm?D9gvO)TjZ;J+u>NHR)j7Yhn?7%ssO#j(D8klMHB(KJZMfk&uNy% z7*g|9KG^mUQPYNHL&Q^AcdX5hN!+q;uw544uhcW(1pA%-&K17 zT$DM|>ash19G16z2KLGx;ggx3^4;N_^j^z)uU!3DjrraZZn%Gsx+tS&=9s4*JBJip zN>=?|S?#YEl(_d`{cnz}TNSI$Re%O>l;1CwcbY#}A(h;>%9`3H3a16&2X7UPA#1CJ zO5^bkqG;<`HNnU|!pKMX8 za72dUBI}k<1wX_#X#1F;+%De_?H;y?0+YAe2Bj{F>T<7qZ#9Ft`>E@#uO0T{t)A9& z0T}Y;br@CenOX64S9j%NeSH2w z*XM`!@qD>^^?MA@VrW+eT>a>cach4p!b!hXe$Abc-mYk>uM(HHxa*XO)x7!Gsh=I? zdUOPMtIVm(qBU}vK3(t!8+xsqlbf-Te}1(_zs~RW-RGt9TY=KfggCl7LB*NHpIGbcL<($uv&-JD?c=NjK5bu zz}L#FZU!<;A{zcwbIZ4+ z&!b_Cse z<`}m(pQ$)ytSJt3R;yMN(B{-DCaZ%L1V?o;o2ollR-s&+2foz4fLHsO_WB{NZE?6@$zc4x=p=&WnVsL8YQo? zGkd@^Lf(#@)p0njYqRrlVP}V1*Gt?#$K_`0&$?(auHCuWuIF5wn3+{{U76WcdgM>| zed1+(E?{YN{jl)+>xH@D68mVN-(5OKZq`6A3wM%{UZ;Lu-f-f(?=y~_*X4Q=UsP@e zj}kT4?xcN$wT!X0wM5Q4IT*Fkq7UD8s8H!*C+4K$=xV2)k7JK=l_fLyU zs1d32NKYPW>)Z1o`F>oNB4+9~rdu7pyq2k%rz`STa;KS<{&Y9Q;(FuG)sIfA-7Dg`%Ton% zK4)}@TFa%e=%cl=cV{s}t#F%sZQsB0te{#e3O%js%~^uSb6wMIu6kWBi$!r6naD(? zFBX5p>)mghgCCkBE+1Skvlr#>{Dxd#{~ykbkRA zU^%I!9BQ3=Pkn>klsZqNclARC#T8>;k_+V5vo|I0nu=XJb24fe6Bn-xnaWnxD>*$V zbt|%f$E#MUIrZvU*+$2&?!5lwi;VrtWu{`T)5nwf@vLz+c2#4H*JA448_qNDwamSD z^0nCt0+xh^ODa29a+y;WB0{laV05gr0QTmJWE_t?AL-0`!E4ox6l{h4_+MZSOc zr7xcU;q$xazvKLOpZ`et{ln+KtNYutcfmU6);bUEviPq)Qr7(U-T3omt-jD9Oy++J z`<^ZgB)st>-FH_vsMhd>aupEKX&U!C^l0mTpY0I#x$YTP0Vp!C&`%o9yONkBU2_bBjNR z`^Gx{Sy4|n)Rw2&&tX?O=uVMvmFEtTaOm@EWh%wn>6as$IIRWY6LHtYQX=|vvT^^C zM>Yn0=H8nh-F_p=w}XkFcsks5yP1EtI8-u~o4#qzFmX@wUdC^@Ys#mJLE~8RT|}k% zMwvJ9KJmk(T18c7It%HqV?LWZTuoxd_BWlzebp`Ko8b~;{Ju^|`CdT{`=733PIrTd z&fVcnd!np{Zxm$d&j)gcr`Y)0Uj2#Nf1{iQ^podKja+^*(9}!Fk#te!H+PcHY%&r~ZDD<^o=bR1KOM~cD^;;G#?p08KC|9<4_|ZKiWAivH*b8XV9c8Z zv%bIl`*UR#t2}wHyEnTq#a{3IN?9L6)xX6MKht6OWyc3!E1&;#@w%(caJE}TlKb6v zX*0x%l;14Z;8o^>zqveuLwU8IIfb_()9`zZJE*tg=^iorwRebY1l%&e%qrULcuwm3 zC@*I{am89$VmfPvz6=w^*5YSTwHXK{&B|2QW!=RQeLPHzvpLyxSJC6sHr|;wCf2#s ztD5texSe;VzT-a**t4_$ zW-kbjhL{+vlb!7gbNq50CfYYzcj36%h-Iqfu`!g&xbBRJhlQa_PNkT`RE}u1#hBDk z4O@n+)e$##CgO%->Uiv@bDM$*J>jU#p!gB5fwy8nKY^syvrgvnb=m#BW7dU;wszJ% zEBntj5&2TTaZd1wdwdn=t`oM_QRs1~?Kf_7GaS*L6*V}K!!SCA9<}EV7HEtzCL(!k z%TAf-*C#9kITxA8tKnn zDhaNNHJw)W*u!z%SyLO|j=8e07iW^Mc)sJZZ7uHMaVBc2bANG#w~Kc9Vu`iI-1oce z;X0mVXRPs0jjkSVp0vAf=ERaP)Dug($_VsuENMBGUKAYp<^v?D4w@&6+T|oJ84+kR z&4hgC{O_Ls#nNNr|16o}KlFuf{}IpHMe}>+29Lt6qNzMt-r?7E@z8gzL0?&H-57jc zTi5$?hmp>ek>SxR>z(e|V;ygkH%3g^SAA7yvD$M;Dx!j_y;`*$p03XV%g8yKg*F%c zei+A8U0s%s4oy3cS5t%|3Zk@#XedaurbIL8WiNjs3rVRF@f_D1lO2bq*xw-xey&qN z&0+Ll zJmj$aB<>oS<+yNjzDpFqbTE)T7H^7Iw~INa*R({>^Ib&7$-qp#St9J(S3w4iN8NqU zm7%)c-4Ct=5jT&tE0whoLwhEVwK?c>+SfGAGFNx;{xRfIbbP6dDfH91g%2?K0o}6v z>#Y227tE_l^2f?MZq9RjwtV{63XaMDuIrekCQdhPE+8oL#^4oim!Hpf0F+&p#d*EF zCRa7a%3X6FyC7t}J8hq~IY^V?RA^yjG;x_ny0ZMCd73U6x`WWj(?0`>@*u{?FOy=H z1|z9=boZ=*ZFIS%PMONbX_!m<09+LJX)6z0?_B>lT!V&Fj9kU#IgG6Dn3+0{k?m@Q zs~@Xj{?j$>?;i~IKw*4f{QfP)%l<2qc8J=BWq9>g=Xk!`Wo51S`z0?s#VCFK-Y9Eb zU#Gj}IrDw}F3UWN_saU=;EPJ$j*Det;G|4^k8GVA1c ztSI~MlU+Z-Pd^xuzSny@FA$H3kxE{4JdRX-JjFQLBhq;)nO6OqWnsC6F_cPADcLSR#pulHI0a-saJv@vanZe9K6ls~&Np($-IdmBS~_BVMGIk9 z9fX;M-*{i|8s2YM*+&<3uKVeAT%v1mO9v}fk5TE2iO2h@3yClu4e0mP5+2KwMF@qEU)MeRskb(A|;qYvt8-A!Rp54C-!YuELf9Mf)WzkX(R*VB5P?tQzk{nPIHV%ev#)rYma zE?uwtRGKW^Ur+0GpA$K2oV~2_qrR#gov&N36Z18bjVVuX@=Tz{%j|p!=zfK=-maz=WlFdvN=`lFQ3CrvX`}@>tPi>mnB7xfM6@)bfI-;#$^47F4yh*Xx%f&nj0cAFBTaFH#~keh@L(S$Y3$BB@=n zE+2mobM|*=9bbERDBonNTd?!FwiY_uE~$D2{rqr*AGapTC2saepw zgOiMN%;@lYWvtqo>bT>`@LJTFxhtEmCDmx6ZA#;`(~WprlLPJt@!EVa5t#D+v>0Hm>p)RGva!p!1S8h&et}wT~{=Cm@9kN zSnsO&(KE#%4)c$xJF9ST+KkGEo29-~&HSt7-?e^fT01|-ni3(V$Ix)EUWTGoX^Cs3 z$5A^CmvubX-hY)nS-aftcIkLs)o|+WYp?QZ-fi`w{$+QL8!a^nUZsy)Uaz*v`)|XZ zmg&$wJMOQs5AX0e+IGASM`pgNppL?BIO^`Ewk#ZWJXXAbxDv)^tWqPAY=I7!crUM_ zF|7<(^?}aKSPGt-K2kW<90M7%sS}RMK1W~U314MYFtN{rR29}wryMAcJ{l;xsjJ&q zGuzFJyQD|k)!^qiTkv?`Cy!w`;-k^Y>4cy63Vy(y$AyQ^^#rx^n-1)?)?bCR8hp|3{Tsib zM0-zlJ)iwge{?5Y=mN6ZxBau_=Q%s*^WCdoDer%?ifsiDJx;_1|Zi7SYb*qZl^>nRdnO;O?C2W zuYt{uxVh6cD&qBzW9!L5j1}Es72>=SQQtA^W2vHxb;{|e)t8kSk5#%)$QmZH{+SOosP0JKr%9U@a%6nREsdHAkFw0Ky zhf-0TWTciTnL~LWo#g#YO{Tk}e|J4w!_~T9dULPp1j&lb=W5J(Z0)MEHOu#g7YdHT zCKxi`qu>|L|JeCoD!uzWXBT|`QrGE2<)`^Rr{#XB;O4#ZebP~?jq9t=8RPk`JqqF; z4hjtYce1PQ&2Gr(aH``tckNXT2A6w5um;*L*Rrv!4fxwo#au;(A<2$<(c? zz4N$Udn#O%t7~=3nm!KKGoyFI_2IhkUduWP@}TK#<`><5JXW0Q&a_ZdPF+@|s;dj+ zhMgH3I-}wKNsiEHJ)Bm8`sUTagQ3i6uh?o2SHb7pYLkE zVGib}nQD$@7ow8W+|9?@<0IL7&!M-=g?Kb~W;v>lUtvWaTQAP(!$E`fDE*V?-#LfW ze`;%_)|c?55u$&*Al54#-%RKH_qusS|Hh)7fA?w^f5*#mtIQQ=65lE_C>@^6!gj9i zc6t4#(}`D~vlQR$xziprMqZ{VSvk+C%zQg0ybdpuT{9z9eoT3=oSHmM&Vt~NNk>dG zFy0h?5{?tIUPc0^Hmh^W89xrsiOzynZm#d}T_55-Pi(V&9XU7CQ^nV$E2Zm5#Z%w& z>!~s`ZkC_=)z(GapP`d>9S80|EpzVq?rv=M0%hgvA8LkH2hnR~Hl`L)S4YkytQUjT zb2WI#hlaTaX^a3*lW%PQ@@_`XYwc!Y8oS?iIGOd6yO-;!-)vKtvdV08s`b=EXST>H z!a5z0bl1|yAl+2$%kj-YQ=A^!>Uzmj=e?ab$H#^DdT#rArrxGH1BScAu@N$uR8RSZ zPj7UyVi%TLBa+XTd$zfM%@YMT^C`}WKkINu*NHnFM)o?TZmfyYYlQE)V`N*WL}X{5 zQzDGdGCZr-*^cZX8pOg1(#LIe4~9|ZmYv$H@e6X{5Y_;%L1HsM%Z$Pv{8YSVo>@8G z0pB?5?%ZZX+r^;?_pOrt4sGKw*rw9$FfQ~u5}9$!`QKHK)Np0HlaG!I-CVPePCb#X zW3>xc)?0c8+M9+~{pjM^rV8G};@Pg1ykZrR5N|bZ(68L>xLRFN)w?rx0NCTQn^TCU zF%#xxSF~d$YOw!fYWB(W`4QbFO42>wGesHczz!WDXl7gZ&^GbyG6z+40Jux~bM|-X zdf{6gh28M&>c?uh(jP5+o6E?5P|$5t?cib2ZJ!##VYKsjW7?f^3W1a4?-zXPqwy}-W2u5@p?N}Np0Nz*uGn?xuy<4nm@38*+yL7#9v5vxSxCp(1 zB6gUmCND?nWEgrpT>~B%J6SV7krAhiLa5|1;fh>D&J%|)&;+{BBUV)@cTzvfakbC% znwH>VW|8YjmGpT2<%;E$b4s1MXn6*;XXct*t?Nog#g5@R?bmj2ek3zHKj-plU(-A; zww*?;^FmU|JSGHHY+W8aiJlMs5;Qjwk-CFNn?>PpdSc?Qd*yrY=8&rl_Ok2( zn{$sBrLV^`-DkC3a{c2=qCUGyuhU=vaI-4%!<~B>ziCH(;VN?K;mPCO#h!x6*b(h9 zxH&dt|I4XU$#cu@%Rj1N#(C^jT%5R$J=1wq;=x?o<~-w4r&)SJM86txz-`#goYSn% zhW_!Yi%mPi409yw+!Jb;^qt8!UFI~4o6lXhuTR~!_#-b?yj3_2R+&yPvdHpo9A~&E zJ`;BVUSM2tP@^Q1%*n=qIbHozc2n-TD%pYnFu2o)JoabBn zE#BqTG1o+_W~azb)M_r8nH(bKa~vVbh&w-`eMNKJ=F#vEzuTQ2`);{&&lLQ-TbyL? zc4+uQ7dgD!-BUW%JLRXGUw1ma_qV2j< zjHwmB&QZ*9w)(s=X71-I7Wb@roVG*Hb*?k>i!0N~VI&xU$mQj5~`@P24Y{ zG}f?rJM0`^QyV+mikVM!En-)wH@+rnY+_q_11DpuE2tBq$*6n2xqNx%psNtsx*OCs zSDtLV9jn0e!XBGCiqmrJBqzKGR3~1|FI|kli&FKZ-4#&`caQ>#=d?0 zxt}Yufh#ksw~dk8>1W46$oO)T`{SADm7)C+(mH~4G-Vo!`#s#>u@d?Uwt+8Fcq!HK zLZ;81SsZmNwQM*5H3WMJZ>1XR8+SZ*8DDO2XIpmpxpHlvFW->2^wy2>Jb1axPTYR= z=Tl@{#bbzEI}L7j+{PhjUBmVCvmf4lyO+^-FX5I^fR8jGsKS}!-g*oIr4ms72Uj#M z^mg$9mOsa?sA0qJiu3)(NzDOGO5^}dTOBFkuC9H)1w4vo74-Aj=8?*YR9GbTs9ly+ zkGXz+;Y1^2WQwBHswBH8e4Uag>);L!5%AdY?KcZ!a`)aU8GIGA_X?)H*u}$YgfF`) z*R%4kDZ>5C`7fUTc&R`5iSxVXmp|w^$3?kXg&@ZKWSQ-WQQ~7?hkUDb2JI+%^*M)P zg|dXzzcqBG9s=`d$XP=?Z0`PW)mcmCEyPW{BKIbz<+pi??Io{DS&0ukm0CGTH#;*t z#S*>$;aOqzf+U;jDr#0`9V;BV>Fs(}YIsRsjWGP_81IIzoOMxjUxQ%2(Ghc(d(VC= z+Dyh1xOj#4&W}f~~_93<@s6CkP|n3`)U4`xKU>e${WdgG+^HuA)W7m~nPs zc+afrPnPj)v%v42pr%iS#fglk@w12@O8cJX4t*bsl@*{WnQvlfyw+o>V5?e9@*EJ} z>@$|rD>|lUH+O8a&c7~3!w?>a)rf(JpG2{%oM66^ayYZDW;NFN+gA2ZYZBu-t;xq_ zO-94bpF`axrl%e2F9buL}ZTaa=*;BZKCH^Wq!@|{a|5jo4mwNmQTD}KJ&%$J$zz27QQT6(nVR-H_M+?fp<#g z8$V8FWgHt1KXcqyt7>IA)f`qN%N!TUauu*<0oz&TRB($o;-qqg!^le%B?{pdjuI$7 z6A#NwreZMOVKIBuC#tvDgg!;rp;XHN9zV;Rs<>e$e*KPL=RrGDQtw>v#KH8bjMFUh za9q~K$MqAKehKrBpqjW=Ari%up^PA1u?8Wm^77)N;s zF{YVdyxVo4Ee~CPm+CdOW8`+GB>hL^i_=Z&Y&8G;)Z7ujr`r^LQEZ%7iufr3qF^(a z2Ce6gD^CSAZNZF8EIo~r+vik2D&Atf^ju9+8w$lmgtZk!WR2j3ftw+H*SzvRT(pP(xz`A%etWeridS2A*qr7r* ze2|mMFHaaZ>^4f_E;atSL$to_biyFiQze_*>hVF@3hE))m5vWWF#h&zJGT#^Q;>nnatY}75 zDi+|ok}Y(Hz5h1sYAK#p#sgKi*S^B9`rgOBU7v%k2+==|H?(6;T&u_MO{^+&ZJt%N z^2{WUxWgQg7{BM!2(0;h`Z3o0E*xt0WZQmapRKHX zSMQqOqDRJ@X}i__!h;$5i4vb}f3j^N9OIH21D`)!Cc4JG511v8vQ_ zUt$D2sn%7$M=#?}&zCv)`SKp)s&|Tf`a#$+QX9Rog8!arF`r5)lb4?#D|VY=`=T*Gu7>t@-FX`KAHQmp%Z4V_M)lr;0ZIYCuY9h z)r50cVxT!0gd@b7+9$8}eI++{t3=5hMTsI>U1D|R*mT~~SW6l^IiKh}saT_0&(|M( z_j;0vD$)B7x;PJUV(9AJS05TH?Q%7gNjZMHrq3PfL-ccb8G0-SpxRr?FYaHfwQ2A= z)ychylKGfqL1c7zP1N1efNSk?#XZ+`n68M?&s6r((uV%7ZBTO?_fqvP)&3o0rn#MG zsm73*ar4==mcxg-#s|iYLysPhlsjz{j8-b8Wu%hvknv1~w|ACT%V-#RBdb#c%`Xli zSu7dKZPcOZ6}8o&))mRn&=%8AczQ)t_Bh{U3A_Vci{d4NBkxAFCQWp17?2sU?y z=pi`mMTtUHJKcToIpYeYcHT3&@WX1R*A-c>PBT3**%Ol;>Ox|MZ9g6G^zph?&eI@5x`MWUH{oX zH&vghS9MMAly~Hc%d5xw!Md8K|DV0Pi`6X4&x2mR00}O*2ogd8|cnb1QI|3>x?}1hzlHQLp0=GCPgq+1`Skm%cp#9d8|@Y?u{XbhX;>`lIs{+!y%LHnFIlQ=iy!kg+= z&V!!C7tZ!FLA`FPLs~6p$S^eYH&#!)Q^~Xv_x}RPBgVlFd*5p1&`%D?P#|tXmy75EZy55wx z@~o`;*8R9VGRDWldJBtX?UYNAa$DajE5o`=)xp$%2kp!{s|*IhJaaPc@hDf6t)M1P z9&c%!r=Fi@tCiyb%Q~2&uP&`#P!}4N)%X4iZPQn$y@SuonDri=>EpBn__445ZaA~N z*RtNie7g{mqnFm|IEH(gssvhx5sexSVbW2Ow#|D-8#fw$S8YkFjY8YvBph(l3sjV%} zxE&|QuUPJ;TZVb>7O&2yx{=)nx#~XbOy_XKdH1w`u5iBBx(*;8c1Nae`))zzHg|lf zJR9?sLBbnhw`|yZHTnHiTp7FMKn z!+|ejWo;$Pfwfp?R-{aT_c!Ntr8qBF=oDy(HChi8;-$4*FYc(7?;p=+IEQhzX~^bx z_YcWzU5bX6KUU-H%s0v^Q11_g`;MULe>8q>8)bIKzpY-u^;J;*P!4ys)W~C^->!W5 z+sp;tL8J;I^s-O2f6nwMO9)6^(Ii0ies#L2~3>`X^#O@FZ7OwZ3-^K~+4%(xf z&*?eg^zlPcu;xqlL&4l^_i;|I;s+G+cKWm)X*p~TiGq>99(xd$~l&xOBf@04P%RkxkcRIgR zjltR)o}L{vUola2bPuCfaTY}`F|OR2+=pIE@qo*z$?kF+r|*X6>&im0qa%BDx)gek zT(je6e*1n*y7%EK(YSqimaL$RpxkwOI`jDOFX0o>Z}lI;EL5tcu86N9Jwd9%eY~2q zVTHte&qU>3OOY&nG52E_RUzMxVO;)bJ?sqQ>Z?R=7jMD6!dQ6=+zSqJ4E?rWD39{_ zyVD6~yBR=j<&o4OwF>PRihoiD4`&nUIJaR8rIL|XNN3daUHg~I^HgQ>Vb;!T zToT;1$rs83^6Ka{$cy8heF`r`uHC6(sC2NK8$;DGf4)>*yR#vEEu9F4S-|mQV`Ss& z9L8+Pv)?WAYQ3i4%=%L4jQ4EuXLEx+RlMS7-Id|D%XRO)1v37bHGQ@gj?1j(F0F~= zhGQj9tI|2$UPZTdE-n;4XECq+$UelAs`8eLMNdAzakB8{8pZS=p0XTsd+eTFKd(5# z&dU3!yspQ%{k$Ac?h>DB;9QHZl{NI;-P(-5i)+}C$~-%MKa1r3uWzTBW}cdL=9~O8 zcei^Hq>CLlqt~_1Yg_egX6_j6cR4+{H(H-Hb>2Q+X5iyxHe3```k)}y^i}KpGE5|O zWLyEmBRj2cjo<6N@*@y$FoM~;s(PyvC34aLu>k$o+A8gahvn)a#(VQ`V2VW{pYaI z{o-kA*L;^ob>?oWC-Zl>4ecEF7@gNMqC;#RI=NbCo9>p-GyZ(i( zS7AOF&KC?H`sh%q2Zf*L2s)a;TS#r!plV#%D6aF1l;}SeY5OyP4a@vy1MN-zmEIdABNC zioHjcqF7t0hYDdq*66WO%zn(JZpJ0n9j>QziPbN|QCQF7IlH*m*ty{roWnyaYk_>` zYwn+B277h7hMWS$R6n>v@!bw9G^_)NXlERE#i}TFapRfh-KnOJ_gr+0XhRp^X2X)g%$$$T31-_9Rr{Go&N1~^-&>B*tEn{*5q9G2W~Rym3J%VR znR~AJ-C};0ZL3cMbyWT4C%FE@ar^|O; zNX=W1{f_dt=gRNjF29SwKUIFeRen-2>y;PfZ(lF#MzrMn&F+27w%oV0g}^_y`m3v- zSpCndKfU_x&!64+{i~N&zjO6nAHBBvvDMG5er9!N^#ea@ba%5%NAb$&d7tgp?_=eR zlAjFn%2uu`245`mhEl^EJ+M1O|fi7@b4zir0k-N%ZNLP>6L zyTW;y;lpEf26kz&hc7%C_Cj9zk~4v%b_(8e$DKZIW(rg`doTjC#V$M#CwJ9Tv}!Oe z3PQ#0KK-QAqAP^ND9#FJaJN*QP2TLTeXPS0r>Go{Yb10dhD`yi}@{J1odO3>IjMj4)-(}Q59(G8|r=%#L3r^VWDcIcWa)>jI0z1$(#AvpWx!g6T;8Xx?5g#r<~QRW#>IB`{P-OJ+ZZS%kSP}jLzG#QI(Cs`1CwW zjJ+ynh(+}4ejd-PsM5|!VT^E7wR%O%AsSo7^ns`YI7BMYFa!84zN0l*<>~txHGv<{ z8o_R0Lb4vw(&wP@QoS?2zU)~;F20Rv)+=+X>{IDGnDKtKFaa!o`nVBDG&{!Q;Xb(; zkLx>TzAnXM{R6_o?1;{C9gmG*{FL@r>LQ*GnK6B1oK7cV2MktD$}{Y?e$yF+4wMXz zowLRC#&|qErzLnCj*X4N(Cl@?`3HBgaCr0e-P7P8Lo#p7?%ik z+dijFQNHM@^@=HyS`YRMyT)hRTw}gl~4r)_KAELs$~W!EToHmBL!yDOe-I zyj!l(=1BDQ?m3>Zgx|EYA@x2X$L>8M?r=v9(FwnxqaE%q_EbBB$KvUrTZhxg?An=9 zT`#w5ZxosGq0m+AMxLu{m>xojCr-t0sQErpuf;g|=_;kS= zJ&^9*`2Of;kYP?vvlD-z^ribw`S+`X=7+I5)>mSFgZOQNAN4|;V^|(Avg`*gH?PxduK1(%Yya`9Ak5`o57e|LP za(PDi^2h4oz|pJXfe9*pu3*LMTXF5L6kLNOyE)$>xz*fxUVRi-h@4Q+t9>^lIv4($ zd~rKRvFmHpJJx5~HD2y4c)XKb7OG8zAy#W&!7Sh9A%xx9lj_)PcPdAFBU zO^i;6GyA`td4=b5xMJqo7t8y+(9O7ErqfO`c4TLNp(M&W1)>UHrns8eAHO3yz8#2_HCTzQCam-z4LvTAJ`Tf?z`$Cp*cI&zvr&{ewTUJ zSN{5$T(AByT3)aIM{m!^ZVp-f{cd@^=l8Mm^`8IQ$J!!=e7dh!9(%p#pLYy5JqT-7 zY@Kf(i|IdCI4CWqx^9>3_zw@4A0Fw$#MeLF)yjN-;rR7lPa?KY7e)2`qMuH=c)Nab z{4U;Y^Lw0fM_-;9i+*xe<|j@0g`yS5+1~%eSE+9Dx$^(!ipglmw3g4_xUu@1#nbNJ zZ}{r1|LDi=+3PM-eW~}KXe-cTUFCAsmuL&VuXn#c9Ft|x)aa#RB>tyiOf0h&j|%4} zHz9@jv*k7Z%B`mgh62qMA~VP7&XJMcV%&RtNXhh_PJI!99frv-bt;@IZ07Zq@oEI2 z6JMf7##l^upQE`XW--g!(U&WhPW$G)`>pdq(HHn7W!ouOj$k-GlsP?EI3QD*V4RX2 zRmH;x#%V|qQ}aseS3yoAqjRL1oYRtWJy&^IKbKbg)jAi~kw=q`SJ~|FT$~?O$bGSB zf@Y?3ryZrPKUG?EA{vad!)mF1R7trJT2pmV%|+sj{CE_T%gfzD@09wPcZxGjHq5BR z|Mf=st2=?zJIHzDg))ntDr4k`#-G3K9pk>*{*GgJQ}w#FkCE1X=#+{MmNS=G>+u9KP$aD_QGRTIW4{SL3}NH*Y`IDAT*%b?S24{;ui6vFlxz zj(qY6yWVxG8*V?=;NPxyZB?m=E24bXXu>C*uIK2BWjFYI;T=#^mK!hmX199J%Ib^< z=w3JX_G1|O?Z_Lec}un5rhYrgTXO#VU^%9t_qdhgk$3+`UG<5I80eDsZL^JArAq6f z;N9>}m{i$hw#Iqw;b)KU7#yS+R-?$6`095yt`qo2iHcjh@ zeo%0zj)yfr)bZCxYq%=Sk?o&4j{#M0%+QC;L&M|X--q3&!0%j%e*cwWqWjASq}p|T z|4m0#Idq(;R`~G<%L@2kE`iG6f4h|GK=+qZbzxugTC7P`O?n#4@i1K!#(lROw>`=A ztYcSSyMEu0R2A_ijM>WOh_zm`r*_;u$>YNgkHPdYOTs_;xm0(qsf+1*%ZPuroXkf0*I-rnZ8}OAvEkgzIkfUp z^&Fti>M#wGa(uqrt*PC6!{+M4@9pks zyz6cy7ahjmD@XH2L7}YUR_BZ9^Ty~tr{-{q@~Lit4vC%o-mlVS*jj7D5~K788eT5H zYlYS|(JQd#rdUz@k&aiGq&zG)fGAT{0pzrr9idu@)bN_ywGWUw3mr0Y6?fNDCqn=? zZ{L4Ss(xAsD*lSE$akMH>|5#qwP)!Y248CQ zFhn9FpxWIP5IKrSjVfFtLX=capoE$Y&O;;&MpUPMDRQ~E*#n^TXf1`$|y)rK$u^pe!gn}ZvZQ*1q=bug% z=6vfFQ)GP*)q|9DwrFO~m; zVJ-bN9dp0dv7CF|^V*0xecqU5?(*3u-&0k)$}DRoX1bdlPkpUB(vac03PTl^I`~4l z!Y>z9k0Sw&Ym4>^6rmG!!3E2IyaocNn?Rvt$#g3L;jn^4#Z29IGBn z)J6qM--h0yEmHHF=*?F;>3IJd`x_6QhT-38?r&*#j6O5%i00vYt!moDf~SwGJvc-; z7_JZRMS-oIv(|k&t;{YJh8_?_HI;nBu@W(fl8qF-fU7{Ksc4H7)gVES9d>$7OIUEUe2S7!oSqXEfF?kAONPkh#_skUB+!P0u45 z1UJLhum1Dm_rWDU{n4-g=)AmsH=f@sI_Y8kE9+ft+Uml* z{*}w}ZM${=`d3R^sP{j$3Wsxe2lkxrHI^rSBh?@l@trbfq6 zd7erbsB2AI0r8Nimf>Bj*ZcU0S{ZXHt=3%|n{|a&XG>la*P!?M)Ly6g`#6Uc2T;$? zhbruDjD%q60c79F=npZ{9%e^_iXN9Kq=?HBLQCEFtg(EDnMR2kt2)bGDceY4_q8d{ zV_)BWtf}+zu5wawKCBqtDw7(7rlaGF1%rK38^`jjv+~TB%Mr@A)93vEVfU&woArK6`Rk@! zQaYu@uV`HBYB?Oe@BkSEnS&O3rBgLkUUnkgRB^nj>GLPzgE|EU!(f*9GV9U2r1-~A zR?lyDwEw%ySbVFzavjer?zQspL3pdGUL8oXDb}xC@5v3F(x#864%MiR5p4Z4hxj#& z1cq~MITutLDN7BzvbNWE8S6gG+rFZD5(*fTR8$&29zdK3YfO$?Whh1kGgM>ZRz73Q zf}B$;i!?o_C0r1~$wP8+=(^|H4)M^L@|#|z@zEnjclj~O>%;`jZVKU3J? z-(CHw)!$qF(&~>~LalxF_QYVD@bf|Nz=|~MJtxh$nw38`4}^f$TxAX8*=!v`ODj?j zT9wVvQM4V0t=z5|EH0B>6~mbG-cziXdsW%{<%7L{#lvGp)^?f72IuDFTRgCz6SdNQ zeXfjA)M_4L_a+?e-(^`e4fk>#dmcSRo7{=Qeuzzpxf6TiV|W+_E>E2<>DW1EnxnS6 z`MdE?Uq_g;jvkv3ba*yPu+yi@`{RSo%xoB*jd|v%A#D5w@w3andrUN8rg|24mM?w` zX9IQ9eL6gJs$$l&nR3a#ddHs9z6QsB6^6Y2NvFkX_w;$IV*%=Po-91&-EJjD+uR*@ zPkCt7%wN3EM(F}Zw9QA&&+yeY^ZZh`Q@mM@(OoYu3QN`d&OJ49gkx5^%)=@&ilPe1 z`V~8mi`Fw8dPaL!Q=%V{Fmz13IGojHD-^|V%u4*lZ=ygd5%jcb<4;i?W4@=#!E13* zOo7To13NF*=M)&49DSUjR>2%bTCdE-4rgfpI2PGfC)Yo76Oz_X%&gn2PNoy!xbMg1 zkJXTkIj3Xv9Y4H3-sZdK1SO}gBgiPOAG7S`sFhFH-7}<)^rOA%;)#hXdl)6VN}J-q zdS&`m1rvJhYWlcUmps#$!CbGpx%Z)ZkgG0!#UYj~Uw2+Huj}oLCHFUE3(u6@m`hr{ zPrYZ=m_bbSt{*SGApiT-A6@;e)!B_7{^*6@_0RpTJF7pw`l;1_v-)!--uvOb^{*Go zUgK^=c7U@Rzp><|xZ7XqzT<|!X$uQc{d1?wRESRf7c0 zJpqoM^V_YJEzO-)9TAePYge0bvg%=*aB}+iq3mQhH@(-UXs^vqE`O|sh;sGV$)WMl zT&D3!SUd(7xc)Dz{F&xIRt9Z%y$mE)%H>Y~7Tz-s_ylf~vJ zOs%2X#AMdgXH$k{NyKejgVlX=3OpU=&(^VRGoDV_pR@1rbozKj>wWQbIGdN_>E(~r z!-l7qsVUtq*cW#IcI8eZ;fYV&=Z*3}VN?6yUfs)IoOMUa(=x=(n$t0OVjM)nH9Jo; zs#mD3uB+dcd6rj|u^r=DGF=dl0wmur6Uza>4JgxUWiX}&*Y9yvbHi? z-v1Q1MqS6EA^&>a{AOIMS7wuHG<_Tv@#pS~YxNy7TbJ_0%O9(&j%!rT@iDrW_^V}v zh8=!tPV2$(L>X=|@mmE0b0=QC<@kThrbCeLvp0UI%=%ri@y+rXlzx@(yujPl@J-J? z296~IHe92}z%k5cLE z^ToY5o%cU2j;%Yu=41&sRSs3u=^uw6zl^vbczVWTB?EyW z8z=4{E?=yhw^U_WbmtM#@-olJcpwFk;$sWO`0*$5UI;x3_T@`N!um zJ}2>r*&_qP0qfbiO7MVk(3!vKm+Boj?pylyGZl*`MN7H_I z2_@*nobPz}c%)R|B=f6d5gmb_o?@HMPB2#P){aIG=1<3j@{TlKd37UZ%)I}UQ%&)* z&a3{Mmf$5U%ct67r(QZU$4+iG*sa6G=KNg3~Jlo76t@mk< zbS^hcy{>;pI~*%sTGczL{z@fcx`3twx^ct1I9j|H-cNfC4jL_N3@^jSHt{X7+^~wO zUZwt=+L+irC;Bg~Sl-@FJ3c2f4Qmw5R!$7nbN4z75gtN3Kf_IZP19r4HKb8fW1JNw zY#p)Uq1c>de)u@#vnA%%*;9r({gPiTIF!B?vt(lpW`ArJ0SX(!eN0HhM&g zT&yn@&1Spxm3uF0i-j7?8>RObT!RJJv*I2dWv9= z*hBkFrfd-Qf2(|ndF-UE^WXL=$J2V%H12+`^ooye(fXXLaVMamTR6P)qC~Vh*1uo4 z9hdEIDYG_RmCwsh>#F8_gf-gF-RGX(r;V_Dz3+5r?rOeVuJdNBRRN{K2upV4@=%_? z1aGtY$K9KP3ddxj;uotiwa2YhZOu}eV2es=Yrq%2V#V6=@l31T%=a8IVfyfR73LHl z&#CVGPK(13mv!vO$Uj+}-e2g>;jwZ~b{>p5dS#EkpX;9USa+q2ByBJG~s{+hy;6rTp|g zT}Oy#%I^Al*v-0DYGYK_((_de@PR8yZ$Ef}8@H9s9BMS7xLzl$KvMyytM9yRt(W4YM@w@^OeN;4J#L08Fn#*yDwr8XBT9eNgLKu4 zx@$giH_&L)9fAU5hU*Cd<;`i=`4k?LAzBW*P0mBhXG(PTrTYq13oYy8$3japZW~&* zqcoa$)F7h~&)#sXAVoTgiI9^EwL=*V2q>nOeS|aiKNu;eW1Q0U3tqukarfN(Kt;>` zoR*=b<1{<;0h)R>;X0MfK5c%v0@25um7{ky@}hhsdi2DJL*t8oB{*s(%6?3DfMe8& zY^!9WOs;?GgF#%KbMRSJ9q9o1ME6@dLEbC-t}Fp;wMOUQ^4X2w{JUPg_Zz21#H$dAQPp{*UB`<9NfOb^?}P%%tB z^*BqYS&n+Rj`a=XPQeSTbj&o&6N1vb=*sanTMrlm4x2k7>o|zbhQro1b@ed!*&Uc$ zABU64pp2vTdA`2k?AnI8Z8jGd3KWu=$Z-tEs(RmWHOwyz&gfvSP}pdQG~g6OlF{T! zku#T1H^vyA=bQhnsC>*&r{~nh-1a^qZ$MMUqjgj}AI(2m6D$?u6fKFP((yczku$ab z$i%oZkQNJ%pUNJR{hl*`e%n5$X^x>X)XT+7cfJ<=r?ZB;+dkJJ;WpiWUNl~nyC3{m z`QL_b&lYb=?i|*}wwomyr%v4K#%qjn%N-|_!&6l0inz=y_=IDOXP0O?IXpAWv#c!) zKsMDLEjqGa`%dLkdnP*ao0*wxY}jRT38z4}q1Hd-+}jvs9r4^PdCDlKk3*!kCh5x6 zJ!iAhU*9ovY-#*``C~Okx5IV+KA#DR=3-5K6)bMOW}40P?xLP)y@eTZ^)m&RKh~#- z^x}F*#l>7*tgez}>oR)Om~~vQ%kdg+M?ZCiVF!=qx?G}zVHsR3dU5b!ot3-w#@kc# z_WLMUbzXnDM0UGa+_lepRt5t7+>$1GpcuiqA6h*!&N#@v8w0Q&UvQW zJ-rHZm@2H|C;U|Z4_+BsN1Q=Cuo!x3)o~4v;VU==wu<3W8L(rDe~mp($1qaaKfFeB z7{-&ulhV?x>Xqvs$1pNJVsPeq|f|6U&)l)8{YYR;Sg@~IYC=W&SB(W1AUch~XwIoNQ` zX*a7m2z{&U$=eXRe;h(5P97ulJcX;GS!Um6gl?l5^o2S!c6j7k4$&;#F=bC(ZP(m* zB{qkG**(SYbbJ{}8HV6GOqO?`@x$%S4*jvhH9e;#2yM>D7ep^;WlHQLju!`@yg^*E zFtro1R^oEIk@L3W#4X^=u?kwAoh`ZODa!SDIz`aAJ$tty>oluiPPSZbo8#6~W2-wh zeNc`G?|r4wp>NbnV_%>zRkY+wu$X4$#%CgK18U{tHLVe)_NZ9T$eV zPLop=7Oy$>;<@-1c0#M>lJO-YjLn>%1bt~OK}Ipe@Ct21-|BF=*m0Ms{&Am?7-EdR z>zv%DzE|S6H_O=$>!XG<&3i3#z{t~Jx)25WxRyioH8QR@l(MJ7EhACmnpzP`Yn1`z zO~R7bN=tr>E$<4LQwd<2~f14;~5k!MJ{p#8ZYDfL15bbrfr}&h_Vvk#6`2#Y=ZhB735Dsq3t(zay z+Ai6Bvx-h2_D?OC*$DZ(!dc6AL2FtSl_RQ@clB2Y>6)dgdWcqGdYe6dnd9pSm)D#& z^3G>O<8+_&9IM?=Y?7H-91Dp>7HXfPkD_w!p$bSl-<;0 zhSp;J)AIZ*V!?_if^z$2oygMuV$Y&P*;%~Hd6}uFTlHZ#>k;0ZzHZeQ;pi@J)qi*S zv?X^^PhE-;z(S`Hm{CxH8I?Bv0%*=HVg6euRtJ>~e$aHOYVpWslzA#3Hx}BO?boaR zVO;g;AZ@o$@05M3@7CDTfPQuLzZ4ya2K1fPUtRsl^4(S6 zCq}Azz>8(fy+>OIdcGV_s-5nX9el;!PS+(=q#)34twAnxGglNYBg!9cPxhGCTbUGLJk=bh55)yYLyk-G6wE0u|7G5f zIs=}+ug1H&n0IDFy;Cke4~xV%IsS31w5~weS*sc}RCry5aVH20hA7k3PtS#QRK#0d zch8~SxxP>%F^xSV-72Ud#>Pk(hr|rt5f6f?+@`I3VbyqsM_TiP{Z0#meWm6jvvi2w zkjneRx}1$YRaEEd`Jbzln&Vi^q3qmV1?xS_^IQ+dK1I5#;G+7ZtRwTBx7|vZqdUx7 zN7H9*%5804PeXOJz90PFu034kb+`SD+HB;Lwmy%?DE8qAm1$?5+4bVZz6`#g>x&tJ z5oA{ytE-zBLzF`fqPU3bI-bWE>NyW}n0`07s+{3Rio?bAdcC_=l|@yy!COZ=5;fX` zvfDpacARy**{!r}=L`L{OOC&?3M0|ZCar(|kUwlkhfS)>HQt?`k8I1QUoLyOO6WMu z1GO?utr)4DZ)!br98C>BZ7wb*PeFD3Bp~8`y;Q|Iw3_}J!K7Vx?cN_1vxm)(s;*Jd zK6VvZU<(yRukcvTW~^Ubg{ZFIuWuDcWwfBH&vllr?C`-vA`@yP65F5_8-iuwhp z`8&Ju)q*JRm)}07ryM(o_G9@;Tq^K0Ek3 zj!E~;@WG*Y0M>D6o?f>tGa;{%Dh7FIewg(f6L&0Upt!~4XXMnAcb94B zwc@(aPf9+AlZunrtdEv<8gEn>te)}fism*3`^9o>&zAFfyo}*vrHjV;oTwST^}mnf zP`R(+z7TE`xA!n>=IV~~dt4+n?=O=#z4m%gxpF!c@6FHI&nqAo zEAQ$P`P7nQm8qTLO)J0GI#M+&W}YMFFdQGLPcn~O``rCm&Q8`*)=pkBxyV$#hf5^Ep&2yz?d3SFgnoS_c zb@iF`Z^qo;mqz@D-1~e}H;g{#+N*t=vKmyqsxtd*S zt`fq1y>K+1Z+9gMpZr{z;~$i1T<9ZRk+5P@R_Z&Pm{M5RbV&AV6M){{! ze}DC>tN*8P%|H0%Z~x)KQQx?;`rr@!+Asa&k9y7Syze1g^Z9}R?%?r!Vao2E0}bqe z7+oq*+8FwLIhS44-s{gf7J4S?g`VjEQP=4)&=Ypz1X$wKPeu#IHTZ*Y2@XfKg%o1H ztJ$c&%2W*V?z)~Ty|7V?gD)!2Ho6rlkBOf4m$<%`WJ1gXTvL6i3Sj)r5%zBU;a|s0 zGi+`SYG%gelgv4pV4t&#kK&jZrG1C1G_UFJp%iv!?=yyBrd&GqvUqJdw$izSS1b2o zGn%Q|4`20a-sw$zZCq10J{!^h`HZvSb*s4rtU0gg&ju@vpUjS}l0ckertz}j+FamV za;a`r)1~SlU#e}KJ60YqlNA-DGul0<*i-X%IC^VZ#y|!aoW{i!S$Tl8eZ$1uGg{d z#dVfm@4?lh757?lmhiM*q3d`5dWm-EJ*toN z894PTvZz8ov-+P_KehU^ ztN*KL@n<)FV)b9G{?h8-UH$0lUwHWst}a%;zub4ot9QpsQ^lP|?%oAdWAD+9c`nKk zzgdpd(LY(vC*8-?OHji4oSm9qS%!DZ`&0$wsq(Cs%kS!&UoEfyO80#ISMHYIzt(-~ zu_B~iJ)v3l*mF2K(~eRdPPv*^h^G!rRFqm}+Io7xsj^Wsj@zVy0-wc!6LI3T^j5FM zT2sYnERG)`)ry#S#n!c+&0evpA6=AKxzzz{`nU)c_D}D4I8^;M>r2B~xlLbEbv*UW zUjA5(G3prIq7K)n(zCDCJz#mHvL7-&QP#MX{!TX+_Q9v>^Ln;Zw};-*mQ(fV8!|^S zp*mE(+aZsxRd?@a9NP-_u2+rGX?PT42Wyn)vGPp`F^`8{g?X4%&%f>I7yHt*sVvDP zt*hQDzi8MVr)xtbxt{cWk~z|Mf$E*=d>DnHPzfjwx+}m8wY$l1o&uF>)EDh-h}+va zgS6Xo^vtw`l{)Sq-& zQWHoYNzc;szfeJF_mHXZ-7Yd^PBp7Iba712sT~2fdkva5G#Oo8vg5ALKf9uNm-|N0 z4qXA67AlUa9A}t{aP|GU!$x!~^G+3{N6ip_ou1P+q#dJjTld+Fl4jpB2i>W0^-jm3 zX!6_~FL(UutmOP;8hIi?F6E64m;IYQTVsC)N+|A}(0Ki54v#!l?DXWE-N zo&CeL<^p=EDDFOKm-3yig!=ucSC9X0J*x{pjEv{xo;@(o7vxDtieM#Ym)r(tjCZTZ zIIpeO6{#&c0W@Y2CW)(Z0RE{Wl%6crVN>8lv6X znVGNV77VS}Z%^Ruw0nzBT4yr7N6*ly(TcX)nAyKdRe0;Ork$ytyYYkN*sZYE=d7#j znTMC}JASDk)t!>%6xCmJKg)0$t7&BZ4~sMIe<-o}r(gN!XJ#v>(f3Pb_B>hU(O1fd z`jmF`&2y4mtmkavu)KdGEaeTJbVPxGtt(g;@vIzm*gplNFS%7S@`T;uGRSISs4ruMpSC z5F_Wr+U>qzeXLy{uW`k`vG#BdZi}_s3^3U@9z<7pI##ly+%~eRuo^N4&oTy(+X$sc zn|&4wPIn#qk#2cGcjMaf=C)Yv^qksA-99H-Q|RiLWj?H$;r!zZ(uGdkWrijC${v+- zS=i=EPuUIG+!v_@ou@_WR%Xcaz5{t zufwDJ@4J7$$ct`-H{sw#L9=(t*N5GRv~iHO${Czv8e`qI$i0nor@H5febXMFE?B9! z8qP6uN5qqOQT`tyCW41~kT*Ia)Jt#EV50ngyc%XNz96DBhmWr(*2q2C9-lHV+mpzB z(_PJLOxi!b8ROQOZt?@up3e0hGtZVr?uk)F+SxItc;Gtw5(&dO8VdgfW{T4pNiN(l zQF!KW>4nDIkPgq$e&J1vyNy}s^qiJp95zZb62+uD)jGyy|4lp-uVn5Pklx{NOH^df z#ao>@l*jL&ok-tb;cFbo?Q@#)(O?|Ky!DDHtF#ha?`bdWQ)43hfiwMGJkHA+TaUSy z-BsDJ#kJ-bl2yU<((#O^30m5Nb0=+_(t1v9vpI@wBv)}d ze2n@#mjl)-^LXbl*?iZ@{&Dyio-&Tkt&Jfn??TAT!OaNSa)Mm`SdH8l%7x>67P^C?-0R zstnN=eJ*uO@De^^E7TghJPlumQ&amaf~EC-~49DsD=MJ_t+acv7tob z?R@XA-ZsRooV7ZHRQOT&d|HpUo1W#9+Wd7mdYf}gFBK2lSGqgqoRuqgR^BZ+JD)ye za%~i%#~C^Kp{Wu>>4q-O2M(voF!k5T(2J7gV#K`M7$OYn9_^BMf}Th{F!tMWOv59c zR?Shx&911Dm8JF>B*z$KT*Q;;KE4fS=NO%VtdjF^Zx%=BSfQ%<=DVM%;w>C&<-*P3 z#8OkFT*tlRIyKEj3~{}x!f5ZlH_5!UEUKaO##1r9&rK8^@nfxUiU)(r;~yO^N>3_Z z?L_u5?`RcgSEduYe)B6z_gTyP>2nulRXw>Q23>znIMjJrbz|OSzV^&5@y1lA8?Ix= z?4LPbYc0;ob%K;(o5S_eTG>`%>V=@?)U#==;zHPw{~1NC{wP0NI-+o9d)7W&iUO{$#k1uTKU1#j_ucrjWgNfK&3W(H&ICVM z{+?_1nerSR2JRHRi>F%FL)}@TU7+d8xCi0#j=n<{xdOGUHS7cds}Xpf6P3G zsT6kCY8Ve$m)1^VCeO&O>#vET%z7)GHYoBi|8XyC*sJ(N?6JD1B;Kkl>6n$Ou8oxo zH>^~>~gV25-!P~8o65SYWIcTn>;UL{GFatJ7R60lQ>$=o5!Z|+u{7f^P)oA zHRM;qD=|_G&WyCnaEM`Pa2pysGw{3*}b2Vwa?AnZ#8W4%WkQC}<1daNMnm&$W*bQPZ=Jj3cxxWTjLTtRCTPT>H! z2DYoWk$8#9f+5A-JD?#YR`uQV9`>$7 zZ5)@Nlj8f+Xh46OWGpGEDuaB7=`;#)njOSG;va35nrh#OzUJ9+Zi?UR0`s(S5j8EG zS30lR%taiN-5h6gHuJd1t>Sz)@^<6jT+WLE^O^F$JD#cB+q`>w6B>r4|!OEG7~%1}!Fnso;>wJj%GyKBIebe%a4`r%C6o zad->9=~>a$a2M>dwR5+aNb8L1n%Z?nu0185itp3U%avW{Rv1LMlBm+`GX~fNc7j#K z(MxG?hIk9LKRt=OzvwWUAf_?qBD?$?-eLKxGMA>GHC5UkFLBr7<*YBtjQ^nMN7K(b zC0p7Lfj3vREzMkt_J%ItRuyq8AK6CV7Yb&4tGkx(mhR>6m#gV|2S>*7;qX)EA#m-N zImDS|INbKuQ7G~y(hCL+*MPNbjZnqRe32eaBiSSh3|FxnX59I79+>EL(QtDdk9S9~B~ju2cLwWwU4N2L^78Kz zwv9n|AxZdr;w{8~}akpswycUlaAEK;BxW%1LH;8BN zc6mUgq7fvf>J^&9D*Jl<@cnwHt~xXN$MYGUHO9%|sBHH8 z*LTcZ+pMFtJzUiN`2A!hruwImGE0nt{I2Kl0#llzy%}fElJB5CrN;uD${e7gd4F?3 zZNW6+Y-Kg3=hWtso6bpgi64g}V(N=D$MR2(j9MGzkH)66t$9e{rQkXb-Vj+p3L%HI znIU(V?8(?UW_Gmm8V|CbKS#A+jXb;NbiRlz$hmE^onE8H(#^wEQpuU)gQ>wc`;xJ3pVOwADOvZ{ zE2d74n$d`-_VN(*b~!`$uAo=Dv-CPveq~V{dDtEN(nsu>a?N*R>a*oe!q0bO-NsWG z4?p{RbhUaXeb~LjF``ga*0LNuZXCng0sCb7tyn8;Jhw%XJOHUe$L6tnj&N&H)MK8f z3MY5GuohCOlMWjE*W68UV0-^lV5<=o>Bs=DGsn%|4wYPwmuiojMOkoXM|bsmto-J$ zjnGs39 zV{Q*<<}oTly0$p;O?@xMbx}3`%=xtOG+OAm29;aL9;}Yml^vgtcr?|fj#licrvVJM z!;8l48O{%mrqY)8P9*D$%rkDO`JzLNt2->RwW-700b+|d6 z;o7whVG9;&eN%%{*^+LMRwjhSX3b{~I}CzD$?H@C(witp6dCV72Va+EkCRDXYDj9+k; zOA=-o$2P`{advu6OR!e$sU8Jf!pZxs&p$f?G_DSuAaeS_!dQ%!$4?z<`jcdrx6AU_ z*B!)pxi;-{+RRd|DQ^{2^O?rR_}vc{8tu*g`y{CPW_O$s`e7B1aiCTPG&P@k?p__$mec~9Ldsh{8n|EWicwcI8 zkFQ5i6-27^hE^?~{F+F$#(e3Y#QQ;Cl-ZF_qs564WjkchYCT_~LNTO1Au5)w^f`LO zlB#N&ifa@{`)RSNtwzja1vPTtkAGkONR4;;hlhV(MRlOMD08RH^oX|_4p9tlm$kNA zG1#T9?yD4pA&-@U_#=;>nUc#-H!0oYr&$6y)%2r*n)X;k!mTgI>bly;ts8#e;gi0O&MpWj9TyA+NBj_hAq_!E`O{}hgF;7 z{%vs&74=Z9AY*eC?y9kig`E=Ho+*87ti?7nI}F?Cw&`Qu`w?C%euU_%b1M$(J>HUS zrsLQ3wJalF`9U(eeavvc9fz^4;Qx^+WHc~g46 z=cke%2gKgyBH!h4v>w+o6UNT){_#U`ua3cfxOe#@_3+|eIGQZy6eq7nMfHP2y+iZm z+Zf#;`S2lk*bm#r`S8nMG4tZjL-OHEGeA9hU85V7px=icc66KOrym|p_d5#b(&Ov( z^7VH4`SFrZezS9mry6j19D59}=IwG!hex~@CF=g5oYi~f{5bm6u%#cqE?nQ-GjqNv z9*%-H%vLSK&UU?Els9oUmtR=h&`HD@$B)9p$H~O~&Y3Aj<~qh1Q zQQo87-?i=5j8hZarZY?(wY4L0*g7v)DhJ_Ud_|NEu3IC+|L$yzkO&{QSEZo870rV_ zIY!NG)q>WOwf%JQAhK+RrSSxDjPRw=SvWKFj1+z7uN8!c zjud3`kSfDJtYb4Z+Ow%Kl-1VxO!M>)oAYv0M&tOnyV;#t(e$tw`w%oeRs?=HGaX0W z<}B~9IquF&=iTb)>#?bjoS0@Y=aPAw{&Cz$=DRqY1DXHW>gPiCEGvk6A!`CESZUsW zPG*GP>~5*-`jJvWk=JbQ@)MtCeDF|Z9=cXPL|tdZm{T+RzUOZ8 z__t6N&icI8RoLXyoJRQ%(x-X(2zzKezdyoWt!V$MV(KB${!s7T##ygXmB;-WRa;r3 z+T~&ys!r8~)1vCjC2Ib9SNTp~e6>W)_qu)QunhK-GvfK1B`SAUgM41w@4o(=C64!6 zB@-T19q-k7GgR}A5x0w*tb$NCrVy0^>K!BUsS?yj_}i2bRx8nZC`kgkGL#c@DqFTUET5W~!2meX@;Gt0IfkvkE<4(AotzRs3Y$0SmhqfwEDBbryK z^>J?E9hyYc3wNx>NL3H34B{5Um#O>hbK1--UFGRjm@-Se*!y30^*R;w!-9Wz%3ON3 z`#<*}o8E`+S62Vo>hG<-Q||WpopL9-^YZ-NNO_n>db6urzTL%AVxoGVj&|<+`EvB{ zlw+#hVqd@UjZW)L&)vKC`|rJ5^iZotFJAHKs|Aa7n04oevrapG^ZxIUbKkqzrMhTe zrF7f9u|)7uo-!vL^>Dt^NmDyX)sh#dfr{6;jp8JtScxC40CT?P(#>|2OAx@LW~29? z6UQ&b+jt!FeSRcwMm%1sZ*LX!qvvw7IKn=ff3~YWda9g-3O*Q#(N1+zTIBlY4z<#u zZrH}1RH|lg(miZE4sl=6O4P90>(mpbOMu^GhMa*NQQa5Zr5Acfxav9f#^{J`6v_Pu zhQ|tb$Mxurjy{vlY`Gf48Dn0kp|s!n=Lp2<=7^(nr8v*L55&xF9Cg#rl>1bD=Dsy8 zylb(6(^p@W?0E|*&&t&~FSBbGTIN}ohnJAY+^Mtw>L6yW z#3q-e<6f`8p2tzQA!afW^mk}Co&VH(zDkN41xmjNIVh@--PkJN6UTDtOx8ivIgf;^ zLS$M2Ao_TDH}(b zl)D9WhdqAo4f>{GK%az_6}F}WksWt9+c)QIpD$y%&PB#6t7jsdj@y`s9dP)m*K6$2 zSYu1-!rJU2@$4>kk!M{FyZC&`YFR1AVi&`hZLD(bioP~+iLi*QxuFN+aKw{m! zi67SYGo8bzEcCAYZ^x#cq{|Hz0oxDba1HHUSiAfk#xJj$4$5|+^AmE3zRqljJ%=Ek zJ1IWb?S&WxCrom>$7U7weripk*+hUtRv}K2Ikh)ar9{Dc-Xs@FM-aW~7$ZLOZsM-= z;Yj>zgz1)5Q<^F`)7Y!cfN(@=8m=J9GotIqnvA@85FLukM9hUdnIDeT3~@$cGC6n5 z0v~mzQNEmq4Df?x70VFst#U1H7Y>sD`~Ljj)AgslC~^M9jZc*?dW~*`I$wEiI@h|A zEoA&-t6y39_p7U4E;`k(`RMG%XFvMPN1y%ZyUN#JUj5wamsWr2w%48(FP|w#um87ESB*Q$z{(U_C|xe^K$_i{jql_ zW2tMbzDAs=uXG3}>dMalM)~WVfkN$(cs0+;@l7MhZSR>c`>OTv^JR^vTj=@<=cJ-u;753p^&Fod?qnsT z&ng!d&6nbfjl@4j>A;?F4;XPe^(($=kw4Sx__SK@iw;IEXPvsN3{gmHpSyZb?X?ICUT>} z!ZXO_OoprlceHC`g?Jmj2>)Od774>rjUXnZ;fv2a?(d$3J=o*(w_K@H)ruqsy3P(Z zV_F^I=L@f-LDCiDy6IWv^szCobXDf?%G>1=o-JQrEmzq63vM>*D%xD^^2g|OSVkRi zjmMwR>Xm5SJYKGrS~Kiz`l_pw&%9Ic;pLJq{-7N16XiQU+*uiGGu=H@K39xi`Tko;H0P>LtD#Bbz;_=Z1-h zroCf_bIp4#^U+=YSdEeAYVx$JiEMPUuXiYyNZVbmp6ZZIAN@p^{oO&Wi_JLqGab%- zXLV=w(?wnUJ0GizUbPSAJyD!YpD#22c2UaDZv4hBmikTI+H9lWt#WL7ylnHhJ=xvw z!x0?|^^!?Z(<(yj*VjBQw;lCl-QzH&6FTZ4>O~pE<)Zo5`vkzb)c!&_+IQ~sg7>)- z5lu==DwiL30mUkrf>WVh6hdlRe}%S1rxn%ux-)0rv$*NwkSaRP81;suviUxt!`ZeR z_2^}M+P><&VuoX7uki@yAk|ELAiho6#iw5=Y|p)(av#8_3Ilw*s9~OD5N@@7HyA$ozJGIeG zo~$yHRtDs`a&_J;2pH|{{qCK{827n?dM_89_^tcu-L&h~CT=%exATy#sy%JxEt!eb z$(r%bd$?X`Yw2e|hc?fW_r=xVp8THw)hEgT%B18kaX#UF{$|Z2J~;)W<4wufK@7Td z&#pE{sjdjL!0K*w-=RjXL62~^N}YbPAK6=6p)s;S@%2yL#Oa>z)}4s|u}1!*9i?K- z&<3{28;r*&c;-A*+S2?v0A%#kvPLtt=g=ZBY@;SC4ci}r&Or~`ZkTG|i z+JxxS*R0Q&F=AdFmMI&JP2TCgKUco{iz`26kiSy$&VRD-#{c(g9$!b&XUnU0YkQRs zyja+x_h@6NJH_8Adx@A`??2CM$H=W`j?r{ioV-c#v!3N4A%|ICF=HOCZexrvNY+t5 z4)fIc4N(=7sI%GZ6$8_v<;(oUi;pwP_obEsPTQZw%<)uscezg7G}rI=+MhTXR=7?> zC1D<8e5R{%c&$T^)2w0d!UU;w?8q@-#}&l%6Mctz1Eb>xGY|cqtCV@k17?R&sppDJ&*_^T!+EEh_kBh@_l-F# zxiEE~*8knYCuNNBnlXl6HP#77KV6R8eTwdtDv*2S?8M}1wC;7+cpt>9{7g1vch0!Kv2s7)0CYj~dOVx4PU}s^*ZPB$ zRwDf@D^CVkgal7T^46jEgthgZX$vGz2Wm^ebBZfTh7dm6efX=e1==`W zC~TjL()FYm!CJeCdF|0QV%kaS8SWax>?!ld5XTlp*bx#bte+vh%LqD75n^@@$81#X zEUt@v!#O%D|0hbZ`{e4lN}jhZ5~*jnYYgid&L6|u+TvXB33J};l);U5$ssQl{PC85B5xW3UiT7oBL>pFB0=P za`{pYPqByn&HA;&z)Qz(A4oqu`vJ6pNp|)zlRh1$RCJizMJHYt(ZzU&KD}yu8T@@$ z*RkXB_d`03<*tt5qxQM|*nI6G7$;Ycx#8LIUs`+TlYKPNX5vgcs8!96V|NWxvKH*d zxK8#gKk-v}rsrBC+)(KwSs6FBEt~2y>)%A0{=Tg1806@6<>6J@rhwGlsK-=C(&p+_ z0XYnF>nPx@%P|+)ss+n+pJJ{$val6elrb^77#h6*UPIX+FUC$$fzB8?wu=qQwE3UX zFvX`<&TM*4OE5Po4YZ}!Ol!Ku7x)_{CuVSt=2jv?xi)Ak4uQ;ej^qmcAO0K7Bq~r# z)ww#D8|Sliw0`AJkGSu3apxvqmg=X!w)$J8Q;+qrTRS;MpPuK7V#8e@E*>{~X2&L_ zdRY6pNog5A=Q!%Lz1&I;{tS_49wXkSPFuT~&2o6t^$t_9jp%!_MgDOnI3ACQ@sfXm z%OXPg7tG6FJ#O9LXA~KuTXA?BHZSGFVZ!-7SDhYL#M3nsL-zQLsnx%ZbrWY(cgl4S z!@2_Uz4!N@en%83Ry{){ldCdR2W0DTRQQT1=DJ3O4aSO#sV92h&=8U{> zL&eLwTlbZP{&M$OZ4Bbvf4_4>+$(GC<#J5bfAGz6ta?{Rp&p~tJ_>NH#q3wYJWQ%* z+>X+*#3(ED+pNjq`k(^CnAD#@mZ(J(7yGkS<2(0(_ezYx@nUV5iSP^0gi!NU-leEC zytjh0=+R=g!n?^^TCZIHxV<5HoiRcU_lk9dYDKh}eVcP;Z7uim$7&qWUQKUl%WJ@?hViS)NCzS*UE3*EiR?k4#v5!mfhlToYMvOwa$say>M1`ocIVRgj}b0 zI=8I9!Q~}rmuo-m`K6kVw$!iWW1yX^Dc)p9q$oSuA==?vG@vjMP8~a}T@(XLh89Pm z2l*cxh>MZ#E`F97iGGBMdH+*zu){RTbRXKB%c_q!KG*?Yk}R^ ze|P}KW5qXT=W+crCRk89t=YAVNb)5#4|*Q8(ikOgi7gpn9NLUnU-v`iw*8#i@o^i$ zp;97STFR7-ax|EM=2Bb%(Jtk1#L2RGDl~XjXszDEch9mr;E&mZy-SPbEz9obDx5ak z0AV>d`R%i7|G>w;uV+GUmuJ8h+=}ni-3_W2Re#!h1%J{tmNV=qKwi-ca%#|6Wf3+<38Tik9l0w6q$*OC^|H7 zpFKoPdY}kO9F+){0%ZlHUYvGAG530m&~rt=xFek?-6JqdzXx$nhnlI-5~(fWh?|`F zl_U0#9}6`z^OmBfoeD#j3FR6ZkClAB{f%~LcS}!M5hT2^E7I2ReE6Asj;L6iE7NKO zWkrmk(O!m{{W&c`%|yB4URk7RCI_xlLKBHVNMH8mWQ@%)yMzpmT7$$gc5wSbvRJZT zu+;2qpVQUK(LM~Qc~P$C^W6+=t9++GP4|yU6+Kq^a_RH^R{3rfOx^yQP&AP?7bcaZ z$BAVOv?}T291V_WUgDT$rehnTDYilfv_h%jG*h$Q3QV7K&xnsIz2a!--WC4pQfYPL zHes^fe-4`NlcR}Jii7o631<+!^ADt#LGLk}qGd*Ae3$Fvp=lk39(k7B(Gb?*iE-*r z^BLi4vc*(53P&;;P?92ojZq)H-cK+nt|?hGufSmKsUF#cJY$z?y^8%geG<|1!Q@v| zKIJa4`T(7k5yUc6&mSk^VQf>y=TIGN^@P(61Y5pU{?&YIi)n7VH}>!|-Y)OQM|rp4 zkW4{kVC(Es?zie+l{qa##I^!y=M~pfFU9!?4@Er<=qvK7DH zE?3WcRYz&A`Yx~K<&V`+i*rtwp+KHC-gOrHy6eP<7>%r#`;u6#$rbgPBvBMLOan1q z8QK1Bo|wHnp_OEBqIs#_vd*lcs4CPek%E0n)ta^DXWEum$s|F9eEKQYQ!*>1}uBXc%t4D7=Es2D-@7`x!XFt21JEe;s-Ynz!QrR8vbg=|&NxwrC zH0R}!Lw5SFmKAiooqoy)mZ(YX{hqtJ?lyJp?T=hNK4H8f^SB$PYEnAYL>)?p1`$p2 z-6EPe*ix6k5rJ1n9i?}uNJ+jCcEK|vbqainQzTKMoM631R}-Hy-j|z;ZfMYp_p{Lth3``(s82?Y#tiHs=CsSfku=rTBu{n0huCMR`fSiAIAv$uVI^ar4l}J>zu#2WUjC@LgW1UZZ(v^!$$Kqds0o zU|OZHlr5QQOVQ}^$Le%wWPZ%mnfnSNS(VnSP8+ctk6}TuFBW!nr$a2d*0B-ni)CI7 zwT-K!pQNsT7|R?3!IJraM{$ad5sZ4AoHNasdVo*)!m*-{@Rh~!DYP{qvRI8YBP`zt2okfRoNOBT=#7{ruC~(zX-Mp$-B-0}TbGBF6cQ9!F0{KN_ z;V-y9SCsk&Y9;m3W66p7JAIN%pv92l!LRk}Q5}Z5c>4?=Fa51^w7Zn?WF=CU)bc2B zC~!#AFJvV+Dx5*@LK8Q{nIRJ*CP}9u&Kq9;_#3!v)Cuf9$Bg%!b9{Q{Ii{+>HRshy zEHlhpr>`(YnL1;vj1rZYUnIJ6DlCk+m1*T={P=$SCVQjGLUr!+98Xu>)pKm~aQeyH zeRFLe%xPJ4P(awmcio3A_^WR*jBFe~e5XHq{XQCp?W$-&-0~kd7mt15rx7N)Z zuBwX~zsKEDRhQSqOSpY|pmOWH9t414gRh+ZNmlBNAV0YngZEms2 zQUoX@r9ff#UR;O_f4V^ zx+mNF<@*O+z0wOMZ>tNv`}uN5r$6*For-8DRzoB^Vzo>=MgNWN{>4AP`o(e=<3Cxn zm|y#)pZw9Y8-KO@{Ek}5?V2-kl}B%`gMX$()ODVDuVpS&;}D;HdXYNXA!EZxM2Nim zvh%JAHZ9J~Zx|fzf`6yJBHnxoB}R_hU`G@wXVk)~F=Lya(-Ovp0b^NakjQm>PE@iS z4=qisD<+Una!#V)^t%*Sh^aAJOpe}$f2uSw6TLq#!t|WBF}7p$j;0EZ<8RSxUn^4Q zjlWKntvtFc-qnHs^Y`&qWOG(@99SnG;^&vkr@vCr_Wka9AL8e`U2uPQ*5=ug{Z2(x zJ72S}XJ$KI4&7<i8?_T$)gsbj|cT8fmHKT>0)Jf2_wVRFnI zN1MO=(VMrnlc)7hYrar!zlU%Q~@v3a=*fj_CFs-zueBhm; zL7c7KPvXfE%h+KK+5LapEY(}o^LF7L+ass(v&OO0P+K2Y?zMRUeX_2Oo?}fJ78dVyFH#!miIhZH@bFd{UwQv1-l8elVs*_r-E(@# z=wJ+1@oDhsFnz0b%W-rqeXBlRN8r%hVdmOWCLmHU3Y>lPZbv)hY#x`P*Exa?E*>!^ zQHJrg@G+w({t{n_Wz{aLMi*^(K9@pJzJ)pCn5oXM{+yP?OzAQk1v)D9`Z>v!#9u+P zulL*GtZ;Vbph%CtZ-t~22~Q;7f-@8I^KJO9u4EcBwQ;m|=Y9~bfF*cHff5THBl^Ln zhsf0O-QFyp^mfs~?%iL>t(s*$AKmLmoz<&lj((*a9|cXu%GEwEe>(;uVk5@9XCudm zj55dMoTCCc+Tkh_?Z`w^g7_4ymsAVTY$!>hc=OhZgL||9k+W=*m1Wf>8&e%!b0VXq zj4g=Bqc3aUU!!d*QeDe^?*?ao8HjkhT&Lx+5g!w@(m$6!Z9G;Uvmbdz6eSqQ&m>}1 z|7z#6pUL-8SJL6PN0%UE+=QDvMVk<@Kc{7gNX?3eif7_{H2)y9I6Nv*kd0qL{u_eZ z1L#MtjGZ8Lzv<;9|Czj@3^cDrJ2PkH;#k9bOI1W{zv8sHyk&^U2ch$<8U+#i<}TWQ ztlZ`M7gj%6RQUP5w5N)D)mCqp&oo+X#r?SVFW6UoAKtl9zP{&@?oF&>7H<0q&%O8Y z<4_}dmyzbI9?p$#muJ6MzP!#A7~Av#&@iPt=D?^oa*sdcNR~*WAuAy#u?Vq%=u(I2cM-$ zR&I+8!br@KlIgV+|8QVcddUH09~Y^3hHT0vPCGo(ssGvTVP98E2%TMpAuGT><7sm~ z_IV0_w0$wTs^)Y!^SC+Vyl@R{oD+kxk8{|^#u|IBsQ#^IW$nl{Wp+M@ez)$t-NM&H zVsFT~n|mG?L5ECtUJP#JQ!g=IS?2qrgPxTIwlfEC&00%c>@*5ZoGCVgjaj2{$%`_> zTFiPsi(;)6^WL+m1s;hD)OyEUPoo$dqG)bM$^QCP$8oR}Dreo!$IszTS}{7SWt)01 z#o2VLi*g_;aaD)-6;C4Gt5*!ZEX(M4RdC?Zb}={|Y%^xYN={rJNk$){g@v{`V(K@x zpHZ7BUqw7_bu149uqMX4%=(=fj*H%Qhkcd6PZBRmgef9kp2N5bD}GyNqUnmiI?U>N z#UGomeNtEaGIu}}uvDXC)HT+1^?Jw3dL+AP@3vp|anPn`+2Iq{9b<>TUhfY!;@Y;u zxBBv5@9_^_`^X+2m22pkI_;Y0#ap6^Y~B&C*ZkF6^R#pE>1D6^W2oMTt1_bTc&RT# z*M737_IHcFlb(`2cdj-Q7hrON!+h7Hsm;7lW+OLYoRtrA6t_>$dU^^CZrv4jN>&%0 z>zdWQ-l@-1CF)VoZRCP4SGl<=2!C(%Q0E}rb;<;3jQ=)O53k!QF@ck$yX>zrg&)o^~ZTO-q|(H}1zyZ%Ax z-~}`H;q+XTFBHyn`+f$$jr5OqUX8xCvR&ace%9E_x34#4SQ$F>EzHYqOg$fcWoY%b z>dsN4nPK)zPE(90%MW*W!nkAk{PgIMo0tFho2n=L(|aaX^*awp?oY;rbzVlP;@j~m zL*wjloHdg;2OTR{yD0HOs|sWKc-$k-Va#{st@_WjCaTY4h#$kb=Dn6xhH}}Y|Bt-l z)M>%j#wDTJGyT_+W#;cNdLnhTy>gYQ_>H$uUYdU+y;FJqyspLgcvQ!pzUeu&F)^9m zaW4;9Z#nbdR{p8Cb8Uz7FMcBGnfl}0%Ojm-oQWf^y+~5qDsRr&;*90W%|`wrN9pXR zEOwjAIkWe%a-a0|*Ig#!?SpAmg@FuQU_&CgN|kR=7gdY*Ks7Q(g={fvhT-eRFmWrtOoX!TPwP zhUl_8n%{(I^}6+sL!qGZeu!4zF*9u`qPddRW$u8HE4jYzt7AVJ1TY|nq!*2=4$zrd&YM-{(Zje?%Vvw$HBj+ zI-i?Wbf-kF=LHj{_vDPbrN()2E5@;I9VQ<;WD?8Ja6K~aIi4NeOoWM$&9Mz`EKtF#{`)^XSm6La4Uu3SteS93U8)_uB};ez2ryuT2`^~cVQhf(#<4w$Mo zW0Sji*tPsEI`I?>rY!GK$3%P2^g2v2F+R4b9{O-G!izF5w%xn)HWu!aB}r}XkV(&RIrT_)jfB?>G5P$|_KLo*J`#Rd_HW(Kb%FW*^0Qu@ zwW2hgIQ55nwe%DKvEtN*?H?H9^@RQ^o)?JunUa_Qpv=gQ+hdvKmcFTkwNRu_ij zFxUO^G~#6(DV%lPY4vJ%E#EKKv-YK!X1KTIX+-ZLZ1ElK-W3=|g{nd6U2-kyV3JNK ziO$99s*v1!g+fjdqbjP$6=&-AsZz=FsG;fTJ|~7>)_b95Xp+wwX0o>7bIrrtDk{#l zJWc<2M!_{2NAUcp^Yb+3n)lk2r-{Ni&S_l!SdAms!~4>0>S=K5IQPzt-%_sjvmFYl zrGK}}H$BneP%^-W=z(A8oPonkMGHfoE^8Dj>Sgt{^3#(yzEyCMR&}p@rT_80ZUwe8 zB^6~kJKRH!TVAi^bO(5$ywkg#KK5#PeE4qTZ1M0o$6n9q%2OrrH20B(C3GbUJRUkm zAGtT#N%$fsT>H4BE|Q`}?@mtunm-Iv52CWQA``7kS7Dh-?|*#s5xrW?`_;W%Y(SqH z0rrpQGn~U1ebyQ2rYv!N$IRBv=+n-qUjA5}3VoKauIfbRHdt5kPLEh`mXUt<#vA4P za~)fHxBO-?r@vMB(SK4{(k~Xy^sE1d=j_Hdoz`C&J@2yxQC=%EJA6&| zk-XQq|M^AfVfB1@-g7ss(8tO;uolxtrycKJbe&@Eb!V48T5ZIeK5vX=`!OnAE#yDr zX&&;0c`@%cM#WKpNhP;7?IuJ^mq*qqTNVy?F}vuH*b{dFKE_Rfb)~Od{0EeID!hz~ z=gQU@lT%RiumHs^^m6E1FisT}pK?g~4)Ui%wA{!DlDQ#5l0hMzb@v|-l} z40FtqlEY0mI{qC;Fl4lP&FFBhH;m4Gx=`t}EGwTY>Z;3<%6-UN=>zU>c&=_$z5l~V zucLw^t-0S_M=C38wuCQdB!@@p?09SJX?DQ$Nz(_?+_K8}rZ8-KpySnZFZnZFAnca7 zeeP>B#;B)Ts|WESakuMVjU$S%4(7WpTi#N zHNz%bdd%?g$L>GFN=lF8@k+A3`cEA)h|Mc$TP-ktHs%_aKU&9MNwt4D-LAFMw_RWL zRXEDLHCQ95>9g0lL>P1Wtc{On`FdT(CB|B{)wd6ixLMfm(`BFi!Q%eUUeMBm?Djf8 znvb5fnG+13HRb@jBA}{z;5x}Y*lF#sSv&aMaD~oe1KT1XxZ@w~7(;b#LoUEw#M8wk zMBTx`G1uHX2s6M~d8~0-|Lp&%4}fL9_{I1;tMBai7?$V|zPe6xBcQ4&Z^E$Ye3Ziykzitqjl-5v3s zElSXbCbc-v|lPedAA!S%l6BqBk$iXJ$dh}zWoP& z{Rhr;0-Kg5TP4-@pEGvm|q9jPUCb<|d9hTvy8x-u0w3rfwd3?XBt3$=Q zul1wlKvz0U?&`IU#1Iu@bO#2EEKWd}iucR;s5-^xRo;3hs{tCyZ~MEyKyPa!jP4Xj zoVy_yl{dt+UeO7z=xTqpJ=6*esOEq3B3l+rQ(vthAI1(`wT)rI$abwxSTuQ%|qhpIW0kA^Gn{! zzCkA(pOg4eMQM&s=353trVxKO3u~U8vjS3QHalx9Avww9`9-zUb2>faZ`YAeYXz&4 zZs%A(&dZDuV0S!+a$0wa5+wuAgXk_$uay~B-AhrqtBdKZxI?~CRE@hu+mH)?tsBc- z5rpwRBvz;z>!YqoMbU^RHDsEPz9tnvj4XmkKlOw|)YBb-0)R!zt>)fP{=$s~`!F@T z4-`pf2pCDBN)!U|uvQpz+E@XuSJkM`VQ$``swQ=@LzC(sukXIEm$d3PuH`w zX~_;HDiO2jabRwpkIqRfAKXOToO8@^oZ(K<;bgkvc@d)~zIDcS;ORM? zdWVYJaCjw`?>D*jyZsZ}@{5nsN;kSxfuXLmjf?KL(%Y)QFlUif(dsRBz0$}0`g*0; zJ<0l?R-pBdP9KBw>-|?hIV(N--!L*i{z^|SZX9)9uk`CZ{k_6RhIf#y703@V&ve`v za-aCHsuGzWL%pq~5I$ex)^C-l^^I~R@w=0~J;z5=$mP-WkisiRm=D@5yMNcO&pY$xXi3Idk5<@6W8d zA&r4!XIU+A@-+0js^ZoCY#UnFdDKT(j&7L>oNTUs9O*>3Q80b%0lL~`omO{LBJ?86;EO5u`o8STH2B0 z?XS@sjJ>&|KA?Ymv&zLw(BryKZNGY*KvcqiWocbJVN}iGI{*TQC%xn8q=eL4Fn$LSwG?)qC=opbqPHC`Xr>+iLa z7u0WMtoqcs^hsWSHOn*P2v>RkyIz0e^?m&P??I_Cm&4U%zP8=ja&ATaHm<(!{Vc1` zHeJ?+d*U)}q;}~}Ox-)EFa`>U+B?zrm^r9-5NC7Mh@^R==qYM;Wfge}y+>SB-b==i zHX`!IDe~U930I5vpTpeu?+KjB+nz-qn>nP6moVBW>urG7J?6Ddn%frJQC_(1v zRYk7U%%$3Fw?ceKAEe4@e)~~%i61I@$$RBXZC|Zvi*|CjN>SaSvPN|sFGIT_f9tWX z-Xn!tNN1R0oqImOv^eo~C!knR7Sp3ZY$O)qg;34I7Y^mzcPSp9=#XOU(?&^^rOmAX zrW!t8`T^c76^^>d+$?^#RyPBVZ=R6s1mld|Jd|6Xahv&BH1lyD`|?NWbSSrv*6`r` zle^f~GR)fC$0$g&>#huQS=W3dI>sFu`kuGr>e@N3g1Ry)4;ZsCu0L!HqR>3gyBJl! z;_vQqMrsH7$f|ptw;eO1-cU=qhcP+#OyV7+?Z_Z_2IZCJ3eEhV%8paAv8btB^A*MC z#gT1fs@JYZE;>%zSuhW$>L_GBZq`xTICc4Bbv1D6(PCD+P-@pb5>A0qx;*f%TmAFz zszo)G7adpgEn`k~O*|~fwCsKf>HL%)l0$ZRjZ25@A)jPi()%`bBUWtkw7cWE&8YKz zv!b+TZ+x+28{xwyuTR`SwJ(V~cZDltVS=wVt8s~ zg?;wWHK8^FQx=DDp1VtKn2^rh>4zHM1%F6f6SOq%nhG&Gma2=mNOEqcaqZ+D35lte zFrix|UTei@l?nBaZ)QU4zD_u|Eu);-x0wlvI;Z{Sk}phuKumNzR(v?(;ab_wClHnz zUknGo$^*In_(SrziZ`wqN}|dOkv2!bdN$TMZFBAP=d{GNHm8Hiu5vrndJ%iHSDKwv2-<>C8lz}i#jkfNus=^ia|Fl1i)f9hX*Fg> z0*A9xa5LLu$ld|_dU6WUzuRzbkG3J!)f zwt3oi6r6K^`psy#FAi=}&p0N;o}83c$#^D;a>S@qd>&0T1F0{e-g{Jkn#2>y5Ty1b zT|#6Y#T~pDx{xGVo`Zz1mzp7}#l7x`>b_84`Fhy}xvS+%y+4GCH*=|W)}!3{iBYhQ zK#v$p>QAh05vUQ+)yvTicPvpHoTMq_&JXD)3SGQH^@%ti_NCS&QDk~Q=vV`jprq;* z?>`3xr{}Z;1=Z@CC(%)+(Rrfs#UX&mo0Cf z)8Q!iVDb*9V}rXg3x{Lit~)Pp!oRHX=z7Br0LwUGowegk!d1n>%gZEOqhYw_H5z_c zB7)(ams9gN-4mv|-h)R&RlV*I>aKt8o9s@@x@o;$zTWS4&O;*R+ufbohOunB^10q= zOK-1jZ1L&R|BIVRNBSqr_uQRJr0pHt)63uN_lL*R6k}Xz=zKV=(-oiHH_I{JE%U`4 zsvYOBLY2mv$7xY{Mn8+xD{b$|yA0Xe85{myoK>9>wlL;Sm~A{0Vs@MalNHH}Iz?(S z1oTS`NozQ zY(>lIR30^X?8V)cx#`cS&39X8M7hRgeL7F(d6^|+2Jbwu5Lyxk6}`j1IMwl4SsRgn zoT7Qn6-pgR9jXdC9R*y6xoo#;pPLoaDaLQEmCjtS&d-WQY4*z})O&%9kLv2xD^h{P zCDxfaHXbGDkbXu+q2>YgUK3Xti>Qk5AbOzDu#UVVwBUWC;3QV_{&TPb&f3@R-uQNR zOxq*kR4eXxf8{wyk=!qQNJKw&DMf21P@9Z-yDOsThW zQmRp5MYx_jV9Pr}bi1T=X3y{!ab z==C~*!`R_VWgp$e4xcOB?(I%R#QHwhvDDYfUtTYH=^#QYyE6a2sN3qjhQ~JUe-r($ zVhi-Pf71M{_2H^M1}}@Eg}rGt-%Yz6EKiTeSYD zU9vsdapz#|ep#6K8|PL%RHW!@zm5Ae3)4St1ab~zw1vTaK6*DBGebACv9^=u^2e%= z5>mBxyxcJDaEeN8SIcqP(dF`;zP{-4NAGm3CThR9q@VM$Skdh}uI`Z&lGo|WB+mXkX`nORe}*{_s)4E}Pt)6-9{ zezDx~>93W044&Qio88}je)Z$4|FztE@PAzW`PH9Y{rv;HX!gj*%CS7%&F*%7^NDh7 zv?p2=6)nnBJI{Ghp7HgMpMP=VX7R8&yRlBS%axX#{wCI8U!^Jb>wO;g*yc);9}>lh z!o;$UdKin-6vP3ZB?71a@aKvNXcD3hZb^|`Vg|b=Cy9vMUv)pjKKx$K@3gM8b#&T{ zh}D(Wch);EXWuiA>Eo6AO%ZW8Dw}J|`5fxZTh2WAIp}Sv8B1npI977dv>$v>RA)rE zba-*FzH|fl|J%ElU%S#XE#Mw8;2(eql5+;dMO1TAL8yUIrK(dGr%o!dRf*k5O_i(C zsqV5}*sgR6sX_FN=AuYQEk+C%-5C-0Bv#}70+Ip5v4_^viH7C+H&r*8z$c@dU`Zv`aktN$a_{+`84kSxM1ynD!+eLaQ4SLV=M$z!~E?sFTSsh zv9A`axmT<~G|x7+zFF)B?f-h2!635FJ0!A3Nv4bRk#(~g&$r0^(gb7Qx=7J?%RM`b zwO<+LuKNlJP3qm1lJ$9czg_ie`Na3jdlL8PuT=BD`F{4d1a?rWQ~8Whv-&#`HrQ9x zV`!4jfbt~L4HKeJ{h*B~LNaAy0VqeV5;L$1WoDd}CqBFnY8Ja1ySYAShxF}gj`8dJ zT7v%mSZ)dAgFtzCL=ODRT~(FZaZu|98={dxt>ONmu3@ans>7yI znJ*5CM}>pY*>H>GZDG=>hO>tK&ia&berhBhih1wF>J*yUY3S>lyxaWNvP$ zT@hp&71|KvN!wGtedGg>` z0=OqPn)emf@9AM_>zStV{nAae^`0g1&*kW7)h_AK(cjy!#%XfSICS1L#XkG4)Bd8b zTS>-#tg^E$B4ey1i(+-~DQNOpGpS+7Xvh9S19N2DtsWL9`RK>1z{;-or&Zq}<5k}E z(=pAqU&yOWTob<;`-R!XaM~`)DQxyWOvDp1Q)-V>E9Yls*4)5pb12dx!r49(tHp3m zyFQt4(^(IvU4M2YTdz}(y)x7Q55MbqO}i>w>pSGM>(2_>oNWE$qHla$7_g4c;qh={ zZg#@c@PyclP5ox~^MrQqG%E(cFK7FA_llDI+`r_X&hd+ucA8CYFRa7>j>(Yr!OA)dyZJ>?b$C2xq%~K@ z+zj}I1yN9mcdiCBex@aU5kHeo&zEz*XT=Wn zbuH11R5;~iaa=pGCC`P?xnq8jdB^8d+IDDCD&s=bzODHe?rN=LbcqBT*fCqT2(^HMET`{Tj{&@Yby*J$3_33WSjicl8N%q z&;MD;OZmS$M?`B3>D#4W*fd&R6rP;Qr)||ztt*F$`?h?OKacJ@j`Fbnw9aIyCyyj{9N(eLQ71*e+$9b7yf6T)lvWqrG}fNB8r6CZ!(5u_ zn%ujbz}+9AP2PB20T)j?#^LayUF!%sbyc+U%-AsRbzS>+53LSz^^>i@O*(w5${-#2 zuqIL9F*C#ZWsy+pu>Ir<@c}T@DAiQ>DAS@Zq9*tm)|uWOM#HWdqT8~E*)wWa1PksklYBdNve?bW?e6}=}aeYD_VEpyrLH5VV5E$MT=7Y7^r`4Fvaix%STj*b0qn~RExIpjR+KFirXPJ8uHaVZnr zCoZ#@37(MgMc{!~2N@ynuK5?w-@Xnbw7cc#To&Uw`FH&s>F1U4$V|FS&U4z?{Vs`5 z$6~iLC{M~w)uNsq<)&q^r!%5n9Din8&ctE;ne90gQ(6!0w$}XYuJzOy&M-E3Rn?x| zb0}n(Ul#v~vV2l}o@d2JCFkYxpR1#XZ|f*~Sd843J#j)vCr7Bhl)JEd_Qd7kV>^@L z#3G*$7CDtQc6B)9cgk+LUn*=qEtQE6O3qJWNBhJHzfnHYM>9hL&lm2141wJfMhxXOuPaQ@ScTvp~MTD)(@+LaH_g1N%Pxf)AtI64vjgh>} zapr`YH<5Pv5UCTBoh#Eq&TY<#N(V-{pvjJuMJcka@=dOVcdFaA4$oF&eE3cs(bbZ{ zyfl({v)t{b)AqX8r=y4K6;s(+4_A3WedXz9sfE4x;v}+{uUVxRWki;oRG`DI__sV< z)%8ZSpUrBvw&&f-0!jDZoGKs}eEdZ6JLD9riL<8kD@iY5VLjsi@e!e%jkvb>CZc z4e6s+9jnvcR^bbA`zrhL-96uL#EaA)>-+L(g^S}%(x0CHZs}k)x2Mjd@<|_*c$`?h z9{xO(uap^2hc%V`aw+VU)=9;$uDb7B6ub3aVOPmo6USE_k^R-qIB=F;JqfhUnJ&ux zbk_{|(yke&>0yxSrhc?-UPN+J#;NMy)PAs>W1E#am{j7kPHMR2mdfm7lOb91mgM+h zQt5$~GswI{olM^8YNK0osLa`eFS;9rOI2@kX`VqcPV*-(uyRXS;IrDj9;}1c%1K_g z%G_fc-Tc>#{r*pP)7>u0h}3Vf-f$$NpcenHmVJ?xJML^xFSbk5g+A-D&yQ4$rMor8 zfV=ALUMqjF2DL!4MP+8n4o-%t?BP_SsSUy?*PiB7eV|_{yJ|^xK(|loZloOb*-mz2e!Bl|tn0V!wX_)iX-~c=dy?fIc1-zl>D?4R zwbLEabrCkH^2FD+$qlzF-tTj_rhb^a z820l}JGSzt@0#YK=8}!_uVVpPCx;;%rr)rBfg4 ztNp=+cMz+1oN;zFNFAb)8PMi=Ato zZnD|K-aYSy1x(%xo7{Pj^L*^8ExlXp!Pm$Bzg`gSPxoi9Vr=8MPX zr#p!1Io%y{#+O=7RdqN*tQ5K0>;l)c{EnWf?#8MuvcJ=-^*^jEWbjU;CWdA$n);pzdP(LcU z3>(|^pS71EZIR}4Hb6$~n)f6YNDr$gP1%{Wp7gCzcbWJZMH6cBx$Hr#Jk`o}=?DeC6fQ+vfurYu@xQ5_@bda~V(kLGjIU+T=diccbX=+cRC9g8X4&PP*7$ zFWhol#>=b4XZ+-gsM9bWvk3*G^whdUeTNald72>bOII#OcXiBuWEd2yKFP}dd7-L+!e_51;>r_Bl1 zzcc$}oWD}pde+=D@|lk@i=y38?J#iqoV)F_LhlLNPmg3XBaS9(MI^?qPUcb6K(mQK z>dr>}Gm9b`bi;H&S;7jtXKE`-?Pt=>Bk>pB&-j^WU{)YBPd=1;4Q`7(i3VC*)|e=i z--)YcG-zgGQ#CuLt&>gXu82Uk-ZQS7ub62^t-s@#5$@ZoxUbl+lTDn9CD-oJ>RsgKJQV%@OLi3k4uE9Ixq@9pyUudY7T z3LHn&|H@zb<}d%KGLKl{bs{>7jC>Q65I z*2Vw6@a|oZ`}M+tzg95&cDdi{*ZxGAp;xZ`$<=OXcQcvO>+V*u0yoR*>9Ae4BHVVD zL;T(rPj6$mbqqnor|`)RrRMS3vG&--1H@o?b`aMtaMyiou={1J!D*-szeQu^v4yRs zBamnBYZdSVy+N3VldemDJXD5tb&ny_DVKi?& zXM76B`ztV>a66XQ#yqi^bYQ|&vsU_Zm9yo=16WX)ok%%W3oqptR^P(B;0HP1J1547 zD~Ri)E7#oE!1$S#;JDRV16Jy(dCY;>aHOWH61*|F7%GK7K3|g_K@ChE773t|I z7h)s4F&&(Ae_BUa^F*or~w^N&V4BXBc?!3>OVl&(~YzB=rs1CPfiB~)j4a9|# z&ufQK^C-PCQp62$IT}UIR5>31j*1=rJr}ocm0kH(vE}@)@07IwNh`nZSh$RDUH1A{ zXC2kmGsN(pFQ3x49DNk;M`7CNEdQH2N;xo&!x@2D&<>`+Ck#~#J?d(F9`h1DO@p9T zgq7mf{vCb|4=FZNEPKwqvg7VDCnuc^P}dV!2XHm_kX$p2AMRoV{5mYa{X%JsI^5Yf zh8u_yWM*3TI!4{~+3b9=dIo2B%gjL=e=GAZ;$q3r&r!sSHk|h-9CgR(N`en zI&VrhPI%$`R7}a=enEOW81hh762bEmNJQT_H(042?d+L74foMl9-u-3gw zL4&BQ1`Z6FS$14Frz2+8$5_;g%8j3C32(=ytw6SjuV)7O&*VJcCl@!ZCo98?FTz)8i;<{wiwyfQ;Px^H)>mzww^!~VD7HcAd`NqnU>1O@4@-JgM zR!e@nbg%x$rHA!DDN4zIncc~HA2v>@yC_)pt+E2y_@GW3fp4rVFnwuLZp84aL+K?{ zUAt(g2JDKv?yHqunGxvJlvMjgHN}R8yFy%#s+bPLm^)>bzmAz>9CQ>a3Wi64^t#;v zpY4ZQTV{71kCn%7VYd?DtafV?Dra@zL~oV%brHg_Wh2ocwC88T6ASR#kc&?<@qUF= zR^i*_F5i7J)?JN)4E&r#-Jc%_YYZXN7`1YC3a(2hPpmH|G_s+xU0@X($}fUo$*v3& z&MCI?S>go@^<1OZLgM-qW)5+h=oxcY=(*rr4HU z^C_bg^w)rA&b(Qh!|}5p?KWOwI-KK6tWwVAu~$>m!ETFxc%7fbN*g=BSo&}&pMQAf zgw4UY{And0Z;#6E_7wZ=(LXzLk75qEDAuWZ#y9tw1$;E(@nA7kekz_J!b8utFW^>q zE?l)A!&CUs(8qN&REqb|b9?^wC^WrZELft#>rcFVk9xL0PfBvF!o6r(Y|tzFQdAgVhf0lmqV?a*hrcU zkl0T8etHOuEkNSzGV~x3?B{_vT{aq$JHo6n5kIjH{5$$p_;;eFkTQG!7zmcwd+J#G zQLRlZqmIn7*n9lfA%3lYXDr)v>^*C5Y3!YzhaH#=aj~g&E;Nuyo9#SVa5?CgT*c zMLmIkVIG*%DaDcq9mOg<(|VJS0&Nv)?h5dEQvv@og-$r__PlFY(yd_ZNm9 zo=brc*9d2~>+B+aK+c@T!tFbFX-C2H3yt6$HdjZc>!soD zIxlPdx*5oR-4_e3yQNqN1$nc43m&e!?PDRlgMrC7fN3lpM9A5r{FcN{usew73Ldk6 z`ycFpBs9(`+!$AgC!0%FNS>*Ug*>F8Kgq*NZbWcw_(X}4crLs%egbUF>heyjwq{Kv zCKuLAJM(HRvuIu{af_>NLc;baT%9bWii9Fk}tz^wd&%?$PHsNS=bBwM-ig{?dDHn*nX0h4kmS=2DsvWT>`A}J- zP!;2pU1D$3tzE^QTmQT@N{L-Sb4kudGB$}VQm?nyR&9acp97-A{K zp~LSfURgiU>RXPbumP_$S1lEYRg6-Rcuy4f=u%J?%M8DSnlvLbmL6t20$E(C_Vzz@ z$Svda0UFc{X|n(>hsp$acsZYvwvL1pl0)6X73lj`@w2tHsRtgo&UA-TYH~udAq3n z=3rk`oXaV<>JXdELfbjR73pWLuy3qEIgY$D3^JUOY7B!Y zXsL+g8^x#NJ*A!mZ>2T*{A1%`pMTH6!zpg*=Rv@>HrTgJHG3nz_4e!(7Q@)!f|OO` z(no@5tjT+VR5&2~f*_u}}%&71bfW#53CCCTC*p(IvPhnQe6TTeOdTFJ= z;dXzq{MK=4oz?B*^Rg(1Jc)7{YojfSK=E(Q_NS|kZl4#n`mj7HeRT?_zOvdceQq!h zp{f_x_J6Gyc3eEj3LUOM49rSWpKS$Mk$wWz{M5S=d&lWy5m<42uVi%dg87VerrK|9 z4n~Q$7^SfIss_||uAfGk4!d+fcDv7=rgK2*s7&QNZIymD+b85uP6JS zkn)6-FCtRjEH>&e=bJBMl{ZVYI=zJCqQAe&HCxIrWxLg!w|*w=GW>kE*xgn?AY6pk z#7eWyX9NC155zU;Gf+H!8AXv+FZRNQV>5Uqj>1QVGrY0n8PjcigZvwxU)ds7J=J%2 zw{x&qnO(SMMM!ryj}l%+PDE0O3#R>ZdWq&Qr1Z7Fbm z`8k~p_l*BQGsE0?yiwRPvvcbN$ImpMYs%;m73LL-@SY7;A0OX+VZvTdow}#TAgS7_ zop?ajmvxFUN12g56#pif)HH%Nd)}XG`W|}$Tkd=E$M(uUD{8Cy4xYH~5+AHaaI7Kz z*6ly_m;c|Ii3;_tN*tCVsojOq4s{)m9m4f}a#0a&r&!WmvmSXUyuV9&7ER z!M}#DVPMO93T=wJ(4?%obXyzOVAJ6#NUq6l6}hhYZ8euM)gZDqVRSM(`H*%4eV-o2 zi;t%^2V0l2(_L!$-Y)m^^>UZGn!j8+1Y}KQ4myNg|M?J8J=HoJ?#EpE8Xlc^oKb5( z`h;W@j`0$n!n$~}dNT1&#kxcts4g^MSynzh2n2=r#jKs2gIb5_`t`lPL~rE%Ct57_ z6f4@bU;NSE zJUcp)rpLX$7O$5*lrAR8u4tp`MH$!b%!k8dNA8NM>CvVanO)R*wDVZ&CRDYKvqM?< zu|AbpwOv%zG}lqAuvmND4#7-eDQ(Wkigsf{b`VbNXVJjS^D$7hpXWU{decAkfQ^+u zZif|s2 zSP_ds!L_pBIcuW=kd^a4S(NMwF6kL5#p`HTEy@^i>q^)UJM;Ow)M#{77|+x0G>7nO zeaCEyU37bs8%HFBPxkafxkaKfP44GW>6S z7cTedPWvkHQ+6N~;dB~f++Xec?5p(Sd!u|lzR#bF#aUwgwy)aL4!bIr${w6wsib>| zn(Md9-yarcUwhoWT{!>!qCzB-K{bW{)5mEOkFNdc@}BfpX6Lu7CewZAZx;`EdwtV9 zRb+V8k{tfF27+tZkFpGwWm(l2Q#*$t89cN`8bx%|J_iibrsLsC@~cFK#gaw8aU~wB zj76MKeqcOY`lrwKC%%DO(V@-KF_?NfDo0zEwN%Flu21!{s3UXvc??-=%kvoIxY0o5 zzKxl!xFjZv(^Jc+&={)Or0fwr{u%~*?-m_#%>i`pHuqJ zn60Ot>FQ@PJX(#|SOd|aV($5vV@!OntcGtDyt!S*EXu2SX)7ApIZ&5TF=SLa3P7OzNfSB#FSJ(-+U2C(D1ex1&zeobjrlIvj|i zeGJ6yXZp`Y+?u0)^NSu8Sy%N0u<`3wpYd;bV%@B)`(gdevEfRdQb^3nxM#)X&sAR? zfVhX~wDbK{KH$AFhJF4VEq?fY)YU08jGEGa$8tYw2`j|;-YUQJKz_CCcIScUi~P9! z|MrRzzPG{!y_21=L9ec7ZG5dT?8o9~+M!L~FEfVPWzDhK%Mg?Gp&GynHflIm>5Uru zW~}9#@;mUj*g6c9&Y!yaWJ17Z+&1wvu`-`-*5`55@iQ&ssEIQ0W3bTSGbJiv9VOQr z+jgyd345V-m}0AwM-gkDP6Mnrj^X+6?_qrHP*z|QvZs3c@{v8*{_Pcti-lota{2WW z<>|9oklu(-VfF`Kx_17*N*}g=d;Z@G=lx0P$M!$Z|J(Ut`0qE%ELN}kMdH7Fd{{*Z zgrpr-?T_Yi+3aJx7pj}vKANWk6tB>AIB>e;!xeiz9U0@b+E1!~#L;=XPTTO#WWdQS z3U@p_npc%nP73SNjnG^)zqz%4X1&5pL=_rqrL>s-cl-8F%if`-wRmt=^tAHO=E3lx z;&0V$`*UWz`Q=U_V1X$Nvc6~$nMFRixGg=xXTedg!a!?*7oR$;%~fHWpJ@rIvra6H z->p+j)ah7@;RJH|#4~Y);I)zGtNA&lLG}ilL^@C&g=T0;=m9wmSc#B>%4jj4eMuSrA?z@TeH0U+3GVh&$Pcsk8>w$3|Ajx zQyW+6yR5I)d&YGO$-2dS$Jejtm?au`s6Kf{i8lDKc>SAtS=N>CeDBNtd6Vn;3)`b3 zr+qn%qR;NWwChFmPP_8Ou$JlMaI%)e?#{yys6o9o_fBgXl6@`L48Z5pP-}Ek*XU3|9U%MV!Zw zj(vP|zj+_Y?4YL4S5Cxl&FRA@C;Qg=o$6t%cbo_pQ85|&Q%4A6+m@+ub3z5L>!W*} zhY%%yh$ zczEfYnfw|vPIqo2(p08K_e@Lll4RkFozP3hDmXodniBOxo~%4-KaCpX?z8%8HIFP5 z8j)2=DM_yiPiTFPpXu0o$vD0lFJkP~RQ6;p*6(w9MD#G8%2maNrFCpk5E3a{_vH_b z4sHG5gbpWk__T14$K}imr!eCv&q{CWtH8~0is*~&+=mw9YU{VHD~H_d7fKeGIH8$3 zE3-E42o~F08A(@BoZ7dXWzFRoJk5;tR=p9rvb7+=^Wk&tf4{Ija6m zbQ{Afcfi056Zn)iO`JakV-N9da!> z*_r?Ew>o5TPh;8VY7}`~8DldKxSKJTIf7v)&hIm1>X{qAbVG1`s>BjQ5)*3crqibc zbkB6+YU^m+Qj}$g-5sEJ6zD_reOSuW>beX%z^>srX3631aD%sCe~Z!7yvP1p6pv6< zE`}=m+5U$z)}0(FD-fdi?dNi)T$$4!8$pjgx*Ea5`gn)KjW3t6 zSb`ggV4E*9G0w&}gSFF1qI+_5dE>zan4kihHzgCo`~@d;2{3c%B_X~CUDo}Kti=;< znE!biUS)C518%hV25!J_mi=-zuwiT!D@Iw6ODA5;mdTwFJ%%cBCFRS|Eo7mk(wl+- zH>^q5Vjl6Fo^9ON$NQ_e9^3rNLfoK_Kx_OCha1inT_}4$S*c?BGG^q;Bo7hh%cP<7 zsoG%;pac%d7SQ)Ah}+AFdP(ja#Fe-G_F

G}UC6-xKd|JXNv^qbMFcFB;h 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 R|Bu)A{*xSwk5-K6{{wJ)P*VT^ diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/database.xml.meta b/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/database.xml.meta deleted file mode 100644 index 92e6266..0000000 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes/database.xml.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: c53b7ab773a22634bbe5c6a1ac794f54 -TextScriptImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Scene/EmuTest.unity b/AxibugEmuOnline.Client/Assets/Scene/EmuTest.unity index d9156af..adea99e 100644 --- a/AxibugEmuOnline.Client/Assets/Scene/EmuTest.unity +++ b/AxibugEmuOnline.Client/Assets/Scene/EmuTest.unity @@ -365,72 +365,3 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &8662582775744815903 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 8662582775359084755, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_AnchoredPosition.x - value: -124 - objectReference: {fileID: 0} - - target: {fileID: 8662582775359084755, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_AnchoredPosition.y - value: 109 - objectReference: {fileID: 0} - - target: {fileID: 8662582775359084756, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_IsActive - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_RootOrder - value: 3 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487076, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8662582775964487077, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} - propertyPath: m_Name - value: NesCoreProxy - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: d75df7d1f5a2c824ab5013cbd79da7a4, type: 3} diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu.meta b/AxibugEmuOnline.Client/Assets/Script/Emu.meta deleted file mode 100644 index 92efcfb..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 481b76fe04e7dcd4c9d5c89eab10343d -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/AudioProvider.cs b/AxibugEmuOnline.Client/Assets/Script/Emu/AudioProvider.cs deleted file mode 100644 index 8580c1c..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/AudioProvider.cs +++ /dev/null @@ -1,138 +0,0 @@ -using MyNes.Core; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Threading; -using UnityEngine; - -namespace AxibugEmuOnline.Client -{ - public class AudioProvider : MonoBehaviour, IAudioProvider - { - public string Name => nameof(AudioProvider); - - public string ID => Name.GetHashCode().ToString(); - - public bool AllowBufferChange => true; - - public bool AllowFrequencyChange => true; - - private bool m_isPlaying; - private bool m_started; - [SerializeField] - private NesCoreProxy m_coreProxy; - [SerializeField] - private AudioSource m_as; - - private Stopwatch sw = Stopwatch.StartNew(); - private RingBuffer _buffer = new RingBuffer(4096); - - public double FPS { get; private set; } - - public void Initialize() - { - var dummy = AudioClip.Create("dummy", 1, 1, AudioSettings.outputSampleRate, false); - - dummy.SetData(new float[] { 1 }, 0); - m_as.clip = dummy; //just to let unity play the audiosource - m_as.loop = true; - m_as.spatialBlend = 1; - m_as.Play(); - } - - float lastData = 0; - void OnAudioFilterRead(float[] data, int channels) - { - if (!m_started) return; - - int step = channels; - - var bufferCount = _buffer.Available(); - if (bufferCount < 4096) - { - NesEmu.SetFramePeriod(ref fps_nes_missle); - } - else if (bufferCount > 8124) - { - NesEmu.SetFramePeriod(ref fps_pl_faster); - } - else - { - NesEmu.RevertFramePeriod(); - } - for (int i = 0; i < data.Length; i += step) - { - float rawFloat = lastData; - if (_buffer.TryRead(out short rawData)) - rawFloat = rawData / 124f; - - data[i] = rawFloat; - for (int fill = 1; fill < step; fill++) - data[i + fill] = rawFloat; - - lastData = rawFloat; - } - } - - private TimeSpan lastElapsed; - private double fps_nes_missle; - private double fps_pl_faster; - - public void SubmitSamples(ref short[] buffer, ref int samples_a) - { - var current = sw.Elapsed; - var delta = current - lastElapsed; - lastElapsed = current; - - FPS = 1d / delta.TotalSeconds; - - for (int i = 0; i < samples_a; i++) - { - _buffer.Write(buffer[i]); - } - } - - public void TogglePause(bool paused) - { - m_isPlaying = !paused; - } - - public void GetIsPlaying(out bool playing) - { - playing = m_isPlaying; - } - - public void ShutDown() - { - } - - public void Reset() - { - } - - public void SignalToggle(bool started) - { - if (started) - { - switch (NesEmu.Region) - { - case EmuRegion.NTSC: - fps_nes_missle = 1 / 60.5d; - fps_pl_faster = 1 / 59.5d; - break; - case EmuRegion.PALB: - case EmuRegion.DENDY: - fps_nes_missle = 0.0125; - fps_pl_faster = 0.02; - break; - } - - } - m_started = started; - } - - public void SetVolume(int Vol) - { - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/AudioProvider.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Emu/AudioProvider.cs.meta deleted file mode 100644 index 8a0fe31..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/AudioProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 765129d4fad76714191795975893ea9c -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager.meta b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager.meta deleted file mode 100644 index 6136b58..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cf0f3c8610629184e9c18af05d977830 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/InputManager.cs b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/InputManager.cs deleted file mode 100644 index ff1f63f..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/InputManager.cs +++ /dev/null @@ -1,43 +0,0 @@ -using MyNes.Core; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace AxibugEmuOnline.Client.Input -{ - public class InputManager : MonoBehaviour - { - private KeyMapper m_p1Mapper = new LocalKeyMapper(); - private KeyMapper m_p2Mapper = new NetKeyMapper(); - private KeyMapper m_p3Mapper = new NetKeyMapper(); - private KeyMapper m_p4Mapper = new NetKeyMapper(); - - private void Awake() - { - m_p1Mapper.Init(); - m_p2Mapper.Init(); - m_p3Mapper.Init(); - m_p4Mapper.Init(); - } - - private void Update() - { - m_p1Mapper.Update(); - m_p2Mapper.Update(); - m_p3Mapper.Update(); - m_p4Mapper.Update(); - } - - public bool IsKeyPress(EnumJoyIndex joyIndex, EnumKeyKind keyKind) - { - switch (joyIndex) - { - case EnumJoyIndex.P1: return m_p1Mapper.IsPressing(keyKind); - case EnumJoyIndex.P2: return m_p2Mapper.IsPressing(keyKind); - case EnumJoyIndex.P3: return m_p3Mapper.IsPressing(keyKind); - case EnumJoyIndex.P4: return m_p4Mapper.IsPressing(keyKind); - default: return default; - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/InputManager.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/InputManager.cs.meta deleted file mode 100644 index 4bf3dab..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/InputManager.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: d79c33962dea7dc48b2c5fcd45afe1ad -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/KeyMapper.cs b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/KeyMapper.cs deleted file mode 100644 index 48c6add..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/KeyMapper.cs +++ /dev/null @@ -1,15 +0,0 @@ -using MyNes.Core; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -namespace AxibugEmuOnline.Client.Input -{ - public abstract class KeyMapper - { - public abstract void Init(); - public abstract void Update(); - public abstract bool IsPressing(EnumKeyKind keyKind); - - } -} diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/KeyMapper.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/KeyMapper.cs.meta deleted file mode 100644 index 7322f54..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/KeyMapper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 61e49dbcce97ff74fb117da5d69f844d -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/LocalKeyMapper.cs b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/LocalKeyMapper.cs deleted file mode 100644 index 2a61db2..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/LocalKeyMapper.cs +++ /dev/null @@ -1,72 +0,0 @@ -using MyNes.Core; -using System.Collections.Generic; -using System.Linq; -using UnityEngine; - -namespace AxibugEmuOnline.Client.Input -{ - public class LocalKeyMapper : KeyMapper - { - private Dictionary m_mapper = new Dictionary(); - private Dictionary m_mapperOpp = new Dictionary(); - private Dictionary m_keyIndexTable = new Dictionary(); - private EnumKeyKind[] m_focusKeys; - private bool[] m_keyStates; - - public override void Init() - { - SetKeyMapper(KeyCode.W, EnumKeyKind.Up); - SetKeyMapper(KeyCode.S, EnumKeyKind.Down); - SetKeyMapper(KeyCode.A, EnumKeyKind.Left); - SetKeyMapper(KeyCode.D, EnumKeyKind.Right); - SetKeyMapper(KeyCode.V, EnumKeyKind.Select); - SetKeyMapper(KeyCode.B, EnumKeyKind.Start); - SetKeyMapper(KeyCode.J, EnumKeyKind.B); - SetKeyMapper(KeyCode.K, EnumKeyKind.A); - SetKeyMapper(KeyCode.U, EnumKeyKind.TurboB); - SetKeyMapper(KeyCode.I, EnumKeyKind.TurboA); - SetComplete(); - } - - void SetKeyMapper(KeyCode inputKeycode, EnumKeyKind joyKey) - { - if (m_mapperOpp.TryGetValue(joyKey, out KeyCode keyCode))//如果该映射已设置过,移除之前的映射 - { - m_mapperOpp.Remove(joyKey); - m_mapper.Remove(keyCode); - } - m_mapper[inputKeycode] = joyKey; - m_mapperOpp[joyKey] = inputKeycode; - } - - void SetComplete() - { - m_focusKeys = m_mapperOpp.Keys.ToArray(); - m_keyStates = new bool[m_focusKeys.Length]; - - m_keyIndexTable.Clear(); - for (int i = 0; i < m_focusKeys.Length; i++) - { - m_keyIndexTable[m_focusKeys[i]] = i; - } - } - - public override void Update() - { - if (m_focusKeys == null) return; - - for (int i = 0; i < m_focusKeys.Length; i++) - { - var keyCode = m_mapperOpp[m_focusKeys[i]]; - m_keyStates[i] = UnityEngine.Input.GetKey(keyCode); - } - } - - public override bool IsPressing(EnumKeyKind keyKind) - { - if (!m_keyIndexTable.TryGetValue(keyKind, out int index)) return false;//没有设置映射,直接false - - return m_keyStates[index]; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/LocalKeyMapper.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/LocalKeyMapper.cs.meta deleted file mode 100644 index 550160a..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/LocalKeyMapper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f5ed9df7bb0a5ed4096219829b4e2f6e -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NesJoyController.cs b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NesJoyController.cs deleted file mode 100644 index e2666e0..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NesJoyController.cs +++ /dev/null @@ -1,61 +0,0 @@ -using MyNes.Core; - -namespace AxibugEmuOnline.Client -{ - public class NesJoyController : IJoypadConnecter - { - private EnumJoyIndex m_joyIndex; - private bool turbo; - - public NesJoyController(EnumJoyIndex joyIndex) - { - m_joyIndex = joyIndex; - } - public override void Update() - { - turbo = !turbo; - DATA = 0; - var state = MyNesMain.Supporter; - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.A)) - { - DATA |= 1; - } - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.B)) - { - DATA |= 2; - } - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.TurboA) && turbo) - { - DATA |= 1; - } - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.TurboB) && turbo) - { - DATA |= 2; - } - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.Select)) - { - DATA |= 4; - } - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.Start)) - { - DATA |= 8; - } - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.Up)) - { - DATA |= 16; - } - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.Down)) - { - DATA |= 32; - } - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.Left)) - { - DATA |= 64; - } - if (state.IsKeyPressing(m_joyIndex, EnumKeyKind.Right)) - { - DATA |= 128; - } - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NesJoyController.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NesJoyController.cs.meta deleted file mode 100644 index c7c1737..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NesJoyController.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: a4c763168d739ee409c2723564c2113b -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NetKeyMapper.cs b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NetKeyMapper.cs deleted file mode 100644 index 66a65a1..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NetKeyMapper.cs +++ /dev/null @@ -1,24 +0,0 @@ -using AxibugEmuOnline.Client.Input; -using MyNes.Core; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -namespace AxibugEmuOnline.Client -{ - public class NetKeyMapper : KeyMapper - { - public override void Init() - { - } - - public override void Update() - { - } - - public override bool IsPressing(EnumKeyKind keyKind) - { - return false; - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NetKeyMapper.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NetKeyMapper.cs.meta deleted file mode 100644 index a721ba3..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/InputManager/NetKeyMapper.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: 266dac4486104b64cb089b6898b46cfc -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/UguiVideoProvider.cs b/AxibugEmuOnline.Client/Assets/Script/Emu/UguiVideoProvider.cs deleted file mode 100644 index 1470ff6..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/UguiVideoProvider.cs +++ /dev/null @@ -1,142 +0,0 @@ -using MyNes.Core; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using UnityEngine; -using UnityEngine.UI; -using UnityEngine.Video; - -namespace AxibugEmuOnline.Client -{ - public class UguiVideoProvider : MonoBehaviour, IVideoProvider - { - - public string Name => "Unity UI Video"; - - public string ID => nameof(UguiVideoProvider).GetHashCode().ToString(); - - [SerializeField] - private NesCoreProxy m_coreProxy; - [SerializeField] - private RawImage m_drawCanvas; - [SerializeField] - private Text m_fpsText; - [SerializeField] - private Text m_nofity; - - private Color[] m_texRawBuffer = new Color[256 * 240]; - private Texture2D m_rawBufferWarper; - private RenderTexture m_drawRT; - private Color temp = Color.white; - - private bool toggleOn; - - public void Initialize() - { - m_rawBufferWarper = new Texture2D(256, 240); - } - - public void GetColor(uint value, ref Color res) - { - var r = 0xFF0000 & value; - r >>= 16; - var b = 0xFF & value; - var g = 0xFF00 & value; - g >>= 8; - res.r = r / 255f; - res.g = g / 255f; - res.b = b / 255f; - } - - public void Update() - { - if (toggleOn) - { - if (!m_drawCanvas.enabled) m_drawCanvas.enabled = true; - var colors = m_texRawBuffer; - m_rawBufferWarper.SetPixels(colors); - m_rawBufferWarper.Apply(); - Graphics.Blit(m_rawBufferWarper, m_drawCanvas.texture as RenderTexture); - - m_fpsText.text = $"fps:{m_coreProxy.AudioCom.FPS:00.00}"; - } - else - { - if (m_drawCanvas.enabled) m_drawCanvas.enabled = false; - } - } - - public void WriteErrorNotification(string message, bool instant) - { - m_nofity.text = message; - } - - public void WriteInfoNotification(string message, bool instant) - { - m_nofity.text = message; - } - - public void WriteWarningNotification(string message, bool instant) - { - m_nofity.text = message; - } - - public void TakeSnapshotAs(string path, string format) - { - - } - - public void TakeSnapshot() - { - - } - - public void ShutDown() - { - } - - public void SignalToggle(bool started) - { - toggleOn = started; - } - - public void SubmitFrame(ref int[] buffer) - { - for (int i = 0; i < buffer.Length; i++) - { - GetColor((uint)buffer[i], ref temp); - m_texRawBuffer[i] = temp; - } - } - - public void ResizeBegin() - { - } - - public void ResizeEnd() - { - } - - public void ApplyRegionChanges() - { - } - - public void Resume() - { - } - - public void ToggleAspectRatio(bool keep_aspect) - { - } - - public void ToggleFPS(bool show_fps) - { - } - - public void ApplyFilter() - { - } - - } -} diff --git a/AxibugEmuOnline.Client/Assets/Script/Emu/UguiVideoProvider.cs.meta b/AxibugEmuOnline.Client/Assets/Script/Emu/UguiVideoProvider.cs.meta deleted file mode 100644 index 249242e..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/Emu/UguiVideoProvider.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: f2632911774df3c488ec24b39651c4de -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs index aee4b3c..46f3d2c 100644 --- a/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppEmu.cs @@ -1,67 +1,10 @@ -锘縰sing AxibugEmuOnline.Client.Input; -using MyNes.Core; -using System.IO; +锘縰sing System.IO; using UnityEngine; namespace AxibugEmuOnline.Client.Manager { - public class AppEmu : IExternalSupporter + public class AppEmu { - private InputManager m_inputMgr; - - public void Init(IVideoProvider videoCom, IAudioProvider audioCom, InputManager inputManager) - { - m_inputMgr = inputManager; - - MyNesMain.Initialize(this, videoCom, audioCom); - NesEmu.SetupControllers( - new NesJoyController(EnumJoyIndex.P1), - new NesJoyController(EnumJoyIndex.P2), - new NesJoyController(EnumJoyIndex.P3), - new NesJoyController(EnumJoyIndex.P4)); - - } - - public bool LoadGame(string romName) - { - NesEmu.LoadGame(romName, out var successed, true); - return successed; - } - - public void Dispose() - { - MyNesMain.Shutdown(); - } - - public Stream OpenDatabaseFile() - { - var databaseFile = Resources.Load("NesCoreRes/database"); - MemoryStream ms = new MemoryStream(databaseFile.bytes); - return ms; - } - - public Stream OpenPaletteFile() - { - var defaultPalett = Resources.Load("NesCoreRes/Palettes/default_ntsc.pal"); - MemoryStream ms = new MemoryStream(defaultPalett.bytes); - return ms; - } - - public string GetWorkingFolderPath() - { - return $"{Application.persistentDataPath}/MyNes"; - } - - public Stream OpenRomFile(string path) - { - var ta = Resources.Load($"Roms/{path}"); - MemoryStream ms = new MemoryStream(ta.bytes); - return ms; - } - - public bool IsKeyPressing(EnumJoyIndex index, EnumKeyKind key) - { - return m_inputMgr.IsKeyPress(index, key); - } + } } diff --git a/AxibugEmuOnline.Client/Assets/Script/Manager/AppNetGame.cs b/AxibugEmuOnline.Client/Assets/Script/Manager/AppNetGame.cs index 17e1300..a576bc8 100644 --- a/AxibugEmuOnline.Client/Assets/Script/Manager/AppNetGame.cs +++ b/AxibugEmuOnline.Client/Assets/Script/Manager/AppNetGame.cs @@ -3,7 +3,6 @@ using AxibugEmuOnline.Client.Common; using AxibugEmuOnline.Client.Network; using AxibugProtobuf; using Google.Protobuf; -using MyNes.Core; using System.IO; using System.IO.Compression; using System.Linq; @@ -18,7 +17,6 @@ namespace AxibugEmuOnline.Client.Manager public AppNetGame() { NetMsg.Instance.RegNetMsgEvent((int)CommandID.CmdScreen, OnScreen); - _palette = NTSCPaletteGenerator.GeneratePalette(); } Protobuf_Screnn_Frame _Protobuf_Screnn_Frame = new Protobuf_Screnn_Frame(); diff --git a/AxibugEmuOnline.Client/Assets/Script/NesCoreProxy.cs b/AxibugEmuOnline.Client/Assets/Script/NesCoreProxy.cs deleted file mode 100644 index 122b411..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/NesCoreProxy.cs +++ /dev/null @@ -1,30 +0,0 @@ -using AxibugEmuOnline.Client.Input; -using AxibugEmuOnline.Client.Manager; -using MyNes.Core; -using System.IO; -using UnityEngine; -using UnityEngine.UI; - -namespace AxibugEmuOnline.Client -{ - public class NesCoreProxy : MonoBehaviour - { - public UguiVideoProvider VideoCom; - public AudioProvider AudioCom; - public InputManager InputManager; - - private AppEmu m_appEnum = new AppEmu(); - - private void Start() - { - m_appEnum.Init(VideoCom, AudioCom, InputManager); - - m_appEnum.LoadGame("kirby.nes"); - } - - private void OnDestroy() - { - m_appEnum.Dispose(); - } - } -} diff --git a/AxibugEmuOnline.Client/Assets/Script/NesCoreProxy.cs.meta b/AxibugEmuOnline.Client/Assets/Script/NesCoreProxy.cs.meta deleted file mode 100644 index 5487bae..0000000 --- a/AxibugEmuOnline.Client/Assets/Script/NesCoreProxy.cs.meta +++ /dev/null @@ -1,11 +0,0 @@ -fileFormatVersion: 2 -guid: ac8cd27a180bf3e489b2ca27c821bffe -MonoImporter: - externalObjects: {} - serializedVersion: 2 - defaultReferences: [] - executionOrder: 0 - icon: {instanceID: 0} - userData: - assetBundleName: - assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core.meta similarity index 77% rename from AxibugEmuOnline.Client/Assets/MyNes.Core.meta rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core.meta index 433ca4b..e529317 100644 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core.meta +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 42793fd3c4b41384983c8c2551603557 +guid: 2c5bcc6d5df67f04d93e0ab812c36b4e folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/APU.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/APU.cs new file mode 100644 index 0000000..02be71c --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/APU.cs @@ -0,0 +1,62 @@ +锘縰sing Codice.CM.Common; +using System; +using System.Collections; + +namespace VirtualNes.Core +{ + public class APU + { + private NES nes; + private byte exsound_select; + private APU_INTERNAL @internal; + private int last_data; + private int last_diff; + protected short[] m_SoundBuffer = new short[256]; + protected int[] lowpass_filter = new int[4]; + protected QUEUE queue; + protected QUEUE exqueue; + protected bool[] m_bMute = new bool[16]; + + public APU(NES parent) + { + exsound_select = 0; + + nes = parent; + @internal.SetParent(parent); + + last_data = last_diff = 0; + + Array.Clear(m_SoundBuffer, 0, m_SoundBuffer.Length); + Array.Clear(lowpass_filter, 0, lowpass_filter.Length); + queue = QUEUE.GetDefault(); + exqueue = QUEUE.GetDefault(); + + for (int i = 0; i < m_bMute.Length; i++) + m_bMute[i] = true; + } + } + + public struct QUEUEDATA + { + public int time; + public ushort addr; + public byte data; + public byte reserved; + } + + public struct QUEUE + { + public int rdptr; + public int wrptr; + QUEUEDATA[] data; + + public static QUEUE GetDefault() + { + var res = new QUEUE(); + res.rdptr = 0; + res.wrptr = 0; + res.data = new QUEUEDATA[8192]; + return res; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankJoypad.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/APU.cs.meta similarity index 83% rename from AxibugEmuOnline.Client/Assets/MyNes.Core/BlankJoypad.cs.meta rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core/APU.cs.meta index afba8a6..220749a 100644 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BlankJoypad.cs.meta +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/APU.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d122941c868588e4e9fdb758ff7bd340 +guid: cb5a8e579d35b9a4ca7966225235265a MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX.meta similarity index 77% rename from AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib.meta rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX.meta index 05c18cf..1ce615d 100644 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/ComponentAce.Compression.Libs.zlib.meta +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: d8b8249d0e1fe314787bfc6d8a22318f +guid: e6179c4bc7e6fa744901b21b63e98aba folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERFACE.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERFACE.cs new file mode 100644 index 0000000..14f7d8b --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERFACE.cs @@ -0,0 +1,28 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VirtualNes.Core +{ + public abstract class APU_INTERFACE + { + public abstract void Reset(float fClock, int nRate); + public abstract void Setup(float fClock, int nRate); + public abstract void Write(ushort addr, byte data); + public abstract int Process(int channel); + public virtual byte Read(ushort addr) + { + return (byte)(addr >> 8); + } + public virtual void WriteSync(ushort addr, byte data) { } + public virtual byte ReadSync(ushort addr) { return 0; } + public virtual void VSync() { } + public virtual bool Sync(int cycles) { return false; } + public virtual int GetFreq(int channel) { return 0; } + public virtual int GetStateSize() { return 0; } + public virtual void SaveState(byte[] p) { } + public virtual void LoadState(byte[] p) { } + } +} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfo.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERFACE.cs.meta similarity index 83% rename from AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfo.cs.meta rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERFACE.cs.meta index cc2618b..fdd8b0c 100644 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfo.cs.meta +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERFACE.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e9cec9f263a14d640885246190006795 +guid: cc44be42b66d6ac4aade437e81960274 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERNAL.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERNAL.cs new file mode 100644 index 0000000..afb9abc --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERNAL.cs @@ -0,0 +1,32 @@ +namespace VirtualNes.Core +{ + public class APU_INTERNAL : APU_INTERFACE + { + private NES nes; + + public void SetParent(NES parent) + { + nes = parent; + } + + public override void Reset(float fClock, int nRate) + { + throw new System.NotImplementedException(); + } + + public override void Setup(float fClock, int nRate) + { + throw new System.NotImplementedException(); + } + + public override void Write(ushort addr, byte data) + { + throw new System.NotImplementedException(); + } + + public override int Process(int channel) + { + throw new System.NotImplementedException(); + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Bandai.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERNAL.cs.meta similarity index 83% rename from AxibugEmuOnline.Client/Assets/MyNes.Core/Bandai.cs.meta rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERNAL.cs.meta index 44f5f1c..116b105 100644 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Bandai.cs.meta +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ApuEX/APU_INTERNAL.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 449c08ab39c9dd440b660ac2d12fb8ff +guid: d5f443ad7d5ef1d4394c7fe540f2e3e4 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CHEATCODE.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CHEATCODE.cs new file mode 100644 index 0000000..aaf5b92 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CHEATCODE.cs @@ -0,0 +1,6 @@ +锘縩amespace VirtualNes.Core +{ + public class CHEATCODE + { + } +} diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfoSorter.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CHEATCODE.cs.meta similarity index 83% rename from AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfoSorter.cs.meta rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core/CHEATCODE.cs.meta index 8278d2a..6f40389 100644 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/BankInfoSorter.cs.meta +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CHEATCODE.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2d41e03bf8974044fadc0b1cbcf7811e +guid: 5494fe2d7f568c5498880bcb5625e21e MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CPU.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CPU.cs new file mode 100644 index 0000000..e2780ad --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CPU.cs @@ -0,0 +1,56 @@ +锘縩amespace VirtualNes.Core +{ + public class CPU + { + protected NES m_nes; + + public CPU(NES parent) + { + m_nes = parent; + } + } + + public enum StatusFlag6502 : int + { + C_FLAG = 0x01, + Z_FLAG = 0x02, + I_FLAG = 0x04, + D_FLAG = 0x08, + B_FLAG = 0x10, + R_FLAG = 0x20, + V_FLAG = 0x40, + N_FLAG = 0x80 + } + + public enum Interrupt : int + { + NMI_FLAG = 0x01, + IRQ_FLAG = 0x02, + IRQ_FRAMEIRQ = 0x04, + IRQ_DPCM = 0x08, + IRQ_MAPPER = 0x10, + IRQ_MAPPER2 = 0x20, + IRQ_TRIGGER = 0x40, + IRQ_TRIGGER2 = 0x80, + IRQ_MASK = (~(NMI_FLAG | IRQ_FLAG)), + } + + public enum Vector : int + { + NMI_VECTOR = 0xFFFA, + RES_VECTOR = 0xFFFC, + IRQ_VECTOR = 0xFFFE + } + + public struct R6502 + { + ushort PC; + byte A; + byte P; + byte X; + byte Y; + byte S; + + byte Int_Pending; + } +} \ No newline at end of file diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CPU.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CPU.cs.meta new file mode 100644 index 0000000..c59b49a --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/CPU.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 055e668755423bf4dabeb6cc007bce76 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Debuger.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Debuger.cs new file mode 100644 index 0000000..8845558 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Debuger.cs @@ -0,0 +1,26 @@ +锘縩amespace VirtualNes.Core.Debug +{ + public static class Debuger + { + private static IDebugerImpl s_debuger; + public static void Setup(IDebugerImpl debuger) + { + s_debuger = debuger; + } + public static void Log(string message) + { + s_debuger.Log(message); + } + + public static void LogError(string message) + { + s_debuger.LogError(message); + } + } + + public interface IDebugerImpl + { + void Log(string message); + void LogError(string message); + } +} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Debuger.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Debuger.cs.meta new file mode 100644 index 0000000..5ad16c9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Debuger.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7dbca4403bc49f347a8b36f230364226 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper.meta similarity index 77% rename from AxibugEmuOnline.Client/Assets/Resources/NesCoreRes.meta rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper.meta index 8030677..5aa92e7 100644 --- a/AxibugEmuOnline.Client/Assets/Resources/NesCoreRes.meta +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: e2c2fc792e914ba4da5671edcb233994 +guid: 351e90d17a844b44f869f7c59fd1efb6 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper/Mapper.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper/Mapper.cs new file mode 100644 index 0000000..77eabba --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper/Mapper.cs @@ -0,0 +1,12 @@ +锘縰sing System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace VirtualNes.Core +{ + public class Mapper + { + } +} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper/Mapper.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper/Mapper.cs.meta new file mode 100644 index 0000000..dac6129 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Mapper/Mapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9c095219b80f9234fb1a9a87f6fbf004 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs new file mode 100644 index 0000000..b5e2d22 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.IO; +using VirtualNes.Core.Debug; + +namespace VirtualNes.Core +{ + public class NES + { + public CPU cpu; + public PPU ppu; + public APU apu; + public ROM rom; + public PAD pad; + public Mapper mapper; + public NesConfig NesCfg; + + protected List m_CheatCode = new List(); + + private bool m_bDiskThrottle; + private int m_CommandRequest; + private int m_nSnapNo; + private bool m_bNsfPlaying; + private bool m_bMoviePlay; + private bool m_bMovieRec; + private Stream m_fpMovie; + private bool m_bTapePlay; + private bool m_bTapeRec; + private Stream m_fpTape; + private double m_TapeCycles; + private byte m_TapeIn; + private byte m_TapeOut; + private bool m_bBarcode2; + private int m_TurboFileBank; + private int SAVERAM_SIZE; + private int nIRQtype; + private bool bFrameIRQ; + private bool bVideoMode; + + public NES(string fname) + { + Debuger.Log("VirtuaNES - CSharpCore\n"); + + m_bDiskThrottle = false; + m_CommandRequest = 0; + + m_nSnapNo = 0; + + m_bNsfPlaying = false; + + m_bMoviePlay = m_bMovieRec = false; + m_fpMovie = null; + + m_bTapePlay = m_bTapeRec = false; + m_fpTape = null; + m_TapeCycles = 0d; + m_TapeIn = m_TapeOut = 0; + + m_bBarcode2 = false; + + m_TurboFileBank = 0; + + cpu = null; + ppu = null; + apu = null; + rom = null; + pad = null; + mapper = null; + + SAVERAM_SIZE = 8 * 1024; + + nIRQtype = 0; + + bFrameIRQ = true; + + bVideoMode = false; + + NesCfg = NesConfig.GetNTSC(); + + CheatInitial(); + + try + { + Debuger.Log("Allocating CPU..."); + cpu = new CPU(this); + + Debuger.Log("Allocating PPU..."); + ppu = new PPU(this); + + Debuger.Log("Allocating APU..."); + apu = new APU(this); + + Debuger.Log("Allocating PAD..."); + pad = new PAD(this); + + Debuger.Log("Loading ROM Image..."); + + rom = new ROM(fname); + } + catch (Exception ex) + { + Debuger.LogError(ex.ToString()); + } + } + + public void CheatInitial() + { + m_CheatCode.Clear(); + } + } + + public struct NesConfig + { + public float BaseClock; // NTSC:21477270.0 PAL:21281364.0 + public float CpuClock; // NTSC: 1789772.5 PAL: 1773447.0 + + public int TotalScanLines; // NTSC: 262 PAL: 312 + + public int ScanlingCycles; // NTSC:1364 PAL:1362 + + public int HDrawCycles; // NTSC:1024 PAL:1024 + public int HBlankCycles; // NTSC: 340 PAL: 338 + public int ScanlineEndCycles; // NTSC: 4 PAL: 2 + + public int FrameCycles; // NTSC:29829.52 PAL:35468.94 + public int FrameIrqCycles; // NTSC:29829.52 PAL:35468.94 + + public int FrameRate; // NTSC:60(59.94) PAL:50 + public float FramePeriod; // NTSC:16.683 PAL:20.0 + + public static NesConfig GetNTSC() + { + return new NesConfig + { + BaseClock = 21477270.0f, + CpuClock = 1789772.5f, + TotalScanLines = 262, + ScanlingCycles = 1364, + HDrawCycles = 1024, + HBlankCycles = 340, + ScanlineEndCycles = 4, + FrameCycles = 1364 * 262, + FrameIrqCycles = 29830, + FrameRate = 60, + FramePeriod = 1000.0f / 60.0f + }; + } + + public static NesConfig GetPAL() + { + return new NesConfig + { + BaseClock = 26601714.0f, + CpuClock = 1662607.125f, + TotalScanLines = 312, + ScanlingCycles = 1278, + HDrawCycles = 960, + HBlankCycles = 318, + ScanlineEndCycles = 2, + FrameCycles = 1278 * 312, + FrameIrqCycles = 33252, + FrameRate = 50, + FramePeriod = 1000.0f / 50.0f + }; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs.meta new file mode 100644 index 0000000..291ca81 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/NES.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 91459a62d37e6c049b384af2e8e6a47d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PAD.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PAD.cs new file mode 100644 index 0000000..a71c5b3 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PAD.cs @@ -0,0 +1,48 @@ +锘縩amespace VirtualNes.Core +{ + public class PAD + { + protected NES nes; + protected int excontroller_select; + protected EXPAD expad; + protected bool bStrobe; + protected bool bSwapButton; + protected bool bSwapPlayer; + protected bool bZapperMode; + protected VSType nVSSwapType; + protected byte[] padbit = new byte[4]; + protected byte micbit; + protected byte[] padbitsync = new byte[4]; + protected byte micbitsync; + + public PAD(NES parent) + { + nes = parent; + excontroller_select = 0; + expad = null; + bStrobe = false; + bSwapButton = false; + bSwapPlayer = false; + bZapperMode = false; + nVSSwapType = VSType.VS_TYPE0; + + padbit[0] = padbit[1] = padbit[2] = padbit[3] = 0; + micbit = 0; + + padbitsync[0] = padbitsync[1] = padbitsync[2] = padbitsync[3] = 0; + micbitsync = 0; + } + } + + public enum VSType + { + VS_TYPE0 = 0, // SELECT1P=START1P/SELECT2P=START2P 1P/2P No reverse + VS_TYPE1, // SELECT1P=START1P/SELECT2P=START2P 1P/2P Reverse + VS_TYPE2, // SELECT1P=START1P/START1P =START2P 1P/2P No reverse + VS_TYPE3, // SELECT1P=START1P/START1P =START2P 1P/2P Reverse + VS_TYPE4, // SELECT1P=START1P/SELECT2P=START2P 1P/2P No reverse (Protection) + VS_TYPE5, // SELECT1P=START1P/SELECT2P=START2P 1P/2P Reverse (Protection) + VS_TYPE6, // SELECT1P=START1P/SELECT2P=START2P 1P/2P Reverse (For Golf) + VS_TYPEZ, // ZAPPER + } +} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PAD.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PAD.cs.meta new file mode 100644 index 0000000..5186f79 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PAD.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 82d5b1d9eb428ca45838e3a46515044d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs new file mode 100644 index 0000000..dd9e29f --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs @@ -0,0 +1,35 @@ +锘縩amespace VirtualNes.Core +{ + public class PPU + { + private NES m_nes; + private byte[] lpScreen; + private byte[] lpColormode; + private bool bVSMode; + private int nVSColorMap; + private byte VSSecurityData; + private byte[] Bit2Rev = new byte[256]; + public PPU(NES nes) + { + m_nes = nes; + lpScreen = null; + lpColormode = null; + + bVSMode = false; + nVSColorMap = -1; + VSSecurityData = 0; + + for (int i = 0; i < 256; i++) + { + byte m = 0x80; + byte c = 0; + for (int j = 0; j < 8; j++) + { + if ((i & (1 << j)) > 0) c |= m; + m >>= 1; + } + Bit2Rev[i] = c; + } + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs.meta new file mode 100644 index 0000000..69b6056 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PPU.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2a695378c1666b7458e1be6efe468433 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX.meta similarity index 77% rename from AxibugEmuOnline.Client/Assets/MyNes.Core/Support.meta rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX.meta index a57e788..c9a6921 100644 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/Support.meta +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f2c1e2b9170060a4081ad7befba87bc0 +guid: 69e7ee7384266604db7cac0b95c6f836 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX/EXPAD.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX/EXPAD.cs new file mode 100644 index 0000000..38e7a47 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX/EXPAD.cs @@ -0,0 +1,10 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace VirtualNes.Core +{ + public class EXPAD + { + } +} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX/EXPAD.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX/EXPAD.cs.meta new file mode 100644 index 0000000..cd111ca --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/PadEX/EXPAD.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 93b9e4ea918e52a45aab8f87b9dc17c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ROM.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ROM.cs new file mode 100644 index 0000000..be753df --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ROM.cs @@ -0,0 +1,294 @@ +锘縰sing System; +using System.IO; +using System.Linq; +using VirtualNes.Core.Debug; + +namespace VirtualNes.Core +{ + public class ROM + { + protected NESHEADER header; + protected string path; + protected string name; + protected string fullpath; + protected bool bPAL; + protected bool bNSF; + protected int NSF_PAGE_SIZE; + protected byte[] lpPRG; + protected byte[] lpCHR; + protected byte[] lpTrainer; + protected byte[] lpDiskBios; + protected byte[] lpDisk; + protected ulong crc; + protected ulong crcall; + protected int mapper; + protected int diskno; + public ROM(string fname) + { + Stream fp = null; + byte[] temp = null; + byte[] bios = null; + long FileSize = 0; + + header = NESHEADER.GetDefault(); + path = string.Empty; + name = string.Empty; + + bPAL = false; + bNSF = false; + NSF_PAGE_SIZE = 0; + + lpPRG = lpCHR = lpTrainer = lpDiskBios = lpDisk = null; + + crc = crcall = 0; + mapper = 0; + diskno = 0; + + try + { + fp = Supporter.OpenFile(fname); + if (fp == null) + { + throw new System.Exception($"Open Rom Failed:[{fname}]"); + } + + FileSize = fp.Length; + if (FileSize < 17) + { + throw new System.Exception($"File too small:[{fname}]"); + } + + temp = new byte[FileSize]; + fp.Read(temp, 0, temp.Length); + + fp.Dispose(); + + header = NESHEADER.Read(temp); + + if (!header.CheckValid()) + throw new Exception($"rom file is not valid:[{fname}]"); + + ulong PRGoffset, CHRoffset; + long PRGsize, CHRsize; + + var romType = header.GetRomType(); + if (romType == EnumRomType.NES) + { + PRGsize = (long)header.PRG_PAGE_SIZE * 0x4000; + CHRsize = (long)header.CHR_PAGE_SIZE * 0x2000; + PRGoffset = (ulong)NESHEADER.SizeOf(); + CHRoffset = PRGoffset + (ulong)PRGsize; + + if (IsTRAINER()) + { + PRGoffset += 512; + CHRoffset += 512; + } + + if (PRGsize <= 0 || (PRGsize + CHRsize) > FileSize) + { + // NES鍍垮儮鍍熷亼鍫庡竣鍋卞仭 + throw new Exception($"Invalid NesHeader:[{fname}]"); + } + + //PRG BANK + lpPRG = new byte[PRGsize]; + Array.Copy(temp, (int)PRGoffset, lpPRG, 0, PRGsize); + + //CHR BANK + if (CHRsize > 0) + { + lpCHR = new byte[CHRsize]; + if (FileSize >= (long)CHRoffset + CHRsize) + { + Array.Copy(temp, (int)CHRoffset, lpCHR, 0, CHRsize); + } + else + { + //CHR Bank澶皯... + CHRsize -= ((long)CHRoffset + CHRsize - FileSize); + Array.Copy(temp, (int)CHRoffset, lpCHR, 0, CHRsize); + } + } + else + { + lpCHR = null; + } + + if (IsTRAINER()) + { + lpTrainer = new byte[512]; + Array.Copy(temp, NESHEADER.SizeOf(), lpTrainer, 0, 512); + } + else + { + lpTrainer = null; + } + } + else if (romType == EnumRomType.FDS) + { + diskno = header.PRG_PAGE_SIZE; + + if (FileSize < (16 + 65500 * diskno)) + { + throw new Exception($"Illegal Disk Size:[{fname}]"); + } + if (diskno > 8) + { + throw new Exception($"Unsupport disk:[{fname}]"); + } + + header = NESHEADER.GetDefault(); + header.ID[0] = (byte)'N'; + header.ID[1] = (byte)'E'; + header.ID[2] = (byte)'S'; + header.ID[3] = 0x1A; + header.PRG_PAGE_SIZE = (byte)(diskno * 4); + header.CHR_PAGE_SIZE = 0; + header.control1 = 0x40; + header.control2 = 0x10; + + PRGsize = NESHEADER.SizeOf() + 65500 * diskno; + //PRG BANK + lpPRG = new byte[PRGsize]; + lpDisk = new byte[PRGsize]; + lpCHR = null; + + var headerBuffer = header.DataToBytes(); + Array.Copy(headerBuffer, lpPRG, headerBuffer.Length); + Array.Copy(temp, NESHEADER.SizeOf(), lpPRG, NESHEADER.SizeOf(), 65500 * diskno); + + lpPRG[0] = (byte)'F'; + lpPRG[1] = (byte)'D'; + lpPRG[2] = (byte)'S'; + lpPRG[3] = 0x1A; + lpPRG[4] = (byte)diskno; + + fp = Supporter.OpenFile("DISKSYS.ROM"); + if (fp == null) + { + throw new Exception($"Not found DISKSYS.ROM for [{fname}]"); + } + + FileSize = fp.Length; + if (FileSize < 17) + { + throw new Exception($"Small File Of DISKSYS.ROM"); + } + + bios = new byte[FileSize]; + fp.Read(bios, 0, (int)FileSize); + fp.Dispose(); + + lpDiskBios = new byte[8 * 1024]; + if (bios[0] == 'N' && bios[1] == 'E' && bios[2] == 'S' && bios[3] == 0x1A) + { + + } + } + } + catch + { + + } + } + + public bool IsTRAINER() + { + return (header.control1 & (byte)EnumRomControlByte1.ROM_TRAINER) > 0; + } + } + + public enum EnumRomControlByte1 : byte + { + ROM_VMIRROR = 0x01, + ROM_SAVERAM = 0x02, + ROM_TRAINER = 0x04, + ROM_4SCREEN = 0x08, + } + + public enum EnumRomType + { + InValid, + NES, + ///

Nintendo Disk System + FDS, + NSF + } + + public struct NESHEADER + { + public byte[] ID; + public byte PRG_PAGE_SIZE; + public byte CHR_PAGE_SIZE; + public byte control1; + public byte control2; + public byte[] reserved; + + public bool CheckValid() + { + return GetRomType() != EnumRomType.InValid; + } + + public static int SizeOf() + { + return 16; + } + + public EnumRomType GetRomType() + { + if (ID[0] == 'N' && ID[1] == 'E' && ID[2] == 'S' && ID[3] == 0x1A) + return EnumRomType.NES; + if (ID[0] == 'F' && ID[1] == 'D' && ID[2] == 'S' && ID[3] == 0x1A) + return EnumRomType.FDS; + if (ID[0] == 'N' && ID[1] == 'E' && ID[2] == 'S' && ID[3] == 'M') + return EnumRomType.NSF; + + return EnumRomType.InValid; + } + + public static NESHEADER GetDefault() + { + var res = new NESHEADER(); + res.ID = new byte[4]; + res.reserved = new byte[8]; + return res; + } + + public static NESHEADER Read(Span data) + { + var res = new NESHEADER(); + res.ID = data.Slice(0, 4).ToArray(); + res.PRG_PAGE_SIZE = data[4]; + res.CHR_PAGE_SIZE = data[5]; + res.control1 = data[6]; + res.control2 = data[7]; + res.reserved = data.Slice(8, 8).ToArray(); + + return res; + } + + public byte[] DataToBytes() + { + byte[] res = new byte[16]; + res[0] = ID[0]; + res[1] = ID[1]; + res[2] = ID[2]; + res[3] = ID[3]; + res[4] = PRG_PAGE_SIZE; + res[5] = CHR_PAGE_SIZE; + res[6] = control1; + res[7] = control2; + res[8] = reserved[0]; + res[9] = reserved[1]; + res[10] = reserved[2]; + res[11] = reserved[3]; + res[12] = reserved[4]; + res[13] = reserved[5]; + res[14] = reserved[6]; + res[15] = reserved[7]; + + return res; + } + } +} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ROM.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ROM.cs.meta new file mode 100644 index 0000000..3f79db9 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/ROM.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 391d943ceba1fa0459c3991e11bd3921 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter.meta new file mode 100644 index 0000000..1120450 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 78036d3e96a27e441b4989bb8ec174e9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter/Supporter.cs b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter/Supporter.cs new file mode 100644 index 0000000..a4ae83d --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter/Supporter.cs @@ -0,0 +1,26 @@ +using System.Collections; +using System.Collections.Generic; +using System.IO; +using UnityEngine; + +namespace VirtualNes.Core +{ + public static class Supporter + { + private static ISupporterImpl s_support; + public static void Setup(ISupporterImpl supporter) + { + s_support = supporter; + } + + public static Stream OpenFile(string fname) + { + return s_support.OpenFile(fname); + } + } + + public interface ISupporterImpl + { + Stream OpenFile(string fname); + } +} diff --git a/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter/Supporter.cs.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter/Supporter.cs.meta new file mode 100644 index 0000000..7f64c93 --- /dev/null +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/Supporter/Supporter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ebaf8e516ae82d647bb19ffff17fd03d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNes.Core.asmdef b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/VirtualNes.Core.asmdef similarity index 68% rename from AxibugEmuOnline.Client/Assets/MyNes.Core/MyNes.Core.asmdef rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core/VirtualNes.Core.asmdef index 4637f1d..49a4484 100644 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNes.Core.asmdef +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/VirtualNes.Core.asmdef @@ -1,9 +1,7 @@ { - "name": "MyNes.Core", - "rootNamespace": "", - "references": [ - "GUID:1c66728ad60364b82bf095d383b87458" - ], + "name": "VirtualNes.Core", + "rootNamespace": "VirtualNes.Core", + "references": [], "includePlatforms": [], "excludePlatforms": [], "allowUnsafeCode": false, diff --git a/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNes.Core.asmdef.meta b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/VirtualNes.Core.asmdef.meta similarity index 76% rename from AxibugEmuOnline.Client/Assets/MyNes.Core/MyNes.Core.asmdef.meta rename to AxibugEmuOnline.Client/Assets/VirtualNes.Core/VirtualNes.Core.asmdef.meta index 0ab097f..9892237 100644 --- a/AxibugEmuOnline.Client/Assets/MyNes.Core/MyNes.Core.asmdef.meta +++ b/AxibugEmuOnline.Client/Assets/VirtualNes.Core/VirtualNes.Core.asmdef.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 0c194730510bd1b4fad0398ccfe4235b +guid: 390a2c4058e5c304a87e8be70c84d80b AssemblyDefinitionImporter: externalObjects: {} userData:

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%0DOQ))U+wF31NS7nrMZCPd2 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